From f443e02fee7a33da00797607cfa511a17ad89062 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 May 2024 19:08:28 -0700 Subject: [PATCH 001/722] Fix code interpreter --- js/package.json | 4 ++-- js/src/code-interpreter.ts | 4 ++-- pnpm-lock.yaml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/js/package.json b/js/package.json index d9212b83..2ffd63df 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.4", + "version": "0.0.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -60,7 +60,7 @@ "vm" ], "dependencies": { - "e2b": "^0.16.0", + "e2b": "^0.16.1", "isomorphic-ws": "^5.0.0", "ws": "^8.15.1" }, diff --git a/js/src/code-interpreter.ts b/js/src/code-interpreter.ts index d93b9dff..1270ad96 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/code-interpreter.ts @@ -19,8 +19,8 @@ export class CodeInterpreter extends Sandbox { readonly notebook = new JupyterExtension(this) - constructor(opts?: SandboxOpts) { - super({ template: opts?.template || CodeInterpreter.template, ...opts }) + constructor(opts?: SandboxOpts, createCalled = false) { + super({ template: opts?.template || CodeInterpreter.template, ...opts }, createCalled) } override async _open(opts?: { timeout?: number }) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 782823ff..1c66e586 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: ^0.16.0 - version: 0.16.0 + specifier: ^0.16.1 + version: 0.16.1 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.16.0) @@ -2128,8 +2128,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.0: - resolution: {integrity: sha512-ZPZ9tmbTduX8HVDKTVoA87vhZ9xIL3AZ3m1poh+9yErcF87GJuOJm6o4ZUrup8kP1rV2simWK7IMZMg/0U3pPQ==} + /e2b@0.16.1: + resolution: {integrity: sha512-2L1R/REEB+EezD4Q4MmcXXNATjvCYov2lv/69+PY6V95+wl1PZblIMTYAe7USxX6P6sqANxNs+kXqZr6RvXkSw==} engines: {node: '>=18'} dependencies: isomorphic-ws: 5.0.0(ws@8.16.0) From baba69e4c1c527d76337a8f2acd5638c3bcb92a8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 May 2024 19:10:26 -0700 Subject: [PATCH 002/722] Add changeset --- .changeset/thin-timers-cheer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/thin-timers-cheer.md diff --git a/.changeset/thin-timers-cheer.md b/.changeset/thin-timers-cheer.md new file mode 100644 index 00000000..903d2a71 --- /dev/null +++ b/.changeset/thin-timers-cheer.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter": major +--- + +Fix inicialization of code interpreter From 5393a493dd3cdb1630fb880bd09b19a73e1a5177 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 May 2024 02:17:52 +0000 Subject: [PATCH 003/722] [skip ci] Release new versions --- .changeset/thin-timers-cheer.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/thin-timers-cheer.md diff --git a/.changeset/thin-timers-cheer.md b/.changeset/thin-timers-cheer.md deleted file mode 100644 index 903d2a71..00000000 --- a/.changeset/thin-timers-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter": major ---- - -Fix inicialization of code interpreter diff --git a/js/package.json b/js/package.json index 2ffd63df..8c370c9d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.2", + "version": "1.0.0", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From ed6e9c7c4b4c4744a53c31ca0bacbaeb63bd7319 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 May 2024 19:38:00 -0700 Subject: [PATCH 004/722] Fix changeset --- .changeset/thin-timers-cheer.md | 5 +++++ js/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/thin-timers-cheer.md diff --git a/.changeset/thin-timers-cheer.md b/.changeset/thin-timers-cheer.md new file mode 100644 index 00000000..25bed004 --- /dev/null +++ b/.changeset/thin-timers-cheer.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter": patch +--- + +Fix initialization of code interpreter diff --git a/js/package.json b/js/package.json index 8c370c9d..2ffd63df 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.0", + "version": "0.0.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From 870a629b2e3e32ff85f1f7a7ff7c5c26e24de0b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 May 2024 02:40:46 +0000 Subject: [PATCH 005/722] [skip ci] Release new versions --- .changeset/thin-timers-cheer.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/thin-timers-cheer.md diff --git a/.changeset/thin-timers-cheer.md b/.changeset/thin-timers-cheer.md deleted file mode 100644 index 25bed004..00000000 --- a/.changeset/thin-timers-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter": patch ---- - -Fix initialization of code interpreter diff --git a/js/package.json b/js/package.json index 2ffd63df..52688c76 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.2", + "version": "0.0.3", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From 37f6985e045a00f46d3094598c9f4268ec36a81a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 May 2024 20:23:58 -0700 Subject: [PATCH 006/722] Fix JS SDK version --- .changeset/perfect-grapes-smash.md | 5 +++++ js/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/perfect-grapes-smash.md diff --git a/.changeset/perfect-grapes-smash.md b/.changeset/perfect-grapes-smash.md new file mode 100644 index 00000000..aa45e848 --- /dev/null +++ b/.changeset/perfect-grapes-smash.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter": patch +--- + +Release new version diff --git a/js/package.json b/js/package.json index 52688c76..7905803d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.3", + "version": "0.0.4", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From 911028dbaa11a90cfd7dc399ae774daecd08188c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 May 2024 03:26:54 +0000 Subject: [PATCH 007/722] [skip ci] Release new versions --- .changeset/perfect-grapes-smash.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/perfect-grapes-smash.md diff --git a/.changeset/perfect-grapes-smash.md b/.changeset/perfect-grapes-smash.md deleted file mode 100644 index aa45e848..00000000 --- a/.changeset/perfect-grapes-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter": patch ---- - -Release new version diff --git a/js/package.json b/js/package.json index 7905803d..1331432b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.4", + "version": "0.0.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From a3eaf42ef460c46d4ad58bc1fab7ab2cfd2fea42 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 14 May 2024 16:40:44 -0700 Subject: [PATCH 008/722] Fix problem with running multiple code interpreters at the same time --- python/e2b_code_interpreter/main.py | 4 +-- python/e2b_code_interpreter/messaging.py | 38 ++++++++++-------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 388761a4..4ba9a812 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -52,13 +52,13 @@ def __init__( class JupyterExtension: - _default_kernel_id: Optional[str] = None - _connected_kernels: Dict[str, Future[JupyterKernelWebSocket]] = {} def __init__(self, sandbox: CodeInterpreter, timeout: Optional[float] = TIMEOUT): self._sandbox = sandbox self._kernel_id_set = Future() self._start_connecting_to_default_kernel(timeout=timeout) + self._connected_kernels: Dict[str, Future[JupyterKernelWebSocket]] = {} + self._default_kernel_id: Optional[str] = None def exec_cell( self, diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index 7f0861d1..be369aa3 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -43,30 +43,29 @@ def __init__( self.on_result = on_result -class JupyterKernelWebSocket(BaseModel): - model_config = ConfigDict(arbitrary_types_allowed=True) +class JupyterKernelWebSocket: - url: str - - _cells: Dict[str, CellExecution] = {} - _waiting_for_replies: Dict[str, DeferredFuture] = PrivateAttr(default_factory=dict) - _queue_in: Queue = PrivateAttr(default_factory=Queue) - _queue_out: Queue = PrivateAttr(default_factory=Queue) - _process_cleanup: List[Callable[[], Any]] = PrivateAttr(default_factory=list) - _closed: bool = PrivateAttr(default=False) + def __init__(self, url: str): + self.url = url + self._cells: Dict[str, CellExecution] = {} + self._waiting_for_replies: Dict[str, DeferredFuture] = {} + self._queue_in = Queue() + self._queue_out = Queue() + self._stopped = threading.Event() def process_messages(self): - while True: - data = self._queue_out.get() + while not self._stopped.is_set(): + if self._queue_out.empty(): + time.sleep(0.01) + continue + data = self._queue_out.get() logger.debug(f"WebSocket received message: {data}".strip()) self._receive_message(json.loads(data)) self._queue_out.task_done() def connect(self, timeout: float = TIMEOUT): started = threading.Event() - stopped = threading.Event() - self._process_cleanup.append(stopped.set) threading.Thread( target=self.process_messages, daemon=True, name="e2b-process-messages" @@ -78,7 +77,7 @@ def connect(self, timeout: float = TIMEOUT): queue_in=self._queue_in, queue_out=self._queue_out, started=started, - stopped=stopped, + stopped=self._stopped ).run, daemon=True, name="e2b-code-interpreter-websocket", @@ -91,7 +90,7 @@ def connect(self, timeout: float = TIMEOUT): while ( not started.is_set() and time.time() - start_time < timeout - and not self._closed + and not self._stopped.is_set() ): time.sleep(0.1) @@ -245,12 +244,7 @@ def _receive_message(self, data: dict): def close(self): logger.debug("Closing WebSocket") - self._closed = True - - for cancel in self._process_cleanup: - cancel() - - self._process_cleanup.clear() + self._stopped.set() for handler in self._waiting_for_replies.values(): logger.debug(f"Cancelling waiting for execution result for {handler}") From 4a53ff1ef5974aadde2689e46beffb0263ffd321 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 14 May 2024 16:45:00 -0700 Subject: [PATCH 009/722] Add changeset --- .changeset/slow-trains-pay.md | 5 +++++ python/e2b_code_interpreter/messaging.py | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/slow-trains-pay.md diff --git a/.changeset/slow-trains-pay.md b/.changeset/slow-trains-pay.md new file mode 100644 index 00000000..2874a899 --- /dev/null +++ b/.changeset/slow-trains-pay.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter-python": patch +--- + +Fix problem with running multiple code interpreters at the same time diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index be369aa3..8bd6e737 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -5,14 +5,13 @@ import uuid from concurrent.futures import Future from queue import Queue -from typing import Callable, Dict, List, Any, Optional +from typing import Callable, Dict, Any, Optional from e2b import ProcessMessage from e2b.constants import TIMEOUT from e2b.sandbox import TimeoutException from e2b.sandbox.websocket_client import WebSocket from e2b.utils.future import DeferredFuture -from pydantic import ConfigDict, PrivateAttr, BaseModel from e2b_code_interpreter.models import Execution, Result, Error From c1d86cda6d84e748bde6141f5299e3abbc160dc6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 14 May 2024 16:45:20 -0700 Subject: [PATCH 010/722] Fix version --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index d1e41ead..befc508e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.5" +version = "0.0.6" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 89c3bf98310ea8f983350696c863159d946c4386 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 May 2024 23:49:29 +0000 Subject: [PATCH 011/722] [skip ci] Release new versions --- .changeset/slow-trains-pay.md | 5 ----- python/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/slow-trains-pay.md diff --git a/.changeset/slow-trains-pay.md b/.changeset/slow-trains-pay.md deleted file mode 100644 index 2874a899..00000000 --- a/.changeset/slow-trains-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter-python": patch ---- - -Fix problem with running multiple code interpreters at the same time diff --git a/python/package.json b/python/package.json index f0ab4b90..d34bda14 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.5", + "version": "0.0.6", "scripts": { "test": "poetry run pytest -n 1 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", From d9c22d136efc486b4a99b20be1f63c61b0271d52 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 23 May 2024 11:14:22 +0200 Subject: [PATCH 012/722] Fix path when creating a new kernel --- .changeset/khaki-ghosts-train.md | 6 ++++++ js/src/code-interpreter.ts | 4 ++-- python/e2b_code_interpreter/main.py | 2 +- python/example.py | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .changeset/khaki-ghosts-train.md diff --git a/.changeset/khaki-ghosts-train.md b/.changeset/khaki-ghosts-train.md new file mode 100644 index 00000000..d36f58d6 --- /dev/null +++ b/.changeset/khaki-ghosts-train.md @@ -0,0 +1,6 @@ +--- +"@e2b/code-interpreter-python": patch +"@e2b/code-interpreter": patch +--- + +Fix path when creating new kernel diff --git a/js/src/code-interpreter.ts b/js/src/code-interpreter.ts index 1270ad96..0582102b 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/code-interpreter.ts @@ -7,7 +7,7 @@ interface Kernels { } export interface CreateKernelProps { - cwd: string + path: string kernelName?: string } @@ -147,7 +147,7 @@ export class JupyterExtension { cwd: string = '/home/user', kernelName?: string ): Promise { - const data: CreateKernelProps = { cwd } + const data: CreateKernelProps = { path: cwd } if (kernelName) { data.kernelName = kernelName } diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 4ba9a812..3a010664 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -139,7 +139,7 @@ def create_kernel( :param timeout: Timeout for the kernel creation request. :return: Kernel id of the created kernel """ - data = {"cwd": cwd} + data = {"path": cwd} if kernel_name: data["kernel_name"] = kernel_name logger.debug(f"Creating kernel with data: {data}") diff --git a/python/example.py b/python/example.py index bd31bdd4..00319225 100644 --- a/python/example.py +++ b/python/example.py @@ -26,5 +26,5 @@ with CodeInterpreter() as sandbox: result = sandbox.notebook.exec_cell(code) -print(result.result.formats()) -print(len(result.display_data)) +print(result.results[0].formats()) +print(len(result.results)) From 2f1bb5e26fd115ef08c7fe03af13e63a4cdd8a1b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 May 2024 09:17:37 +0000 Subject: [PATCH 013/722] [skip ci] Release new versions --- .changeset/khaki-ghosts-train.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/khaki-ghosts-train.md diff --git a/.changeset/khaki-ghosts-train.md b/.changeset/khaki-ghosts-train.md deleted file mode 100644 index d36f58d6..00000000 --- a/.changeset/khaki-ghosts-train.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@e2b/code-interpreter-python": patch -"@e2b/code-interpreter": patch ---- - -Fix path when creating new kernel diff --git a/js/package.json b/js/package.json index 1331432b..bdf36a6e 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.5", + "version": "0.0.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/package.json b/python/package.json index d34bda14..36a0fe3a 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.6", + "version": "0.0.7", "scripts": { "test": "poetry run pytest -n 1 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", diff --git a/python/pyproject.toml b/python/pyproject.toml index befc508e..bf736c1c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.6" +version = "0.0.7" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 957c5168129682d340555ed79704cb4680d11bf2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 14 May 2024 21:09:58 -0700 Subject: [PATCH 014/722] Move start cmd to envd --- python/e2b_code_interpreter/main.py | 10 ++++++---- python/example.py | 6 +++--- template/e2b.Dockerfile | 13 +++++++------ template/e2b.toml | 2 +- template/jupyter_server_config.py | 5 +++++ template/start-up.sh | 13 +++++-------- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 3a010664..a2ded148 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json import logging import threading import requests @@ -276,13 +277,14 @@ def _start_connecting_to_default_kernel( logger.debug("Starting to connect to the default kernel") def setup_default_kernel(): - kernel_id = self._sandbox.filesystem.read( - "/root/.jupyter/kernel_id", timeout=timeout + session_info = self._sandbox.filesystem.read( + "/root/.jupyter/.session_info", timeout=timeout ) - if kernel_id is None and not self._sandbox.is_open: + if session_info is None and not self._sandbox.is_open: return - kernel_id = kernel_id.strip() + session_info = json.loads(session_info) + kernel_id = session_info['kernel']['id'] logger.debug(f"Default kernel id: {kernel_id}") self._connect_to_kernel_ws(kernel_id, timeout=timeout) self._kernel_id_set.set_result(kernel_id) diff --git a/python/example.py b/python/example.py index 00319225..b060eb8d 100644 --- a/python/example.py +++ b/python/example.py @@ -24,7 +24,7 @@ """ with CodeInterpreter() as sandbox: - result = sandbox.notebook.exec_cell(code) + execution = sandbox.notebook.exec_cell(code) -print(result.results[0].formats()) -print(len(result.results)) +print(execution.results[0].formats()) +print(len(execution.results)) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 071592ad..39c82e62 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -6,15 +6,16 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-ins ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_NO_CACHE_DIR=1 \ - JUPYTER_CONFIG_PATH="/home/user/.jupyter" + JUPYTER_CONFIG_PATH="/root/.jupyter" \ + IPYTHON_CONFIG_PATH="/root/.ipython" COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user -COPY ./jupyter_server_config.py /home/user/.jupyter/ +COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ -RUN mkdir -p /home/user/.ipython/profile_default -COPY ipython_kernel_config.py /home/user/.ipython/profile_default/ +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default +COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ -COPY ./start-up.sh /home/user/.jupyter/ -RUN chmod +x /home/user/.jupyter/start-up.sh \ No newline at end of file +COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ +RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/e2b.toml b/template/e2b.toml index f2a59693..03d45b92 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -10,7 +10,7 @@ # const sandbox = await Sandbox.create({ template: 'code-interpreter-stateful' }) memory_mb = 1_024 -start_cmd = "/home/user/.jupyter/start-up.sh" +start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" template_name = "code-interpreter-stateful" template_id = "1tsfj5yvigmgc5gmgqz2" diff --git a/template/jupyter_server_config.py b/template/jupyter_server_config.py index 379aa631..a414d1d7 100644 --- a/template/jupyter_server_config.py +++ b/template/jupyter_server_config.py @@ -41,3 +41,8 @@ # with the full knowledge of what that implies. # Default: False c.ServerApp.disable_check_xsrf = True + +# Whether to allow the user to run the server as root. +# Default: False +c.ServerApp.allow_root = True + diff --git a/template/start-up.sh b/template/start-up.sh index 7a98ff6b..d8907b53 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -1,26 +1,23 @@ #!/bin/bash function start_jupyter_server() { - response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api") + response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") while [[ ${response} -ne 200 ]]; do echo "Waiting for Jupyter Server to start..." - response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api") + response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done echo "Jupyter Server started" - response=$(curl -s -X POST "localhost:8888/api/kernels" -H "Content-Type: application/json" -d '{"path": "/home/user"}') - status=$(echo "${response}" | jq -r '.execution_state') + response=$(curl -s -X POST "localhost:8888/api/sessions" -H "Content-Type: application/json" -d '{"path": "/home/user", "kernel": {"name": "python3"}, "type": "notebook", "name": "default"}') + status=$(echo "${response}" | jq -r '.kernel.execution_state') if [[ ${status} != "starting" ]]; then echo "Error creating kernel: ${response} ${status}" exit 1 fi echo "Kernel created" - kernel=$(echo "${response}" | jq -r '.id') - sudo mkdir -p /root/.jupyter - - sudo echo "${kernel}" | sudo tee /root/.jupyter/kernel_id >/dev/null + sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" } From d7c6bd1bbcc8b04971f623084cc25228803df334 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 14 May 2024 21:12:29 -0700 Subject: [PATCH 015/722] Adjust JS SDK as well --- js/src/code-interpreter.ts | 8 +++++--- python/e2b_code_interpreter/main.py | 2 +- python/e2b_code_interpreter/models.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/js/src/code-interpreter.ts b/js/src/code-interpreter.ts index 0582102b..298e5014 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/code-interpreter.ts @@ -101,9 +101,11 @@ export class JupyterExtension { resolve: (value: string) => void, opts?: { timeout?: number } ) { - const kernelID = ( - await this.sandbox.filesystem.read('/root/.jupyter/kernel_id', opts) - ).trim() + const sessionInfo = ( + await this.sandbox.filesystem.read('/root/.jupyter/.session_info', opts) + ) + const parsedSessionInfo = JSON.parse(sessionInfo) + const kernelID = parsedSessionInfo.kernel.id await this.connectToKernelWS(kernelID) resolve(kernelID) } diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index a2ded148..c65475af 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -284,7 +284,7 @@ def setup_default_kernel(): return session_info = json.loads(session_info) - kernel_id = session_info['kernel']['id'] + kernel_id = session_info["kernel"]["id"] logger.debug(f"Default kernel id: {kernel_id}") self._connect_to_kernel_ws(kernel_id, timeout=timeout) self._kernel_id_set.set_result(kernel_id) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index b9953eba..0a721c29 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -249,7 +249,7 @@ def serialize_results(results: List[Result]) -> List[Dict[str, str]]: serialized = [] for result in results: serialized_dict = {key: result[key] for key in result.formats()} - serialized_dict['text'] = result.text + serialized_dict["text"] = result.text serialized.append(serialized_dict) return serialized From 392aa9a8b8c2c539ebd676da07a5808c66f8217c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 30 May 2024 13:30:00 +0200 Subject: [PATCH 016/722] Clean up start script logs --- template/start-up.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/template/start-up.sh b/template/start-up.sh index d8907b53..65c7b69f 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -1,9 +1,15 @@ #!/bin/bash function start_jupyter_server() { + counter=0 response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") while [[ ${response} -ne 200 ]]; do - echo "Waiting for Jupyter Server to start..." + let counter++ + if (( counter % 20 == 0 )); then + echo "Waiting for Jupyter Server to start..." + sleep 0.1 + fi + response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done echo "Jupyter Server started" From e0b69272acb7cae26ac42232402b02d24088f1e6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 May 2024 11:50:18 +0200 Subject: [PATCH 017/722] Make it backward compatible + add execution count --- js/src/code-interpreter.ts | 34 ++++++++++---------- js/src/messaging.ts | 14 ++++++--- js/tests/executionCount.test.ts | 15 +++++++++ python/e2b_code_interpreter/main.py | 40 +++++++++++++----------- python/e2b_code_interpreter/messaging.py | 12 ++++--- python/e2b_code_interpreter/models.py | 2 ++ python/example.py | 1 + python/tests/test_execution_count.py | 12 +++++++ template/start-up.sh | 2 ++ 9 files changed, 86 insertions(+), 46 deletions(-) create mode 100644 js/tests/executionCount.test.ts create mode 100644 python/tests/test_execution_count.py diff --git a/js/src/code-interpreter.ts b/js/src/code-interpreter.ts index 298e5014..6936320f 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/code-interpreter.ts @@ -1,16 +1,11 @@ import { ProcessMessage, Sandbox, SandboxOpts } from 'e2b' import { Result, JupyterKernelWebSocket, Execution } from './messaging' -import { createDeferredPromise } from './utils' +import { createDeferredPromise, id } from './utils' interface Kernels { [kernelID: string]: JupyterKernelWebSocket } -export interface CreateKernelProps { - path: string - kernelName?: string -} - /** * E2B code interpreter sandbox extension. */ @@ -101,11 +96,9 @@ export class JupyterExtension { resolve: (value: string) => void, opts?: { timeout?: number } ) { - const sessionInfo = ( - await this.sandbox.filesystem.read('/root/.jupyter/.session_info', opts) - ) - const parsedSessionInfo = JSON.parse(sessionInfo) - const kernelID = parsedSessionInfo.kernel.id + const kernelID = ( + await this.sandbox.filesystem.read('/root/.jupyter/kernel_id', opts) + ).trim() await this.connectToKernelWS(kernelID) resolve(kernelID) } @@ -119,13 +112,16 @@ export class JupyterExtension { * the retrieval of the necessary WebSocket URL from the kernel's information. * * @param kernelID The unique identifier of the kernel to connect to. + * @param sessionID The unique identifier of the session to connect to. * @throws {Error} Throws an error if the connection to the kernel's WebSocket cannot be established. */ - private async connectToKernelWS(kernelID: string) { + private async connectToKernelWS(kernelID: string, sessionID?: string) { const url = `${this.sandbox.getProtocol('ws')}://${this.sandbox.getHostname( 8888 )}/api/kernels/${kernelID}/channels` - const ws = new JupyterKernelWebSocket(url) + + sessionID = sessionID || id(16) + const ws = new JupyterKernelWebSocket(url, sessionID) await ws.connect() this.connectedKernels[kernelID] = ws @@ -149,15 +145,15 @@ export class JupyterExtension { cwd: string = '/home/user', kernelName?: string ): Promise { - const data: CreateKernelProps = { path: cwd } + const data = { path: cwd, kernel: {name: "python3"}, type: "notebook", name: id(16) } if (kernelName) { - data.kernelName = kernelName + data.kernel.name = kernelName } const response = await fetch( `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( 8888 - )}/api/kernels`, + )}/api/sessions`, { method: 'POST', body: JSON.stringify(data) @@ -168,8 +164,10 @@ export class JupyterExtension { throw new Error(`Failed to create kernel: ${response.statusText}`) } - const kernelID = (await response.json()).id - await this.connectToKernelWS(kernelID) + const sessionInfo = await response.json() + const kernelID = sessionInfo.kernel.id + await this.connectToKernelWS(kernelID, sessionInfo.id) + return kernelID } diff --git a/js/src/messaging.ts b/js/src/messaging.ts index fbe9b8b4..05626145 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -226,7 +226,11 @@ export class Execution { /** * An Error object if an error occurred, null otherwise. */ - public error?: ExecutionError + public error?: ExecutionError, + /** + * Execution count of the cell. + */ + public executionCount?: number ) { } /** @@ -305,7 +309,7 @@ export class JupyterKernelWebSocket { * Does not start WebSocket connection! * You need to call connect() method first. */ - constructor(private readonly url: string) { } + constructor(private readonly url: string, private readonly sessionID: string) { } // public /** @@ -401,6 +405,7 @@ export class JupyterKernelWebSocket { } } else if (message.msg_type == 'execute_input') { cell.inputAccepted = true + cell.execution.executionCount = message.content.execution_count } else { console.warn('[UNHANDLED MESSAGE TYPE]:', message.msg_type) } @@ -486,12 +491,11 @@ export class JupyterKernelWebSocket { * @param code Code to be executed. */ private sendExecuteRequest(msg_id: string, code: string) { - const session = id(16) return { header: { msg_id: msg_id, username: 'e2b', - session: session, + session: this.sessionID, msg_type: 'execute_request', version: '5.3' }, @@ -500,7 +504,7 @@ export class JupyterKernelWebSocket { content: { code: code, silent: false, - store_history: false, + store_history: true, user_expressions: {}, allow_stdin: false } diff --git a/js/tests/executionCount.test.ts b/js/tests/executionCount.test.ts new file mode 100644 index 00000000..c6c25943 --- /dev/null +++ b/js/tests/executionCount.test.ts @@ -0,0 +1,15 @@ +import { CodeInterpreter } from '../src' + +import { expect, test } from 'vitest' + +test('execution count', async () => { + const sandbox = await CodeInterpreter.create() + + await sandbox.notebook.execCell('!pwd') + const result = await sandbox.notebook.execCell('!pwd') + + + await sandbox.close() + + expect(result.executionCount).toEqual(2) +}) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index c65475af..3a701e1c 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -1,8 +1,9 @@ from __future__ import annotations -import json import logging import threading +import uuid + import requests from concurrent.futures import Future @@ -94,14 +95,14 @@ def exec_cell( logger.debug(f"Creating new websocket connection to kernel {kernel_id}") ws = self._connect_to_kernel_ws(kernel_id, timeout=timeout) - session_id = ws.send_execution_message(code, on_stdout, on_stderr, on_result) + message_id = ws.send_execution_message(code, on_stdout, on_stderr, on_result) logger.debug( - f"Sent execution message to kernel {kernel_id}, session_id: {session_id}" + f"Sent execution message to kernel {kernel_id}, message_id: {message_id}" ) - result = ws.get_result(session_id, timeout=timeout) + result = ws.get_result(message_id, timeout=timeout) logger.debug( - f"Received result from kernel {kernel_id}, session_id: {session_id}, result: {result}" + f"Received result from kernel {kernel_id}, message_id: {message_id}, result: {result}" ) return result @@ -140,24 +141,26 @@ def create_kernel( :param timeout: Timeout for the kernel creation request. :return: Kernel id of the created kernel """ - data = {"path": cwd} + data = {"path": cwd, "kernel": {"name": "python3"}, "type": "notebook", "name": str(uuid.uuid4())} if kernel_name: - data["kernel_name"] = kernel_name + data["kernel"]['name'] = kernel_name logger.debug(f"Creating kernel with data: {data}") response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/sessions", json=data, timeout=timeout, ) if not response.ok: raise KernelException(f"Failed to create kernel: {response.text}") - kernel_id = response.json()["id"] + session_data = response.json() + kernel_id = session_data["kernel"]["id"] + session_id = session_data["id"] logger.debug(f"Created kernel {kernel_id}") threading.Thread( - target=self._connect_to_kernel_ws, args=(kernel_id, timeout) + target=self._connect_to_kernel_ws, args=(kernel_id, session_id, timeout) ).start() return kernel_id @@ -244,7 +247,7 @@ def close(self): ws.result().close() def _connect_to_kernel_ws( - self, kernel_id: str, timeout: Optional[float] = TIMEOUT + self, kernel_id: str, session_id: Optional[str], timeout: Optional[float] = TIMEOUT ) -> JupyterKernelWebSocket: """ Establishes a WebSocket connection to a specified Jupyter kernel. @@ -258,9 +261,13 @@ def _connect_to_kernel_ws( future = Future() self._connected_kernels[kernel_id] = future + print(session_id) + session_id = session_id or str(uuid.uuid4()) ws = JupyterKernelWebSocket( url=f"{self._sandbox.get_protocol('ws')}://{self._sandbox.get_hostname(8888)}/api/kernels/{kernel_id}/channels", + session_id=session_id ) + ws.connect(timeout=timeout) logger.debug(f"Connected to kernel's ({kernel_id}) websocket.") @@ -277,16 +284,13 @@ def _start_connecting_to_default_kernel( logger.debug("Starting to connect to the default kernel") def setup_default_kernel(): - session_info = self._sandbox.filesystem.read( - "/root/.jupyter/.session_info", timeout=timeout + kernel_id = self._sandbox.filesystem.read( + "/root/.jupyter/kernel_id", timeout=timeout ) - if session_info is None and not self._sandbox.is_open: - return + kernel_id = kernel_id.strip() - session_info = json.loads(session_info) - kernel_id = session_info["kernel"]["id"] logger.debug(f"Default kernel id: {kernel_id}") - self._connect_to_kernel_ws(kernel_id, timeout=timeout) + self._connect_to_kernel_ws(kernel_id, None, timeout=timeout) self._kernel_id_set.set_result(kernel_id) threading.Thread(target=setup_default_kernel).start() diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index 8bd6e737..dc56a2b1 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -25,6 +25,7 @@ class CellExecution: """ input_accepted: bool = False + on_stdout: Optional[Callable[[ProcessMessage], Any]] = None on_stderr: Optional[Callable[[ProcessMessage], Any]] = None on_result: Optional[Callable[[Result], Any]] = None @@ -44,8 +45,9 @@ def __init__( class JupyterKernelWebSocket: - def __init__(self, url: str): + def __init__(self, url: str, session_id: str): self.url = url + self.session_id = session_id self._cells: Dict[str, CellExecution] = {} self._waiting_for_replies: Dict[str, DeferredFuture] = {} self._queue_in = Queue() @@ -101,14 +103,13 @@ def connect(self, timeout: float = TIMEOUT): logger.debug("WebSocket started") - @staticmethod - def _get_execute_request(msg_id: str, code: str) -> str: + def _get_execute_request(self, msg_id: str, code: str) -> str: return json.dumps( { "header": { "msg_id": msg_id, "username": "e2b", - "session": str(uuid.uuid4()), + "session": self.session_id, "msg_type": "execute_request", "version": "5.3", }, @@ -117,7 +118,7 @@ def _get_execute_request(msg_id: str, code: str) -> str: "content": { "code": code, "silent": False, - "store_history": False, + "store_history": True, "user_expressions": {}, "allow_stdin": False, }, @@ -237,6 +238,7 @@ def _receive_message(self, data: dict): elif data["msg_type"] == "execute_input": logger.debug(f"Input accepted for {parent_msg_ig}") + cell.partial_result.execution_count = data["content"]["execution_count"] cell.input_accepted = True else: logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 0a721c29..6210fc09 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -222,6 +222,8 @@ class Config: "Logs printed to stdout and stderr during execution." error: Optional[Error] = None "Error object if an error occurred, None otherwise." + execution_count: Optional[int] = None + "Execution count of the cell." @property def text(self) -> Optional[str]: diff --git a/python/example.py b/python/example.py index b060eb8d..a1aec4bd 100644 --- a/python/example.py +++ b/python/example.py @@ -24,6 +24,7 @@ """ with CodeInterpreter() as sandbox: + print(sandbox.id) execution = sandbox.notebook.exec_cell(code) print(execution.results[0].formats()) diff --git a/python/tests/test_execution_count.py b/python/tests/test_execution_count.py new file mode 100644 index 00000000..c1bdf8db --- /dev/null +++ b/python/tests/test_execution_count.py @@ -0,0 +1,12 @@ +from e2b_code_interpreter.main import CodeInterpreter + + +def test_bash(): + with CodeInterpreter() as sandbox: + result = sandbox.notebook.exec_cell("echo 'E2B is awesome!'") + print(result.execution_count) + result = sandbox.notebook.exec_cell("!pwd") + print(result.execution_count) + result = sandbox.notebook.exec_cell("!pwd") + print(result.execution_count) + diff --git a/template/start-up.sh b/template/start-up.sh index 65c7b69f..f3cb09eb 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -23,6 +23,8 @@ function start_jupyter_server() { echo "Kernel created" sudo mkdir -p /root/.jupyter + kernel_id=$(echo "${response}" | jq -r '.kernel.id') + sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" } From d7a57853ddcb978f4d20879d3a78f696e7cb7510 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 May 2024 17:08:08 +0200 Subject: [PATCH 018/722] Update e2b core package --- python/poetry.lock | 10 +++++----- python/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index e6f38a56..b2c72bf4 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "aenum" @@ -349,13 +349,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.0" +version = "0.17.1" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.0-py3-none-any.whl", hash = "sha256:4ac1905ba9801d566d8c4fca2558c74e622c06757b43550cf31f66055acc43c5"}, - {file = "e2b-0.17.0.tar.gz", hash = "sha256:64b71ff10fe5183ec3c9c7a643de9a89f3e4f00180c7732c6a2beb5c090d04b8"}, + {file = "e2b-0.17.1-py3-none-any.whl", hash = "sha256:c0698fd03b639f4dd88eed167a98af4d450668c0ae9805122a98f62f36f2491f"}, + {file = "e2b-0.17.1.tar.gz", hash = "sha256:9e69a059cb73334bac7db189287552af9321fb3ac8ced52557907e10c4310733"}, ] [package.dependencies] @@ -1115,4 +1115,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "fbdc1fb687f8a8fbe8d0b0bb631e5c3cc1a0de62ed3b23538bd314b38b1cdbf5" +content-hash = "458a524b6641b3386c5346f52102f235dcf565660e9631e6833c968d6f130f4b" diff --git a/python/pyproject.toml b/python/pyproject.toml index bf736c1c..62db0890 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" pydantic = ">1, <3" websocket-client = "^1.7.0" -e2b = ">=0.17.0" +e2b = ">=0.17.1" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 6efc99358876d586186b26d755d9372933f844e3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 May 2024 19:02:07 +0200 Subject: [PATCH 019/722] Fix python tests --- python/e2b_code_interpreter/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 3a701e1c..fc653333 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -93,7 +93,7 @@ def exec_cell( ws = ws_future.result(timeout=timeout) else: logger.debug(f"Creating new websocket connection to kernel {kernel_id}") - ws = self._connect_to_kernel_ws(kernel_id, timeout=timeout) + ws = self._connect_to_kernel_ws(kernel_id, None, timeout=timeout) message_id = ws.send_execution_message(code, on_stdout, on_stderr, on_result) logger.debug( @@ -190,7 +190,7 @@ def restart_kernel( logger.debug(f"Restarted kernel {kernel_id}") threading.Thread( - target=self._connect_to_kernel_ws, args=(kernel_id, timeout) + target=self._connect_to_kernel_ws, args=(kernel_id, None, timeout) ).start() def shutdown_kernel( From 2f412d26cc81be3d0b89e7c563ff10ad611cdc88 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 2 Jun 2024 09:51:35 +0200 Subject: [PATCH 020/722] Clean up --- python/e2b_code_interpreter/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index fc653333..d73bbbc2 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -261,7 +261,6 @@ def _connect_to_kernel_ws( future = Future() self._connected_kernels[kernel_id] = future - print(session_id) session_id = session_id or str(uuid.uuid4()) ws = JupyterKernelWebSocket( url=f"{self._sandbox.get_protocol('ws')}://{self._sandbox.get_hostname(8888)}/api/kernels/{kernel_id}/channels", @@ -287,6 +286,10 @@ def setup_default_kernel(): kernel_id = self._sandbox.filesystem.read( "/root/.jupyter/kernel_id", timeout=timeout ) + + if kernel_id is None and not self._sandbox.is_open: + return + kernel_id = kernel_id.strip() logger.debug(f"Default kernel id: {kernel_id}") From e2f412ca7930960e3ca47fd46ef2501c09fc1833 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 2 Jun 2024 09:52:34 +0200 Subject: [PATCH 021/722] Rename test method --- python/tests/test_execution_count.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_execution_count.py b/python/tests/test_execution_count.py index c1bdf8db..a40a1d03 100644 --- a/python/tests/test_execution_count.py +++ b/python/tests/test_execution_count.py @@ -1,7 +1,7 @@ from e2b_code_interpreter.main import CodeInterpreter -def test_bash(): +def test_execution_count(): with CodeInterpreter() as sandbox: result = sandbox.notebook.exec_cell("echo 'E2B is awesome!'") print(result.execution_count) From f477965151a6714a5e9b837d1d4d7016ac17bfa3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 2 Jun 2024 09:53:39 +0200 Subject: [PATCH 022/722] Improve test --- python/tests/test_execution_count.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/python/tests/test_execution_count.py b/python/tests/test_execution_count.py index a40a1d03..21f86302 100644 --- a/python/tests/test_execution_count.py +++ b/python/tests/test_execution_count.py @@ -3,10 +3,6 @@ def test_execution_count(): with CodeInterpreter() as sandbox: - result = sandbox.notebook.exec_cell("echo 'E2B is awesome!'") - print(result.execution_count) + sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = sandbox.notebook.exec_cell("!pwd") - print(result.execution_count) - result = sandbox.notebook.exec_cell("!pwd") - print(result.execution_count) - + assert result.execution_count == 2 From 2bdee1751531eee72d3e3889831b2836d4bf1e96 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 3 Jun 2024 16:11:01 +0200 Subject: [PATCH 023/722] Add representation string for the Result object --- .changeset/violet-buckets-sneeze.md | 5 +++++ python/e2b_code_interpreter/models.py | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/violet-buckets-sneeze.md diff --git a/.changeset/violet-buckets-sneeze.md b/.changeset/violet-buckets-sneeze.md new file mode 100644 index 00000000..a3fec97f --- /dev/null +++ b/.changeset/violet-buckets-sneeze.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter-python": patch +--- + +Add representation string for the Result object diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 6210fc09..2abaf10d 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -124,6 +124,9 @@ def __str__(self) -> Optional[str]: """ return self.text + def __repr__(self) -> str: + return f"Result({self.text})" + def _repr_html_(self) -> Optional[str]: """ Returns the HTML representation of the data. From dbc0f234bf409ae8fe417e89b63fa55657bb74bd Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 3 Jun 2024 16:52:13 +0200 Subject: [PATCH 024/722] Fix creating new session in the same folder --- python/e2b_code_interpreter/main.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d73bbbc2..b48a884f 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -141,9 +141,18 @@ def create_kernel( :param timeout: Timeout for the kernel creation request. :return: Kernel id of the created kernel """ - data = {"path": cwd, "kernel": {"name": "python3"}, "type": "notebook", "name": str(uuid.uuid4())} - if kernel_name: - data["kernel"]['name'] = kernel_name + kernel_name = kernel_name or "python3" + response = requests.post( + f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels", + json={"name": kernel_name, "path": cwd}, + timeout=timeout, + ) + if not response.ok: + raise KernelException(f"Failed to create kernel: {response.text}") + + kernel_data = response.json() + kernel_id = kernel_data["id"] + data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name, "id": kernel_id}, "type": "notebook", "name": str(uuid.uuid4())} logger.debug(f"Creating kernel with data: {data}") response = requests.post( @@ -155,8 +164,17 @@ def create_kernel( raise KernelException(f"Failed to create kernel: {response.text}") session_data = response.json() - kernel_id = session_data["kernel"]["id"] session_id = session_data["id"] + kernel_id = session_data["kernel"]["id"] + + response = requests.patch( + f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/sessions/{session_id}", + json={"path": cwd}, + timeout=timeout, + ) + if not response.ok: + raise KernelException(f"Failed to create kernel: {response.text}") + logger.debug(f"Created kernel {kernel_id}") threading.Thread( From c663051e98f73175be24b92b87087673cb26ff52 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 3 Jun 2024 17:00:07 +0200 Subject: [PATCH 025/722] Fix JS export --- js/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/src/index.ts b/js/src/index.ts index 87b07d0f..4ead67c1 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,5 +1,4 @@ export { CodeInterpreter, JupyterExtension } from './code-interpreter' -export type { CreateKernelProps } from './code-interpreter' export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData } from './messaging' @@ -7,4 +6,4 @@ import { CodeInterpreter } from './code-interpreter' export * from 'e2b' -export default CodeInterpreter \ No newline at end of file +export default CodeInterpreter From 29974aab9bb352567055c17069574b655930d552 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 3 Jun 2024 17:09:12 +0200 Subject: [PATCH 026/722] Fix creating new kernels --- js/src/code-interpreter.ts | 28 +++++++++++++++++++++++----- python/e2b_code_interpreter/main.py | 11 +---------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/js/src/code-interpreter.ts b/js/src/code-interpreter.ts index 6936320f..0339cf40 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/code-interpreter.ts @@ -145,10 +145,10 @@ export class JupyterExtension { cwd: string = '/home/user', kernelName?: string ): Promise { - const data = { path: cwd, kernel: {name: "python3"}, type: "notebook", name: id(16) } - if (kernelName) { - data.kernel.name = kernelName - } + kernelName = kernelName || 'python3' + + + const data = { path: id(16), kernel: {name: kernelName}, type: "notebook", name: id(16) } const response = await fetch( `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( @@ -164,9 +164,27 @@ export class JupyterExtension { throw new Error(`Failed to create kernel: ${response.statusText}`) } + const sessionInfo = await response.json() const kernelID = sessionInfo.kernel.id - await this.connectToKernelWS(kernelID, sessionInfo.id) + const sessionID = sessionInfo.id + + const patchResponse = await fetch( + `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + 8888 + )}/api/sessions/${sessionID}`, + { + method: 'PATCH', + body: JSON.stringify({path: cwd}) + } + ) + + if (!patchResponse.ok) { + throw new Error(`Failed to create kernel: ${response.statusText}`) + } + + + await this.connectToKernelWS(kernelID, sessionID) return kernelID } diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index b48a884f..c7e9c506 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -142,17 +142,8 @@ def create_kernel( :return: Kernel id of the created kernel """ kernel_name = kernel_name or "python3" - response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels", - json={"name": kernel_name, "path": cwd}, - timeout=timeout, - ) - if not response.ok: - raise KernelException(f"Failed to create kernel: {response.text}") - kernel_data = response.json() - kernel_id = kernel_data["id"] - data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name, "id": kernel_id}, "type": "notebook", "name": str(uuid.uuid4())} + data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name}, "type": "notebook", "name": str(uuid.uuid4())} logger.debug(f"Creating kernel with data: {data}") response = requests.post( From 0048f318053b3e0829acee9c0d41268bc1ade926 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 3 Jun 2024 15:12:35 +0000 Subject: [PATCH 027/722] [skip ci] Release new versions --- .changeset/violet-buckets-sneeze.md | 5 ----- python/package.json | 2 +- python/pyproject.toml | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 .changeset/violet-buckets-sneeze.md diff --git a/.changeset/violet-buckets-sneeze.md b/.changeset/violet-buckets-sneeze.md deleted file mode 100644 index a3fec97f..00000000 --- a/.changeset/violet-buckets-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter-python": patch ---- - -Add representation string for the Result object diff --git a/python/package.json b/python/package.json index 36a0fe3a..7beda0d2 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.7", + "version": "0.0.8", "scripts": { "test": "poetry run pytest -n 1 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", diff --git a/python/pyproject.toml b/python/pyproject.toml index 62db0890..4b5630dd 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.7" +version = "0.0.8" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 475b8d9de38490e44b0f40ad948f5e99beabb8e5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 3 Jun 2024 17:14:02 +0200 Subject: [PATCH 028/722] Add changeset --- .changeset/smart-pumas-type.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smart-pumas-type.md diff --git a/.changeset/smart-pumas-type.md b/.changeset/smart-pumas-type.md new file mode 100644 index 00000000..15bddade --- /dev/null +++ b/.changeset/smart-pumas-type.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter": patch +--- + +Add execution count to execution object From f805e6ecc128c982d60cd2e9402ef09f6e6aade4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 3 Jun 2024 15:18:23 +0000 Subject: [PATCH 029/722] [skip ci] Release new versions --- .changeset/smart-pumas-type.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/smart-pumas-type.md diff --git a/.changeset/smart-pumas-type.md b/.changeset/smart-pumas-type.md deleted file mode 100644 index 15bddade..00000000 --- a/.changeset/smart-pumas-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter": patch ---- - -Add execution count to execution object diff --git a/js/package.json b/js/package.json index bdf36a6e..8b06e924 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.6", + "version": "0.0.7", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From d304cc5a9fe7aa7a9f2339891ad107537f1c2d6a Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 5 Jun 2024 02:55:49 -0700 Subject: [PATCH 030/722] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9265d121..0dc433d3 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,14 @@ with CodeInterpreter() as sandbox: ``` ### 3. Hello World guide -Dive depeer and check out the [JavaScript](/hello-world/js) and [Python](/hello-world/py) the Hello World guides to learn how o connect code interpreter LLMs. +Dive depeer and check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to connect code interpreter LLMs. ## 📖 Cookbook examples **Hello World** -- [TypeScript](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/hello-world-js) -- [Python](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/hello-world-python) +- [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) +- [Python](https://e2b.dev/docs/hello-world/py) **LLM Providers** - 🪸 [Claude with code intepreter](https://github.com/e2b-dev/e2b-cookbook/blob/main/examples/claude-code-interpreter/claude_code_interpreter.ipynb) From c00a0e72d8b07d2479cf876269305a457f9b11fa Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 11 Jun 2024 11:44:03 +0200 Subject: [PATCH 031/722] Log if msg id is missing and skip --- js/src/messaging.ts | 20 +++++++++++++------- python/e2b_code_interpreter/messaging.py | 6 +++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 05626145..af890397 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -331,7 +331,13 @@ export class JupyterKernelWebSocket { public listenMessages() { this.ws.onmessage = (e: IWebSocket.MessageEvent) => { const message = JSON.parse(e.data.toString()) + const parentMsgId = message.parent_header.msg_id + if (parentMsgId == undefined) { + console.warn(`Parent message ID not found.\n Message: ${message}`) + return + } + const cell = this.cells[parentMsgId] if (!cell) { return @@ -430,30 +436,30 @@ export class JupyterKernelWebSocket { timeout?: number ) { return new Promise((resolve, reject) => { - const msg_id = id(16) - const data = this.sendExecuteRequest(msg_id, code) + const msgID = id(16) + const data = this.sendExecuteRequest(msgID, code) // give limited time for response let timeoutSet: number | NodeJS.Timeout if (timeout) { timeoutSet = setTimeout(() => { // stop waiting for response - delete this.idAwaiter[msg_id] + delete this.idAwaiter[msgID] reject( new Error( - `Awaiting response to "${code}" with id: ${msg_id} timed out.` + `Awaiting response to "${code}" with id: ${msgID} timed out.` ) ) }, timeout) } // expect response - this.cells[msg_id] = new CellExecution(onStdout, onStderr, onResult) - this.idAwaiter[msg_id] = (responseData: Execution) => { + this.cells[msgID] = new CellExecution(onStdout, onStderr, onResult) + this.idAwaiter[msgID] = (responseData: Execution) => { // stop timeout clearInterval(timeoutSet as number) // stop waiting for response - delete this.idAwaiter[msg_id] + delete this.idAwaiter[msgID] resolve(responseData) } diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index dc56a2b1..a65f1c6b 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -161,7 +161,11 @@ def _receive_message(self, data: dict): :param data: The message data """ - parent_msg_ig = data["parent_header"]["msg_id"] + parent_msg_ig = data["parent_header"].get("msg_id", None) + if parent_msg_ig is None: + logger.warning("Parent message ID not found. %s", data) + continue + logger.debug(f"Received message {data['msg_type']} for {parent_msg_ig}") cell = self._cells.get(parent_msg_ig) From 21a071813a57db89895aafaf9b436100ef6eb057 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 11 Jun 2024 11:45:43 +0200 Subject: [PATCH 032/722] Add changeset --- .changeset/cyan-pears-hug.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/cyan-pears-hug.md diff --git a/.changeset/cyan-pears-hug.md b/.changeset/cyan-pears-hug.md new file mode 100644 index 00000000..df63d0cb --- /dev/null +++ b/.changeset/cyan-pears-hug.md @@ -0,0 +1,6 @@ +--- +"@e2b/code-interpreter": patch +"@e2b/code-interpreter-python": patch +--- + +Bug fix when msg id is missing in parent header From 776ef3f717011ae2b5c2686696401560dd946bc6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 11 Jun 2024 11:48:28 +0200 Subject: [PATCH 033/722] Fix --- python/e2b_code_interpreter/messaging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index a65f1c6b..a411d45f 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -164,7 +164,7 @@ def _receive_message(self, data: dict): parent_msg_ig = data["parent_header"].get("msg_id", None) if parent_msg_ig is None: logger.warning("Parent message ID not found. %s", data) - continue + return logger.debug(f"Received message {data['msg_type']} for {parent_msg_ig}") From 23a018f3fbe9261bb9a427427e2419af12162dba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 11 Jun 2024 09:53:41 +0000 Subject: [PATCH 034/722] [skip ci] Release new versions --- .changeset/cyan-pears-hug.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/cyan-pears-hug.md diff --git a/.changeset/cyan-pears-hug.md b/.changeset/cyan-pears-hug.md deleted file mode 100644 index df63d0cb..00000000 --- a/.changeset/cyan-pears-hug.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@e2b/code-interpreter": patch -"@e2b/code-interpreter-python": patch ---- - -Bug fix when msg id is missing in parent header diff --git a/js/package.json b/js/package.json index 8b06e924..d5952f59 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.7", + "version": "0.0.8", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/package.json b/python/package.json index 7beda0d2..18ea672d 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.8", + "version": "0.0.9", "scripts": { "test": "poetry run pytest -n 1 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", diff --git a/python/pyproject.toml b/python/pyproject.toml index 4b5630dd..37f8f23f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.8" +version = "0.0.9" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From adece83489ab8aa3c9f064bc67bac479bd6ad067 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Sun, 16 Jun 2024 11:41:18 -0700 Subject: [PATCH 035/722] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0dc433d3..2b4b62fe 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ The code interpreter runs inside the [E2B Sandbox](https://github.com/e2b-dev/e2 Follow E2B on [X (Twitter)](https://twitter.com/e2b_dev). +## 💻 Supported language runtimes +- ✅ Python +- [(Beta)](https://github.com/e2b-dev/code-interpreter/pull/20) JavaScript, R, Java + ## 🚀 Quickstart ### 1. Install SDK @@ -54,7 +58,6 @@ with CodeInterpreter() as sandbox: ### 3. Hello World guide Dive depeer and check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to connect code interpreter LLMs. - ## 📖 Cookbook examples **Hello World** @@ -71,7 +74,3 @@ Dive depeer and check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello - 🦜🕸️ [LangGraph with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/langgraph-python) - [Autogen with secure sandboxed code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/e2b_autogen) -## 💻 Supported languages for AI-code execution -- ✅ Python -- (soon) JavaScript/TypeScript - From ed315f0ef808356eb199322616e4dfa74690c44e Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Sun, 16 Jun 2024 13:02:32 -0700 Subject: [PATCH 036/722] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2b4b62fe..848edea4 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ Follow E2B on [X (Twitter)](https://twitter.com/e2b_dev). - ✅ Python - [(Beta)](https://github.com/e2b-dev/code-interpreter/pull/20) JavaScript, R, Java +## 📖 Documentation +- [e2b.dev/docs/code-interpreter](https://e2b.dev/docs/code-interpreter/installation) + ## 🚀 Quickstart ### 1. Install SDK From 32ade479e9a83cdd5157eaca062c21b68cd76c96 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 19 Jun 2024 11:52:08 +0200 Subject: [PATCH 037/722] Make pydantic v1 compatible --- python/e2b_code_interpreter/models.py | 31 +++++++++++++++------------ python/poetry.lock | 4 ++-- python/pyproject.toml | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 2abaf10d..58706f79 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,6 +1,6 @@ import copy from typing import List, Optional, Iterable, Dict -from pydantic import BaseModel, field_serializer +from pydantic import BaseModel class Error(BaseModel): @@ -211,6 +211,19 @@ class Logs(BaseModel): "List of strings printed to stderr by prints, subprocesses, etc." +def serialize_results(results: List[Result]) -> List[Dict[str, str]]: + """ + Serializes the results to JSON. + This method is used by the Pydantic JSON encoder. + """ + serialized = [] + for result in results: + serialized_dict = {key: result[key] for key in result.formats()} + serialized_dict["text"] = result.text + serialized.append(serialized_dict) + return serialized + + class Execution(BaseModel): """ Represents the result of a cell execution. @@ -218,6 +231,9 @@ class Execution(BaseModel): class Config: arbitrary_types_allowed = True + json_encoders = { + List[Result]: serialize_results, + } results: List[Result] = [] "List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots)." @@ -245,19 +261,6 @@ def to_json(self) -> str: """ return self.model_dump_json(exclude_none=True) - @field_serializer("results", when_used="json") - def serialize_results(results: List[Result]) -> List[Dict[str, str]]: - """ - Serializes the results to JSON. - This method is used by the Pydantic JSON encoder. - """ - serialized = [] - for result in results: - serialized_dict = {key: result[key] for key in result.formats()} - serialized_dict["text"] = result.text - serialized.append(serialized_dict) - return serialized - class KernelException(Exception): """ diff --git a/python/poetry.lock b/python/poetry.lock index b2c72bf4..e6417f2d 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aenum" @@ -1115,4 +1115,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "458a524b6641b3386c5346f52102f235dcf565660e9631e6833c968d6f130f4b" +content-hash = "4062bc8f4cfc5979c0fda25e723f51397719f5147f8cd8b521989f5cafcb0b9e" diff --git a/python/pyproject.toml b/python/pyproject.toml index 37f8f23f..e7166f2c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,7 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -pydantic = ">1, <3" +pydantic = "*" websocket-client = "^1.7.0" e2b = ">=0.17.1" From 08186c38dc9eba8567f663326bd55799d4662dbf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 19 Jun 2024 11:53:27 +0200 Subject: [PATCH 038/722] Add changeset --- .changeset/clean-lies-perform.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clean-lies-perform.md diff --git a/.changeset/clean-lies-perform.md b/.changeset/clean-lies-perform.md new file mode 100644 index 00000000..e1a56c84 --- /dev/null +++ b/.changeset/clean-lies-perform.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter-python": patch +--- + +Make pydantic v1 compatible From 2f08c1d3f4387f3e21c8b00da4ad09b069dc795f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 19 Jun 2024 10:07:02 +0000 Subject: [PATCH 039/722] [skip ci] Release new versions --- .changeset/clean-lies-perform.md | 5 ----- python/package.json | 2 +- python/pyproject.toml | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 .changeset/clean-lies-perform.md diff --git a/.changeset/clean-lies-perform.md b/.changeset/clean-lies-perform.md deleted file mode 100644 index e1a56c84..00000000 --- a/.changeset/clean-lies-perform.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter-python": patch ---- - -Make pydantic v1 compatible diff --git a/python/package.json b/python/package.json index 18ea672d..e092b250 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test": "poetry run pytest -n 1 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", diff --git a/python/pyproject.toml b/python/pyproject.toml index e7166f2c..9ba4f10e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.9" +version = "0.0.10" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From c5f1106d5663e447b9246c46ab10c1efbefa9a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 25 Jun 2024 07:15:58 -0700 Subject: [PATCH 040/722] Fix path in README.md --- template/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/README.md b/template/README.md index 168c3131..8c1aaa34 100644 --- a/template/README.md +++ b/template/README.md @@ -16,7 +16,7 @@ If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled 4. Run the following in the same directory where's your `e2b.toml` ```sh - e2b template build -c "/home/user/.jupyter/start-up.sh" + e2b template build -c "/root/.jupyter/start-up.sh" ``` 5. Use your custom sandbox with Code Interpreter SDK From b09bcbcba540dc0f689a720cf6995a6bbe5ca5ed Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 13:35:11 -0700 Subject: [PATCH 041/722] [WIP] Use new SDK in JS code interpreter --- js/package.json | 8 +- ...code-interpreter.ts => codeInterpreter.ts} | 53 ++++++------ js/src/index.ts | 4 +- js/src/messaging.ts | 37 ++++++-- pnpm-lock.yaml | 85 ++++++++++++------- 5 files changed, 117 insertions(+), 70 deletions(-) rename js/src/{code-interpreter.ts => codeInterpreter.ts} (84%) diff --git a/js/package.json b/js/package.json index d5952f59..28caec1c 100644 --- a/js/package.json +++ b/js/package.json @@ -60,14 +60,18 @@ "vm" ], "dependencies": { - "e2b": "^0.16.1", + "e2b": "0.16.2-beta.1", "isomorphic-ws": "^5.0.0", "ws": "^8.15.1" }, + "optionalDependencies": { + "bufferutil": "^4.0.8", + "utf-8-validate": "^6.0.3" + }, "engines": { "node": ">=18" }, "browserslist": [ "defaults" ] -} +} \ No newline at end of file diff --git a/js/src/code-interpreter.ts b/js/src/codeInterpreter.ts similarity index 84% rename from js/src/code-interpreter.ts rename to js/src/codeInterpreter.ts index 0339cf40..92b0e76b 100644 --- a/js/src/code-interpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,5 +1,6 @@ -import { ProcessMessage, Sandbox, SandboxOpts } from 'e2b' -import { Result, JupyterKernelWebSocket, Execution } from './messaging' +import { Sandbox } from 'e2b' + +import { Result, JupyterKernelWebSocket, Execution, CellMessage } from './messaging' import { createDeferredPromise, id } from './utils' interface Kernels { @@ -10,24 +11,20 @@ interface Kernels { * E2B code interpreter sandbox extension. */ export class CodeInterpreter extends Sandbox { - private static template = 'code-interpreter-stateful' + protected static readonly defaultTemplate: string = 'code-interpreter-stateful' readonly notebook = new JupyterExtension(this) - constructor(opts?: SandboxOpts, createCalled = false) { - super({ template: opts?.template || CodeInterpreter.template, ...opts }, createCalled) + protected override async onInit(opts: { requestTimeoutMs?: number }) { + await this.notebook.connect(opts?.requestTimeoutMs) } - override async _open(opts?: { timeout?: number }) { - await super._open({ timeout: opts?.timeout }) - await this.notebook.connect(opts?.timeout) - - return this + async close() { + await this.notebook.close() } - override async close() { - await this.notebook.close() - await super.close() + getProtocol(baseProtocol: string = 'http') { + return this.connectionConfig.debug ? `${baseProtocol}s` : baseProtocol } } @@ -41,11 +38,11 @@ export class JupyterExtension { return this.kernelIDPromise.promise } - constructor(private sandbox: CodeInterpreter) {} + constructor(private sandbox: CodeInterpreter) { } - async connect(timeout?: number) { + async connect(requestTimeoutMs?: number) { return this.startConnectingToDefaultKernel(this.setDefaultKernelID, { - timeout + requestTimeoutMs, }) } @@ -72,8 +69,8 @@ export class JupyterExtension { timeout }: { kernelID?: string - onStdout?: (msg: ProcessMessage) => any - onStderr?: (msg: ProcessMessage) => any + onStdout?: (msg: CellMessage) => any + onStderr?: (msg: CellMessage) => any onResult?: (data: Result) => any timeout?: number } = {} @@ -94,10 +91,10 @@ export class JupyterExtension { private async startConnectingToDefaultKernel( resolve: (value: string) => void, - opts?: { timeout?: number } + opts?: { requestTimeoutMs?: number } ) { const kernelID = ( - await this.sandbox.filesystem.read('/root/.jupyter/kernel_id', opts) + await this.sandbox.files.read('/root/.jupyter/kernel_id', opts) ).trim() await this.connectToKernelWS(kernelID) resolve(kernelID) @@ -116,7 +113,7 @@ export class JupyterExtension { * @throws {Error} Throws an error if the connection to the kernel's WebSocket cannot be established. */ private async connectToKernelWS(kernelID: string, sessionID?: string) { - const url = `${this.sandbox.getProtocol('ws')}://${this.sandbox.getHostname( + const url = `${this.sandbox.getProtocol('ws')}://${this.sandbox.getHost( 8888 )}/api/kernels/${kernelID}/channels` @@ -148,10 +145,10 @@ export class JupyterExtension { kernelName = kernelName || 'python3' - const data = { path: id(16), kernel: {name: kernelName}, type: "notebook", name: id(16) } + const data = { path: id(16), kernel: { name: kernelName }, type: "notebook", name: id(16) } const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 )}/api/sessions`, { @@ -170,12 +167,12 @@ export class JupyterExtension { const sessionID = sessionInfo.id const patchResponse = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 )}/api/sessions/${sessionID}`, { method: 'PATCH', - body: JSON.stringify({path: cwd}) + body: JSON.stringify({ path: cwd }) } ) @@ -201,7 +198,7 @@ export class JupyterExtension { delete this.connectedKernels[kernelID] const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 )}/api/kernels/${kernelID}/restart`, { @@ -228,7 +225,7 @@ export class JupyterExtension { delete this.connectedKernels[kernelID] const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 )}/api/kernels/${kernelID}`, { @@ -252,7 +249,7 @@ export class JupyterExtension { */ async listKernels(): Promise { const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHostname( + `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 )}/api/kernels`, { diff --git a/js/src/index.ts b/js/src/index.ts index 4ead67c1..1c4febf9 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,8 +1,8 @@ -export { CodeInterpreter, JupyterExtension } from './code-interpreter' +export { CodeInterpreter, JupyterExtension } from './codeInterpreter' export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData } from './messaging' -import { CodeInterpreter } from './code-interpreter' +import { CodeInterpreter } from './codeInterpreter' export * from 'e2b' diff --git a/js/src/messaging.ts b/js/src/messaging.ts index af890397..fb23a42a 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,7 +1,26 @@ import IWebSocket from 'isomorphic-ws' -import { ProcessMessage } from 'e2b' import { id } from './utils' +/** + * A message from a process. + */ +export class CellMessage { + constructor( + public readonly line: string, + /** + * Unix epoch in nanoseconds + */ + public readonly timestamp: number, + public readonly error: boolean, + ) { + } + + public toString() { + return this.line + } +} + + /** * Represents an error that occurred during the execution of a cell. * The error contains the name of the error, the value of the error, and the traceback. @@ -262,14 +281,14 @@ export class Execution { */ class CellExecution { execution: Execution - onStdout?: (out: ProcessMessage) => any - onStderr?: (out: ProcessMessage) => any + onStdout?: (out: CellMessage) => any + onStderr?: (out: CellMessage) => any onResult?: (data: Result) => any inputAccepted: boolean = false constructor( - onStdout?: (out: ProcessMessage) => any, - onStderr?: (out: ProcessMessage) => any, + onStdout?: (out: CellMessage) => any, + onStderr?: (out: CellMessage) => any, onResult?: (data: Result) => any ) { this.execution = new Execution([], { stdout: [], stderr: [] }) @@ -355,7 +374,7 @@ export class JupyterKernelWebSocket { execution.logs.stdout.push(message.content.text) if (cell?.onStdout) { cell.onStdout( - new ProcessMessage( + new CellMessage( message.content.text, new Date().getTime() * 1_000_000, false @@ -366,7 +385,7 @@ export class JupyterKernelWebSocket { execution.logs.stderr.push(message.content.text) if (cell?.onStderr) { cell.onStderr( - new ProcessMessage( + new CellMessage( message.content.text, new Date().getTime() * 1_000_000, true @@ -430,8 +449,8 @@ export class JupyterKernelWebSocket { */ public sendExecutionMessage( code: string, - onStdout?: (out: ProcessMessage) => any, - onStderr?: (out: ProcessMessage) => any, + onStdout?: (out: CellMessage) => any, + onStderr?: (out: CellMessage) => any, onResult?: (data: Result) => any, timeout?: number ) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c66e586..5692c7b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,14 +21,21 @@ importers: js: dependencies: e2b: - specifier: ^0.16.1 - version: 0.16.1 + specifier: 0.16.2-beta.1 + version: 0.16.2-beta.1 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.16.0) ws: specifier: ^8.15.1 - version: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + optionalDependencies: + bufferutil: + specifier: ^4.0.8 + version: 4.0.8 + utf-8-validate: + specifier: ^6.0.3 + version: 6.0.4 devDependencies: '@types/node': specifier: ^18.18.6 @@ -89,6 +96,10 @@ packages: regenerator-runtime: 0.14.1 dev: true + /@bufbuild/protobuf@1.10.0: + resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + dev: false + /@changesets/apply-release-plan@7.0.0: resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} dependencies: @@ -327,6 +338,24 @@ packages: dev: true optional: true + /@connectrpc/connect-web@1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0): + resolution: {integrity: sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + '@connectrpc/connect': 1.4.0 + dependencies: + '@bufbuild/protobuf': 1.10.0 + '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) + dev: false + + /@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0): + resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + dependencies: + '@bufbuild/protobuf': 1.10.0 + dev: false + /@ericcornelissen/bash-parser@0.5.2: resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} engines: {node: '>=4'} @@ -1631,7 +1660,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.1 dev: false /builtins@5.0.1: @@ -2128,19 +2157,15 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.1: - resolution: {integrity: sha512-2L1R/REEB+EezD4Q4MmcXXNATjvCYov2lv/69+PY6V95+wl1PZblIMTYAe7USxX6P6sqANxNs+kXqZr6RvXkSw==} + /e2b@0.16.2-beta.1: + resolution: {integrity: sha512-/lA0bb/DBbMZzHI7UyZ4m/vjLNwwKcRnI5WSmgzKEeHvWJkpfabY8S+DIQY+OIqQYcMu3gTjFj5VHpEHd9n3Ag==} engines: {node: '>=18'} dependencies: - isomorphic-ws: 5.0.0(ws@8.16.0) - normalize-path: 3.0.0 - openapi-typescript-fetch: 1.1.3 - path-browserify: 1.0.1 + '@bufbuild/protobuf': 1.10.0 + '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) + '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0) + openapi-fetch: 0.9.8 platform: 1.3.6 - ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 dev: false /eastasianwidth@0.2.0: @@ -3199,7 +3224,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) dev: false /iterable-lookahead@1.0.0: @@ -3807,8 +3832,8 @@ packages: - domexception dev: true - /node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + /node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true requiresBuild: true dev: false @@ -3864,6 +3889,7 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: true /normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} @@ -4037,9 +4063,14 @@ packages: mimic-fn: 2.1.0 dev: true - /openapi-typescript-fetch@1.1.3: - resolution: {integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg==} - engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} + /openapi-fetch@0.9.8: + resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + dependencies: + openapi-typescript-helpers: 0.0.8 + dev: false + + /openapi-typescript-helpers@0.0.8: + resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} dev: false /os-tmpdir@1.0.2: @@ -4194,10 +4225,6 @@ packages: semver: 6.3.1 dev: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: false - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5456,12 +5483,12 @@ packages: xdg-basedir: 5.1.0 dev: true - /utf-8-validate@6.0.3: - resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} + /utf-8-validate@6.0.4: + resolution: {integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.1 dev: false /util-deprecate@1.0.2: @@ -5760,7 +5787,7 @@ packages: typedarray-to-buffer: 3.1.5 dev: true - /ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + /ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: @@ -5773,7 +5800,7 @@ packages: optional: true dependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 6.0.4 dev: false /xdg-basedir@5.1.0: From e2bf044f72c36f3da70ae4fff089ab6f109031a4 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:22:30 -0700 Subject: [PATCH 042/722] Fix JS tests --- js/tests/reconnect.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index c4140859..3d659ee9 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -6,7 +6,7 @@ test('reconnect', async () => { let sandbox = await CodeInterpreter.create() await sandbox.close() - sandbox = await CodeInterpreter.reconnect(sandbox.id) + sandbox = await CodeInterpreter.connect(sandbox.sandboxID) const result = await sandbox.notebook.execCell('x =1; x') From 403595de4392e6b4bac50a0ed7023b95199bd92e Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:23:11 -0700 Subject: [PATCH 043/722] [WIP] Use E2B SDK beta in Python code interpreter --- python/e2b_code_interpreter/constants.py | 1 + python/e2b_code_interpreter/future.py | 46 ++ python/e2b_code_interpreter/main.py | 119 ++-- python/e2b_code_interpreter/messaging.py | 48 +- .../e2b_code_interpreter/websocket_client.py | 163 +++++ python/poetry.lock | 559 ++++-------------- python/pyproject.toml | 4 +- python/tests/test_reconnect.py | 4 +- 8 files changed, 432 insertions(+), 512 deletions(-) create mode 100644 python/e2b_code_interpreter/constants.py create mode 100644 python/e2b_code_interpreter/future.py create mode 100644 python/e2b_code_interpreter/websocket_client.py diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py new file mode 100644 index 00000000..8fd9190d --- /dev/null +++ b/python/e2b_code_interpreter/constants.py @@ -0,0 +1 @@ +TIMEOUT = 60 diff --git a/python/e2b_code_interpreter/future.py b/python/e2b_code_interpreter/future.py new file mode 100644 index 00000000..25af546f --- /dev/null +++ b/python/e2b_code_interpreter/future.py @@ -0,0 +1,46 @@ +import asyncio + +from asyncio import AbstractEventLoop +from concurrent.futures import Future, CancelledError +from typing import Any, Awaitable, Callable, Generic, List, Optional, TypeVar + +T = TypeVar("T") + + +# Check if using event is not better for most use cases +class DeferredFuture(Generic[T]): + def __init__(self, cleanup_list: Optional[List[Callable[[], Any]]] = None): + self._future = Future() + if cleanup_list is not None: + cleanup_list.append(self.cancel) + + def __call__(self, result: T): + if not self._future.done(): + self._future.set_result(result) + + def result(self, timeout: Optional[float] = None) -> T: + try: + return self._future.result(timeout=timeout) + # The thread was interrupted while waiting, it's okay to release the thread + except CancelledError: + pass + + def done(self) -> bool: + return self._future.done() + + def cancel(self): + if not self._future.done(): + self._future.cancel() + + def reject(self, reason: Exception): + if not self._future.done(): + self._future.set_exception(reason) + + +def run_async_func_in_loop(loop: AbstractEventLoop, coro: Awaitable): + asyncio.set_event_loop(loop) + + try: + return loop.run_until_complete(coro) + finally: + loop.close() diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index c7e9c506..ff0ad33a 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -3,16 +3,14 @@ import logging import threading import uuid - import requests from concurrent.futures import Future from typing import Any, Callable, List, Optional, Dict +from e2b import Sandbox -from e2b import EnvVars, ProcessMessage, Sandbox -from e2b.constants import TIMEOUT - -from e2b_code_interpreter.messaging import JupyterKernelWebSocket +from e2b_code_interpreter.constants import TIMEOUT +from e2b_code_interpreter.messaging import CellMessage, JupyterKernelWebSocket from e2b_code_interpreter.models import KernelException, Execution, Result logger = logging.getLogger(__name__) @@ -23,42 +21,55 @@ class CodeInterpreter(Sandbox): E2B code interpreter sandbox extension. """ - template = "code-interpreter-stateful" + default_template = "code-interpreter-stateful" def __init__( self, template: Optional[str] = None, + timeout: Optional[int] = None, + metadata: Optional[Dict[str, str]] = None, api_key: Optional[str] = None, - cwd: Optional[str] = None, - env_vars: Optional[EnvVars] = None, - timeout: Optional[float] = TIMEOUT, - on_stdout: Optional[Callable[[ProcessMessage], Any]] = None, - on_stderr: Optional[Callable[[ProcessMessage], Any]] = None, - on_exit: Optional[Callable[[int], Any]] = None, - **kwargs, + domain: Optional[str] = None, + debug: Optional[bool] = None, + sandbox_id: Optional[str] = None, + request_timeout: Optional[float] = None, ): super().__init__( - template=template or self.template, - api_key=api_key, - cwd=cwd, - env_vars=env_vars, + template=template, timeout=timeout, - on_stdout=on_stdout, - on_stderr=on_stderr, - on_exit=on_exit, - **kwargs, + metadata=metadata, + api_key=api_key, + domain=domain, + debug=debug, + sandbox_id=sandbox_id, + request_timeout=request_timeout, ) - self.notebook = JupyterExtension(self, timeout=timeout) - # Close all the websocket connections when the interpreter is closed - self._process_cleanup.append(self.notebook.close) + self.notebook = JupyterExtension(self, request_timeout=request_timeout) + + def close(self): + # Close all the websocket connections to the kernels + self.notebook.close() + + def get_protocol(self, base_protocol: str = "http") -> str: + """ + The function decides whether to use the secure or insecure protocol. + + :param base_protocol: Specify the specific protocol you want to use. Do not include the `s` in `https` or `wss`. + :param secure: Specify whether you want to use the secure protocol or not. + + :return: Protocol for the connection to the sandbox + """ + return base_protocol if self._connection_config.debug else f"{base_protocol}s" class JupyterExtension: - def __init__(self, sandbox: CodeInterpreter, timeout: Optional[float] = TIMEOUT): + def __init__( + self, sandbox: CodeInterpreter, request_timeout: Optional[float] = TIMEOUT + ): self._sandbox = sandbox self._kernel_id_set = Future() - self._start_connecting_to_default_kernel(timeout=timeout) + self._start_connecting_to_default_kernel(request_timeout=request_timeout) self._connected_kernels: Dict[str, Future[JupyterKernelWebSocket]] = {} self._default_kernel_id: Optional[str] = None @@ -66,10 +77,10 @@ def exec_cell( self, code: str, kernel_id: Optional[str] = None, - on_stdout: Optional[Callable[[ProcessMessage], Any]] = None, - on_stderr: Optional[Callable[[ProcessMessage], Any]] = None, + on_stdout: Optional[Callable[[CellMessage], Any]] = None, + on_stderr: Optional[Callable[[CellMessage], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, - timeout: Optional[float] = TIMEOUT, + request_timeout: float = TIMEOUT, ) -> Execution: """ Execute code in a notebook cell. @@ -90,17 +101,21 @@ def exec_cell( if ws_future: logger.debug(f"Using existing websocket connection to kernel {kernel_id}") - ws = ws_future.result(timeout=timeout) + ws = ws_future.result(timeout=request_timeout) else: logger.debug(f"Creating new websocket connection to kernel {kernel_id}") - ws = self._connect_to_kernel_ws(kernel_id, None, timeout=timeout) + ws = self._connect_to_kernel_ws( + kernel_id, + None, + request_timeout=request_timeout, + ) message_id = ws.send_execution_message(code, on_stdout, on_stderr, on_result) logger.debug( f"Sent execution message to kernel {kernel_id}, message_id: {message_id}" ) - result = ws.get_result(message_id, timeout=timeout) + result = ws.get_result(message_id, timeout=request_timeout) logger.debug( f"Received result from kernel {kernel_id}, message_id: {message_id}, result: {result}" ) @@ -143,11 +158,16 @@ def create_kernel( """ kernel_name = kernel_name or "python3" - data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name}, "type": "notebook", "name": str(uuid.uuid4())} + data = { + "path": str(uuid.uuid4()), + "kernel": {"name": kernel_name}, + "type": "notebook", + "name": str(uuid.uuid4()), + } logger.debug(f"Creating kernel with data: {data}") response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/sessions", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions", json=data, timeout=timeout, ) @@ -159,7 +179,7 @@ def create_kernel( kernel_id = session_data["kernel"]["id"] response = requests.patch( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/sessions/{session_id}", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions/{session_id}", json={"path": cwd}, timeout=timeout, ) @@ -190,7 +210,7 @@ def restart_kernel( logger.debug(f"Closed websocket connection to kernel {kernel_id}") response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels/{kernel_id}/restart", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}/restart", timeout=timeout, ) if not response.ok: @@ -219,7 +239,7 @@ def shutdown_kernel( logger.debug(f"Closed websocket connection to kernel {kernel_id}") response = requests.delete( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels/{kernel_id}", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}", timeout=timeout, ) if not response.ok: @@ -238,7 +258,7 @@ def list_kernels(self, timeout: Optional[float] = TIMEOUT) -> List[str]: :return: List of kernel ids """ response = requests.get( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_hostname(8888)}/api/kernels", + f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels", timeout=timeout, ) @@ -256,7 +276,10 @@ def close(self): ws.result().close() def _connect_to_kernel_ws( - self, kernel_id: str, session_id: Optional[str], timeout: Optional[float] = TIMEOUT + self, + kernel_id: str, + session_id: Optional[str], + request_timeout: float = TIMEOUT, ) -> JupyterKernelWebSocket: """ Establishes a WebSocket connection to a specified Jupyter kernel. @@ -272,18 +295,18 @@ def _connect_to_kernel_ws( session_id = session_id or str(uuid.uuid4()) ws = JupyterKernelWebSocket( - url=f"{self._sandbox.get_protocol('ws')}://{self._sandbox.get_hostname(8888)}/api/kernels/{kernel_id}/channels", - session_id=session_id + url=f"{self._sandbox.get_protocol('ws')}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}/channels", + session_id=session_id, ) - ws.connect(timeout=timeout) + ws.connect(timeout=request_timeout) logger.debug(f"Connected to kernel's ({kernel_id}) websocket.") future.set_result(ws) return ws def _start_connecting_to_default_kernel( - self, timeout: Optional[float] = TIMEOUT + self, request_timeout: Optional[float] = TIMEOUT ) -> None: """ Start connecting to the default kernel in a separate thread to avoid blocking the main thread. @@ -292,17 +315,19 @@ def _start_connecting_to_default_kernel( logger.debug("Starting to connect to the default kernel") def setup_default_kernel(): - kernel_id = self._sandbox.filesystem.read( - "/root/.jupyter/kernel_id", timeout=timeout + kernel_id = self._sandbox.files.read( + "/root/.jupyter/kernel_id", request_timeout=request_timeout ) - if kernel_id is None and not self._sandbox.is_open: + if kernel_id is None and not self._sandbox.is_running( + request_timeout=request_timeout + ): return kernel_id = kernel_id.strip() logger.debug(f"Default kernel id: {kernel_id}") - self._connect_to_kernel_ws(kernel_id, None, timeout=timeout) + self._connect_to_kernel_ws(kernel_id, None, request_timeout=request_timeout) self._kernel_id_set.set_result(kernel_id) threading.Thread(target=setup_default_kernel).start() diff --git a/python/e2b_code_interpreter/messaging.py b/python/e2b_code_interpreter/messaging.py index a411d45f..d24ecf55 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/python/e2b_code_interpreter/messaging.py @@ -3,21 +3,38 @@ import threading import time import uuid + from concurrent.futures import Future from queue import Queue from typing import Callable, Dict, Any, Optional +from pydantic import BaseModel +from e2b import TimeoutException -from e2b import ProcessMessage -from e2b.constants import TIMEOUT -from e2b.sandbox import TimeoutException -from e2b.sandbox.websocket_client import WebSocket -from e2b.utils.future import DeferredFuture - +from e2b_code_interpreter.websocket_client import WebSocket +from e2b_code_interpreter.future import DeferredFuture from e2b_code_interpreter.models import Execution, Result, Error +from e2b_code_interpreter.constants import TIMEOUT + logger = logging.getLogger(__name__) +class CellMessage(BaseModel): + """ + A message from a process. + """ + + line: str + error: bool = False + timestamp: int + """ + Unix epoch in nanoseconds + """ + + def __str__(self): + return self.line + + class CellExecution: """ Represents the execution of a cell in the Jupyter kernel. @@ -26,14 +43,14 @@ class CellExecution: input_accepted: bool = False - on_stdout: Optional[Callable[[ProcessMessage], Any]] = None - on_stderr: Optional[Callable[[ProcessMessage], Any]] = None + on_stdout: Optional[Callable[[CellMessage], Any]] = None + on_stderr: Optional[Callable[[CellMessage], Any]] = None on_result: Optional[Callable[[Result], Any]] = None def __init__( self, - on_stdout: Optional[Callable[[ProcessMessage], Any]] = None, - on_stderr: Optional[Callable[[ProcessMessage], Any]] = None, + on_stdout: Optional[Callable[[CellMessage], Any]] = None, + on_stderr: Optional[Callable[[CellMessage], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, ): self.partial_result = Execution() @@ -44,7 +61,6 @@ def __init__( class JupyterKernelWebSocket: - def __init__(self, url: str, session_id: str): self.url = url self.session_id = session_id @@ -78,7 +94,7 @@ def connect(self, timeout: float = TIMEOUT): queue_in=self._queue_in, queue_out=self._queue_out, started=started, - stopped=self._stopped + stopped=self._stopped, ).run, daemon=True, name="e2b-code-interpreter-websocket", @@ -128,8 +144,8 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: def send_execution_message( self, code: str, - on_stdout: Optional[Callable[[ProcessMessage], Any]] = None, - on_stderr: Optional[Callable[[ProcessMessage], Any]] = None, + on_stdout: Optional[Callable[[CellMessage], Any]] = None, + on_stderr: Optional[Callable[[CellMessage], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, ) -> str: message_id = str(uuid.uuid4()) @@ -187,7 +203,7 @@ def _receive_message(self, data: dict): execution.logs.stdout.append(data["content"]["text"]) if cell.on_stdout: cell.on_stdout( - ProcessMessage( + CellMessage( line=data["content"]["text"], timestamp=time.time_ns(), ) @@ -197,7 +213,7 @@ def _receive_message(self, data: dict): execution.logs.stderr.append(data["content"]["text"]) if cell.on_stderr: cell.on_stderr( - ProcessMessage( + CellMessage( line=data["content"]["text"], error=True, timestamp=time.time_ns(), diff --git a/python/e2b_code_interpreter/websocket_client.py b/python/e2b_code_interpreter/websocket_client.py new file mode 100644 index 00000000..67db915c --- /dev/null +++ b/python/e2b_code_interpreter/websocket_client.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +import asyncio +import logging +import random + +from queue import Queue +from threading import Event +from typing import Any, Callable, List, Optional, AsyncIterator + +from websockets.legacy.client import WebSocketClientProtocol, Connect +from websockets.exceptions import ConnectionClosed +from websockets.typing import Data + +from e2b import SandboxException + +logger = logging.getLogger(__name__) + + +class WebSocket: + def __init__( + self, + url: str, + started: Event, + stopped: Event, + queue_in: Queue[dict], + queue_out: Queue[Data], + ): + self._ws: Optional[WebSocketClientProtocol] = None + self.url = url + self.started = started + self.stopped = stopped + self._process_cleanup: List[Callable[[], Any]] = [] + self._queue_in = queue_in + self._queue_out = queue_out + + def run(self): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + loop.run_until_complete(self.async_run()) + + async def async_run(self): + await self._connect() + await self.close() + + async def _send_message(self): + logger.debug("WebSocket starting to send messages") + while True: + if self._queue_in.empty(): + await asyncio.sleep(0) + continue + message = self._queue_in.get() + logger.debug(f"WebSocket message to send: {message}") + if self._ws: + await self._ws.send(message) + logger.debug(f"WebSocket message sent: {message}") + self._queue_in.task_done() + else: + logger.error("No WebSocket connection") + + async def _receive_message(self): + try: + if not self._ws: + logger.error("No WebSocket connection") + return + async for message in self._ws: + logger.debug(f"WebSocket received message: {message}".strip()) + self._queue_out.put(message) + except Exception as e: + logger.error(f"WebSocket received error while receiving messages: {e}") + + async def _connect(self): + logger.debug(f"WebSocket connecting to {self.url}") + + ws_logger = logger.getChild("websockets.client") + ws_logger.setLevel(logging.ERROR) + + websocket_connector = E2BConnect( + self.url, + max_size=None, + max_queue=None, + logger=ws_logger, + ) + + websocket_connector.BACKOFF_MIN = 1 + websocket_connector.BACKOFF_FACTOR = 1 + websocket_connector.BACKOFF_INITIAL = 0.2 # type: ignore + + async for websocket in websocket_connector: + try: + self._ws = websocket + self.started.set() + logger.info(f"WebSocket connected to {self.url}") + + send_task = asyncio.create_task( + self._send_message(), name="send_message" + ) + self._process_cleanup.append(send_task.cancel) + + receive_task = asyncio.create_task( + self._receive_message(), name="receive_message" + ) + self._process_cleanup.append(receive_task.cancel) + + while not self.stopped.is_set(): + await asyncio.sleep(0) + + logger.info("WebSocket stopped") + break + except ConnectionClosed: + logger.warning("WebSocket disconnected, it will try to reconnect") + if self.stopped.is_set(): + break + + async def close(self): + for cancel in self._process_cleanup: + cancel() + + self._process_cleanup.clear() + + if self._ws: + await self._ws.close() + + +class E2BConnect(Connect): + async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]: + retries = 0 + max_retries = 12 + backoff_delay = 0.1 + while True: + try: + async with self as protocol: + yield protocol + except Exception: + retries += 1 + if retries >= max_retries: + raise SandboxException("Failed to connect to the server") + # Add a random initial delay between 0 and 5 seconds. + # See 7.2.3. Recovering from Abnormal Closure in RFC 6544. + if backoff_delay == 0.1: + initial_delay = random.random() + self.logger.info( + "! connect failed; reconnecting in %.1f seconds", + initial_delay, + exc_info=True, + ) + await asyncio.sleep(initial_delay) + else: + self.logger.info( + "! connect failed again; retrying in %d seconds", + int(backoff_delay), + exc_info=True, + ) + await asyncio.sleep(int(backoff_delay)) + # Increase delay with truncated exponential backoff. + if retries > 4: + backoff_delay = backoff_delay * 1.2 + backoff_delay = min(backoff_delay, 10) + continue + else: + # Connection succeeded - reset backoff delay + backoff_delay = 0.1 diff --git a/python/poetry.lock b/python/poetry.lock index e6417f2d..98db51fa 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aenum" @@ -12,116 +12,6 @@ files = [ {file = "aenum-3.1.15.tar.gz", hash = "sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"}, ] -[[package]] -name = "aiohttp" -version = "3.9.5" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, - {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, - {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, - {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, - {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, - {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, - {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, - {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, - {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, - {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} -attrs = ">=17.3.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - [[package]] name = "annotated-types" version = "0.6.0" @@ -137,34 +27,26 @@ files = [ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} [[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "black" @@ -214,13 +96,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -349,25 +231,24 @@ files = [ [[package]] name = "e2b" -version = "0.17.1" +version = "0.17.2a10" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.1-py3-none-any.whl", hash = "sha256:c0698fd03b639f4dd88eed167a98af4d450668c0ae9805122a98f62f36f2491f"}, - {file = "e2b-0.17.1.tar.gz", hash = "sha256:9e69a059cb73334bac7db189287552af9321fb3ac8ced52557907e10c4310733"}, + {file = "e2b-0.17.2a10-py3-none-any.whl", hash = "sha256:1db226b59875746174f1890b552bd161c8d2b59bc9b5a91a225ce221c00b118f"}, + {file = "e2b-0.17.2a10.tar.gz", hash = "sha256:817bcc7efd9858a7c0ea440d6b5a7caf1287f3361db81618a356509475809d6b"}, ] [package.dependencies] aenum = ">=3.1.11" -aiohttp = ">=3.8.4" -jsonrpcclient = ">=4.0.3" +httpcore = ">=1.0.5,<2.0.0" +httpx = ">=0.27.0,<0.28.0" +protobuf = ">=5.26.1,<6.0.0" pydantic = "*" python-dateutil = ">=2.8.2" -requests = ">=2.31.0" typing-extensions = ">=4.8.0" urllib3 = ">=1.25.3" -websockets = ">=11.0.3" [[package]] name = "exceptiongroup" @@ -384,91 +265,61 @@ files = [ test = ["pytest (>=6)"] [[package]] -name = "frozenlist" -version = "1.4.1" -description = "A list-like structure which implements collections.abc.MutableSequence" +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, - {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, - {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.7" @@ -491,118 +342,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "jsonrpcclient" -version = "4.0.3" -description = "Send JSON-RPC requests" -optional = false -python-versions = ">=3.6" -files = [ - {file = "jsonrpcclient-4.0.3-py3-none-any.whl", hash = "sha256:3cbb9e27e1be29821becf135ea183144a836215422727e1ffe5056a49a670f0d"}, -] - -[package.extras] -qa = ["pytest", "pytest-cov", "tox"] - -[[package]] -name = "multidict" -version = "6.0.5" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, -] - [[package]] name = "mypy-extensions" version = "1.0.0" @@ -666,6 +405,26 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "protobuf" +version = "5.27.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.2-cp310-abi3-win32.whl", hash = "sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38"}, + {file = "protobuf-5.27.2-cp310-abi3-win_amd64.whl", hash = "sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505"}, + {file = "protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e"}, + {file = "protobuf-5.27.2-cp38-cp38-win32.whl", hash = "sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863"}, + {file = "protobuf-5.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6"}, + {file = "protobuf-5.27.2-cp39-cp39-win32.whl", hash = "sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca"}, + {file = "protobuf-5.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce"}, + {file = "protobuf-5.27.2-py3-none-any.whl", hash = "sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470"}, + {file = "protobuf-5.27.2.tar.gz", hash = "sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714"}, +] + [[package]] name = "pydantic" version = "2.6.4" @@ -843,13 +602,13 @@ cli = ["click (>=5.0)"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -873,6 +632,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -897,13 +667,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -1009,110 +779,7 @@ files = [ {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] -[[package]] -name = "yarl" -version = "1.9.4" -description = "Yet another URL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "4062bc8f4cfc5979c0fda25e723f51397719f5147f8cd8b521989f5cafcb0b9e" +content-hash = "974c1728366275810eda7188edf69c90b2d003fabd3d3fd1d68a879f633ce0f2" diff --git a/python/pyproject.toml b/python/pyproject.toml index 9ba4f10e..9a8ef10d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,9 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" -e2b = ">=0.17.1" +websockets = "^12.0" +e2b = "0.17.2a10" +requests = "^2.32.3" [tool.poetry.group.dev.dependencies] black = "^24.3.0" diff --git a/python/tests/test_reconnect.py b/python/tests/test_reconnect.py index 5a3669c4..e4fad3ab 100644 --- a/python/tests/test_reconnect.py +++ b/python/tests/test_reconnect.py @@ -3,9 +3,9 @@ def test_reconnect(): with CodeInterpreter() as sandbox: - sandbox_id = sandbox.id + sandbox_id = sandbox.sandbox_id - sandbox = CodeInterpreter.reconnect(sandbox_id) + sandbox = CodeInterpreter.connect(sandbox_id) result = sandbox.notebook.exec_cell("x =1; x") assert result.text == "1" From a3b9ebde6255ff5196c078dc777991952aaefc5c Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:28:22 -0700 Subject: [PATCH 044/722] Fix reconnect test --- python/tests/test_reconnect.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/tests/test_reconnect.py b/python/tests/test_reconnect.py index e4fad3ab..f0b891e5 100644 --- a/python/tests/test_reconnect.py +++ b/python/tests/test_reconnect.py @@ -2,11 +2,11 @@ def test_reconnect(): - with CodeInterpreter() as sandbox: - sandbox_id = sandbox.sandbox_id + sandbox = CodeInterpreter() + sandbox_id = sandbox.sandbox_id + sandbox.close() - sandbox = CodeInterpreter.connect(sandbox_id) - result = sandbox.notebook.exec_cell("x =1; x") + sandbox2 = CodeInterpreter.connect(sandbox_id) + result = sandbox2.notebook.exec_cell("x =1; x") + sandbox2.close() assert result.text == "1" - - sandbox.close() From 0ab7d0486c6e66d38d786645418cc7fd3706ab85 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:40:24 -0700 Subject: [PATCH 045/722] Clarify timeouts --- js/src/codeInterpreter.ts | 6 ++--- js/src/messaging.ts | 8 +++---- python/e2b_code_interpreter/main.py | 34 +++++++++++++++++------------ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 92b0e76b..09e88827 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -56,7 +56,7 @@ export class JupyterExtension { * @param onStdout A callback function to handle standard output messages from the code execution. * @param onStderr A callback function to handle standard error messages from the code execution. * @param onResult A callback function to handle display data messages from the code execution. - * @param timeout The maximum time to wait for the code execution to complete, in milliseconds. + * @param timeoutMs The maximum time to wait for the code execution to complete, in milliseconds. * @returns A promise that resolves with the result of the code execution. */ async execCell( @@ -66,13 +66,13 @@ export class JupyterExtension { onStdout, onStderr, onResult, - timeout + timeoutMs: timeout }: { kernelID?: string onStdout?: (msg: CellMessage) => any onStderr?: (msg: CellMessage) => any onResult?: (data: Result) => any - timeout?: number + timeoutMs?: number } = {} ): Promise { kernelID = kernelID || (await this.defaultKernelID) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index fb23a42a..ddce36f5 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -444,7 +444,7 @@ export class JupyterKernelWebSocket { * @param onStdout Callback for stdout messages. * @param onStderr Callback for stderr messages. * @param onResult Callback function to handle the result and display calls of the code execution. - * @param timeout Time in milliseconds to wait for response. + * @param timeoutMs Time in milliseconds to wait for response. * @returns Promise with execution result. */ public sendExecutionMessage( @@ -452,7 +452,7 @@ export class JupyterKernelWebSocket { onStdout?: (out: CellMessage) => any, onStderr?: (out: CellMessage) => any, onResult?: (data: Result) => any, - timeout?: number + timeoutMs?: number ) { return new Promise((resolve, reject) => { const msgID = id(16) @@ -460,7 +460,7 @@ export class JupyterKernelWebSocket { // give limited time for response let timeoutSet: number | NodeJS.Timeout - if (timeout) { + if (timeoutMs) { timeoutSet = setTimeout(() => { // stop waiting for response delete this.idAwaiter[msgID] @@ -469,7 +469,7 @@ export class JupyterKernelWebSocket { `Awaiting response to "${code}" with id: ${msgID} timed out.` ) ) - }, timeout) + }, timeoutMs) } // expect response diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index ff0ad33a..e0bc612a 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -80,6 +80,7 @@ def exec_cell( on_stdout: Optional[Callable[[CellMessage], Any]] = None, on_stderr: Optional[Callable[[CellMessage], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, + timeout: float = TIMEOUT, request_timeout: float = TIMEOUT, ) -> Execution: """ @@ -101,7 +102,7 @@ def exec_cell( if ws_future: logger.debug(f"Using existing websocket connection to kernel {kernel_id}") - ws = ws_future.result(timeout=request_timeout) + ws = ws_future.result(timeout=timeout) else: logger.debug(f"Creating new websocket connection to kernel {kernel_id}") ws = self._connect_to_kernel_ws( @@ -115,7 +116,7 @@ def exec_cell( f"Sent execution message to kernel {kernel_id}, message_id: {message_id}" ) - result = ws.get_result(message_id, timeout=request_timeout) + result = ws.get_result(message_id, timeout=timeout) logger.debug( f"Received result from kernel {kernel_id}, message_id: {message_id}, result: {result}" ) @@ -139,7 +140,7 @@ def create_kernel( self, cwd: str = "/home/user", kernel_name: Optional[str] = None, - timeout: Optional[float] = TIMEOUT, + request_timeout: Optional[float] = TIMEOUT, ) -> str: """ Creates a new kernel, this can be useful if you want to have multiple independent code execution environments. @@ -153,7 +154,7 @@ def create_kernel( :param kernel_name: Specifies which kernel should be used, useful if you have multiple kernel types. If not provided, the default kernel will be used. - :param timeout: Timeout for the kernel creation request. + :param request_timeout: Timeout for the kernel creation request. :return: Kernel id of the created kernel """ kernel_name = kernel_name or "python3" @@ -169,7 +170,7 @@ def create_kernel( response = requests.post( f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions", json=data, - timeout=timeout, + timeout=request_timeout, ) if not response.ok: raise KernelException(f"Failed to create kernel: {response.text}") @@ -181,7 +182,7 @@ def create_kernel( response = requests.patch( f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions/{session_id}", json={"path": cwd}, - timeout=timeout, + timeout=request_timeout, ) if not response.ok: raise KernelException(f"Failed to create kernel: {response.text}") @@ -189,12 +190,15 @@ def create_kernel( logger.debug(f"Created kernel {kernel_id}") threading.Thread( - target=self._connect_to_kernel_ws, args=(kernel_id, session_id, timeout) + target=self._connect_to_kernel_ws, + args=(kernel_id, session_id, request_timeout), ).start() return kernel_id def restart_kernel( - self, kernel_id: Optional[str] = None, timeout: Optional[float] = TIMEOUT + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = TIMEOUT, ) -> None: """ Restarts an existing Jupyter kernel. This can be useful to reset the kernel's state or to recover from errors. @@ -211,7 +215,7 @@ def restart_kernel( response = requests.post( f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}/restart", - timeout=timeout, + timeout=request_timeout, ) if not response.ok: raise KernelException(f"Failed to restart kernel {kernel_id}") @@ -219,11 +223,13 @@ def restart_kernel( logger.debug(f"Restarted kernel {kernel_id}") threading.Thread( - target=self._connect_to_kernel_ws, args=(kernel_id, None, timeout) + target=self._connect_to_kernel_ws, args=(kernel_id, None, request_timeout) ).start() def shutdown_kernel( - self, kernel_id: Optional[str] = None, timeout: Optional[float] = TIMEOUT + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = TIMEOUT, ) -> None: """ Shuts down an existing Jupyter kernel. This method is used to gracefully terminate a kernel's process. @@ -240,14 +246,14 @@ def shutdown_kernel( response = requests.delete( f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}", - timeout=timeout, + timeout=request_timeout, ) if not response.ok: raise KernelException(f"Failed to shutdown kernel {kernel_id}") logger.debug(f"Shutdown kernel {kernel_id}") - def list_kernels(self, timeout: Optional[float] = TIMEOUT) -> List[str]: + def list_kernels(self, request_timeout: Optional[float] = TIMEOUT) -> List[str]: """ Lists all available Jupyter kernels. @@ -259,7 +265,7 @@ def list_kernels(self, timeout: Optional[float] = TIMEOUT) -> List[str]: """ response = requests.get( f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels", - timeout=timeout, + timeout=request_timeout, ) if not response.ok: From 7cbd4426495775f21ba391443f799c996cf0ff61 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:43:19 -0700 Subject: [PATCH 046/722] Make override explicit --- js/src/codeInterpreter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 09e88827..528edc7d 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -11,7 +11,7 @@ interface Kernels { * E2B code interpreter sandbox extension. */ export class CodeInterpreter extends Sandbox { - protected static readonly defaultTemplate: string = 'code-interpreter-stateful' + protected static override readonly defaultTemplate: string = 'code-interpreter-stateful' readonly notebook = new JupyterExtension(this) From b957fc27957e076fb9a9e86bb0b103bfe647fae6 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 27 Jun 2024 14:44:44 -0700 Subject: [PATCH 047/722] Fix None param error --- python/e2b_code_interpreter/main.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index e0bc612a..d8eeab52 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -32,7 +32,7 @@ def __init__( domain: Optional[str] = None, debug: Optional[bool] = None, sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None, + request_timeout: float = TIMEOUT, ): super().__init__( template=template, @@ -63,10 +63,7 @@ def get_protocol(self, base_protocol: str = "http") -> str: class JupyterExtension: - - def __init__( - self, sandbox: CodeInterpreter, request_timeout: Optional[float] = TIMEOUT - ): + def __init__(self, sandbox: CodeInterpreter, request_timeout: float = TIMEOUT): self._sandbox = sandbox self._kernel_id_set = Future() self._start_connecting_to_default_kernel(request_timeout=request_timeout) @@ -312,7 +309,7 @@ def _connect_to_kernel_ws( return ws def _start_connecting_to_default_kernel( - self, request_timeout: Optional[float] = TIMEOUT + self, request_timeout: float = TIMEOUT ) -> None: """ Start connecting to the default kernel in a separate thread to avoid blocking the main thread. From 3ab9d061bbc805b4572dd13c39c993e4293e2e28 Mon Sep 17 00:00:00 2001 From: amrrs <1littlecoder@gmail.com> Date: Fri, 28 Jun 2024 17:57:29 +0530 Subject: [PATCH 048/722] fixing example paths --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 848edea4..68e11b34 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ Dive depeer and check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello - [Python](https://e2b.dev/docs/hello-world/py) **LLM Providers** -- 🪸 [Claude with code intepreter](https://github.com/e2b-dev/e2b-cookbook/blob/main/examples/claude-code-interpreter/claude_code_interpreter.ipynb) -- 🦙 [Llama 3 with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/llama-3-code-interpreter) +- 🪸 [Claude with code intepreter](https://github.com/e2b-dev/e2b-cookbook/blob/main/examples/claude-code-interpreter-python/claude_code_interpreter.ipynb) +- 🦙 [Llama 3 with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/llama-3-code-interpreter-python) - [Mixtral with code interpreter and chat UI](https://github.com/e2b-dev/e2b-cookbook/tree/main/templates/mixtral-8x7b-code-interpreter-nextjs) **AI Frameworks** From e1a876ef1190c339d953a1ef2ae234fab3e0dc8a Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 29 Jun 2024 12:35:49 -0700 Subject: [PATCH 049/722] Fix ws connection in JS SDK; Update core SDK --- js/package.json | 2 +- js/src/codeInterpreter.ts | 2 +- pnpm-lock.yaml | 13 +++++++++---- python/example.py | 2 +- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/js/package.json b/js/package.json index 28caec1c..58c8c6ea 100644 --- a/js/package.json +++ b/js/package.json @@ -60,7 +60,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.1", + "e2b": "0.16.2-beta.9", "isomorphic-ws": "^5.0.0", "ws": "^8.15.1" }, diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 528edc7d..00470815 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -24,7 +24,7 @@ export class CodeInterpreter extends Sandbox { } getProtocol(baseProtocol: string = 'http') { - return this.connectionConfig.debug ? `${baseProtocol}s` : baseProtocol + return this.connectionConfig.debug ? baseProtocol : `${baseProtocol}s` } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5692c7b2..027274c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.1 - version: 0.16.2-beta.1 + specifier: 0.16.2-beta.9 + version: 0.16.2-beta.9 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.16.0) @@ -1931,6 +1931,10 @@ packages: engines: {node: '>= 6'} dev: true + /compare-versions@6.1.0: + resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + dev: false + /compose-function@3.0.3: resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} dependencies: @@ -2157,13 +2161,14 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.1: - resolution: {integrity: sha512-/lA0bb/DBbMZzHI7UyZ4m/vjLNwwKcRnI5WSmgzKEeHvWJkpfabY8S+DIQY+OIqQYcMu3gTjFj5VHpEHd9n3Ag==} + /e2b@0.16.2-beta.9: + resolution: {integrity: sha512-dK6jDQKHHkyqJ8nj1er3kLstxWsbUTEIaWoVrxtR3fjSqBRkJuMPVX7GDZDlefZnAlQx+ODHkmyFO91Mmdjh5A==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0) + compare-versions: 6.1.0 openapi-fetch: 0.9.8 platform: 1.3.6 dev: false diff --git a/python/example.py b/python/example.py index a1aec4bd..5634b0f9 100644 --- a/python/example.py +++ b/python/example.py @@ -24,7 +24,7 @@ """ with CodeInterpreter() as sandbox: - print(sandbox.id) + print(sandbox.sandbox_id) execution = sandbox.notebook.exec_cell(code) print(execution.results[0].formats()) diff --git a/python/poetry.lock b/python/poetry.lock index 98db51fa..876eb1c9 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -231,13 +231,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a10" +version = "0.17.2a17" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a10-py3-none-any.whl", hash = "sha256:1db226b59875746174f1890b552bd161c8d2b59bc9b5a91a225ce221c00b118f"}, - {file = "e2b-0.17.2a10.tar.gz", hash = "sha256:817bcc7efd9858a7c0ea440d6b5a7caf1287f3361db81618a356509475809d6b"}, + {file = "e2b-0.17.2a17-py3-none-any.whl", hash = "sha256:390b76d2d8f693ef92f22d0c31bcf09de4ace6bdcfede185b673964774a214f3"}, + {file = "e2b-0.17.2a17.tar.gz", hash = "sha256:7988825c82302bf746ecf9f78d8924a2d5d9a3cadf90980035f70fcb1652e4f3"}, ] [package.dependencies] @@ -782,4 +782,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "974c1728366275810eda7188edf69c90b2d003fabd3d3fd1d68a879f633ce0f2" +content-hash = "84f77f3ae7bac9da7eacdac00ab507c7341b0abacb6e9c05157b0dcca9fbd959" diff --git a/python/pyproject.toml b/python/pyproject.toml index 9a8ef10d..110e6b64 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a10" +e2b = "0.17.2a17" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From 39af6c2c21cef998773bf7942c7a21df5b98cbdb Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 29 Jun 2024 13:13:43 -0700 Subject: [PATCH 050/722] Fix tests and exported type --- js/example.js | 11 - js/example.mts | 16 + js/package.json | 17 +- js/src/index.ts | 2 +- js/tests/streaming.test.ts | 7 +- js/vitest.config.ts | 22 +- pnpm-lock.yaml | 1010 ++++++++--------------- python/e2b_code_interpreter/__init__.py | 1 + python/e2b_code_interpreter/main.py | 4 + python/package.json | 2 +- 10 files changed, 419 insertions(+), 673 deletions(-) delete mode 100644 js/example.js create mode 100644 js/example.mts diff --git a/js/example.js b/js/example.js deleted file mode 100644 index 0e339030..00000000 --- a/js/example.js +++ /dev/null @@ -1,11 +0,0 @@ -const { CodeInterpreter } = require('./dist') -const dotenv = require('dotenv') -dotenv.config() - -async function main() { - const sandbox = await CodeInterpreter.create() - const r = await sandbox.notebook.execCell('x = 1; x') - console.log(r) -} - -main().catch(console.error) diff --git a/js/example.mts b/js/example.mts new file mode 100644 index 00000000..6dba5500 --- /dev/null +++ b/js/example.mts @@ -0,0 +1,16 @@ +import dotenv from 'dotenv' + +import { CodeInterpreter } from './dist' + +dotenv.config() + +console.log('api', process.env.E2B_API_KEY) +console.log('api', process.env.E2B_DOMAIN) + + +const start = Date.now() + +const sandbox = await CodeInterpreter.create() +console.log(`Time taken: ${Date.now() - start}ms`) +const r = await sandbox.notebook.execCell('x = 1; x') +console.log(r) diff --git a/js/package.json b/js/package.json index 58c8c6ea..60ae3cff 100644 --- a/js/package.json +++ b/js/package.json @@ -29,17 +29,18 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "check-deps": "knip", - "update-deps": "ncu -u && pnpm i" + "update-deps": "ncu -u && pnpm i", + "example": "npx tsx example.mts" }, "devDependencies": { "@types/node": "^18.18.6", "@types/ws": "^8.5.10", "dotenv": "^16.4.5", - "knip": "^2.34.0", - "npm-check-updates": "^16.14.6", - "tsup": "^6.7.0", - "typescript": "^5.2.2", - "vitest": "^0.34.6" + "knip": "^5.23.2", + "npm-check-updates": "^16.14.20", + "tsup": "^8.1.0", + "typescript": "^5.5.2", + "vitest": "^1.6.0" }, "files": [ "dist", @@ -62,11 +63,11 @@ "dependencies": { "e2b": "0.16.2-beta.9", "isomorphic-ws": "^5.0.0", - "ws": "^8.15.1" + "ws": "^8.17.1" }, "optionalDependencies": { "bufferutil": "^4.0.8", - "utf-8-validate": "^6.0.3" + "utf-8-validate": "^6.0.4" }, "engines": { "node": ">=18" diff --git a/js/src/index.ts b/js/src/index.ts index 1c4febf9..ec3c3a38 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,6 +1,6 @@ export { CodeInterpreter, JupyterExtension } from './codeInterpreter' -export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData } from './messaging' +export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData, CellMessage } from './messaging' import { CodeInterpreter } from './codeInterpreter' diff --git a/js/tests/streaming.test.ts b/js/tests/streaming.test.ts index 9593c65c..c39545c0 100644 --- a/js/tests/streaming.test.ts +++ b/js/tests/streaming.test.ts @@ -1,10 +1,9 @@ -import { ProcessMessage } from 'e2b' -import { CodeInterpreter, Result } from '../src' +import { CodeInterpreter, Result, CellMessage } from '../src' import { expect, test } from 'vitest' test('streaming output', async () => { - const out: ProcessMessage[] = [] + const out: CellMessage[] = [] const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell('print(1)', { onStdout: (msg) => out.push(msg) @@ -16,7 +15,7 @@ test('streaming output', async () => { }) test('streaming error', async () => { - const out: ProcessMessage[] = [] + const out: CellMessage[] = [] const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell('import sys;print(1, file=sys.stderr)', { onStderr: (msg) => out.push(msg) diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 8afb2e7f..f5661934 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -1,16 +1,28 @@ import { defineConfig } from 'vitest/config' +import { config } from 'dotenv' + +const env = config() export default defineConfig({ test: { - threads: false, - setupFiles: ['dotenv/config'], + poolOptions: { + threads: { + minThreads: 1, + maxThreads: 4, + }, + }, + maxWorkers: 5, globals: false, testTimeout: 20000, environment: 'node', bail: 1, server: {}, deps: { - interopDefault: true - } - } + interopDefault: true, + }, + env: { + ...process.env as Record, + ...env.parsed, + }, + }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 027274c9..4766f21a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,21 +25,21 @@ importers: version: 0.16.2-beta.9 isomorphic-ws: specifier: ^5.0.0 - version: 5.0.0(ws@8.16.0) + version: 5.0.0(ws@8.17.1) ws: - specifier: ^8.15.1 - version: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + specifier: ^8.17.1 + version: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) optionalDependencies: bufferutil: specifier: ^4.0.8 version: 4.0.8 utf-8-validate: - specifier: ^6.0.3 + specifier: ^6.0.4 version: 6.0.4 devDependencies: '@types/node': specifier: ^18.18.6 - version: 18.19.26 + version: 18.18.6 '@types/ws': specifier: ^8.5.10 version: 8.5.10 @@ -47,20 +47,20 @@ importers: specifier: ^16.4.5 version: 16.4.5 knip: - specifier: ^2.34.0 - version: 2.43.0 + specifier: ^5.23.2 + version: 5.23.2(@types/node@18.18.6)(typescript@5.5.2) npm-check-updates: - specifier: ^16.14.6 - version: 16.14.18 + specifier: ^16.14.20 + version: 16.14.20 tsup: - specifier: ^6.7.0 - version: 6.7.0(typescript@5.4.3) + specifier: ^8.1.0 + version: 8.1.0(typescript@5.5.2) typescript: - specifier: ^5.2.2 - version: 5.4.3 + specifier: ^5.5.2 + version: 5.5.2 vitest: - specifier: ^0.34.6 - version: 0.34.6 + specifier: ^1.6.0 + version: 1.6.0(@types/node@18.18.6) python: {} @@ -356,15 +356,13 @@ packages: '@bufbuild/protobuf': 1.10.0 dev: false - /@ericcornelissen/bash-parser@0.5.2: - resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} + /@ericcornelissen/bash-parser@0.5.3: + resolution: {integrity: sha512-9Z0sGuXqf6En19qmwB0Syi1Mc8TYl756dNuuaYal9mrypKa0Jq/IX6aJfh6Rk2S3z66KBisWTqloDo7weYj4zg==} engines: {node: '>=4'} dependencies: array-last: 1.3.0 babylon: 6.18.0 compose-function: 3.0.3 - deep-freeze: 0.0.1 - filter-iterator: 0.0.1 filter-obj: 1.1.0 has-own-property: 0.1.0 identity-function: 1.0.0 @@ -390,11 +388,11 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] requiresBuild: true dev: true optional: true @@ -408,10 +406,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true @@ -426,10 +424,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm] os: [android] requiresBuild: true dev: true @@ -444,11 +442,11 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] requiresBuild: true dev: true optional: true @@ -462,10 +460,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [darwin] requiresBuild: true dev: true @@ -480,11 +478,11 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true @@ -498,10 +496,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [freebsd] requiresBuild: true dev: true @@ -516,11 +514,11 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true @@ -534,10 +532,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true @@ -552,10 +550,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm] os: [linux] requiresBuild: true dev: true @@ -570,10 +568,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -588,10 +586,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [loong64] os: [linux] requiresBuild: true dev: true @@ -606,10 +604,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true @@ -624,10 +622,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -642,10 +640,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -660,10 +658,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} - cpu: [x64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true @@ -678,11 +676,11 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [linux] requiresBuild: true dev: true optional: true @@ -696,11 +694,11 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [netbsd] requiresBuild: true dev: true optional: true @@ -714,11 +712,11 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] - os: [sunos] + os: [openbsd] requiresBuild: true dev: true optional: true @@ -732,11 +730,11 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] requiresBuild: true dev: true optional: true @@ -750,10 +748,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm64] os: [win32] requiresBuild: true dev: true @@ -768,10 +766,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: true @@ -786,6 +784,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true @@ -867,11 +874,24 @@ packages: run-parallel: 1.2.0 dev: true + /@nodelib/fs.scandir@3.0.0: + resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} + engines: {node: '>=16.14.0'} + dependencies: + '@nodelib/fs.stat': 3.0.0 + run-parallel: 1.2.0 + dev: true + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true + /@nodelib/fs.stat@3.0.0: + resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} + engines: {node: '>=16.14.0'} + dev: true + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} @@ -880,6 +900,14 @@ packages: fastq: 1.17.1 dev: true + /@nodelib/fs.walk@2.0.0: + resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} + engines: {node: '>=16.14.0'} + dependencies: + '@nodelib/fs.scandir': 3.0.0 + fastq: 1.17.1 + dev: true + /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -920,16 +948,6 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true - /@npmcli/map-workspaces@3.0.4: - resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.10 - minimatch: 9.0.3 - read-package-json-fast: 3.0.2 - dev: true - /@npmcli/move-file@2.0.1: resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -939,11 +957,6 @@ packages: rimraf: 3.0.2 dev: true - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - /@npmcli/node-gyp@3.0.0: resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -973,60 +986,15 @@ packages: /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + requiresBuild: true dev: true + optional: true /@pnpm/config.env-replace@1.1.0: resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} dev: true - /@pnpm/constants@7.1.1: - resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} - engines: {node: '>=16.14'} - dev: true - - /@pnpm/core-loggers@9.0.4(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-P5IiCwLbYy/vlCDTxEMReB67NVs1Y4ip6iIEM3Y1fbxm0JbPMWTUMKGf2fy7eqGDF3/Vuxk5H7o/A4II6SWzMA==} - engines: {node: '>=16.14'} - peerDependencies: - '@pnpm/logger': ^5.0.0 - dependencies: - '@pnpm/logger': 5.0.0 - '@pnpm/types': 9.4.0 - dev: true - - /@pnpm/error@5.0.2: - resolution: {integrity: sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg==} - engines: {node: '>=16.14'} - dependencies: - '@pnpm/constants': 7.1.1 - dev: true - - /@pnpm/fetching-types@5.0.0: - resolution: {integrity: sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q==} - engines: {node: '>=16.14'} - dependencies: - '@zkochan/retry': 0.2.0 - node-fetch: 3.0.0-beta.9 - transitivePeerDependencies: - - domexception - dev: true - - /@pnpm/graceful-fs@3.2.0: - resolution: {integrity: sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==} - engines: {node: '>=16.14'} - dependencies: - graceful-fs: 4.2.11 - dev: true - - /@pnpm/logger@5.0.0: - resolution: {integrity: sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw==} - engines: {node: '>=12.17'} - dependencies: - bole: 5.0.11 - ndjson: 2.0.0 - dev: true - /@pnpm/network.ca-file@1.0.2: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} @@ -1043,83 +1011,6 @@ packages: config-chain: 1.1.13 dev: true - /@pnpm/npm-package-arg@1.0.0: - resolution: {integrity: sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw==} - engines: {node: '>=14.6'} - dependencies: - hosted-git-info: 4.1.0 - semver: 7.6.0 - validate-npm-package-name: 4.0.0 - dev: true - - /@pnpm/npm-resolver@18.0.0(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-FGHmnRjSf7tQHagk6bMrUtHvZbz3ROUoGRDrpMyqJo///+S7SZt/hSDS77PhZ7T6PRXipkFyUtRkqtHmGKFCAg==} - engines: {node: '>=16.14'} - peerDependencies: - '@pnpm/logger': ^5.0.0 - dependencies: - '@pnpm/core-loggers': 9.0.4(@pnpm/logger@5.0.0) - '@pnpm/error': 5.0.2 - '@pnpm/fetching-types': 5.0.0 - '@pnpm/graceful-fs': 3.2.0 - '@pnpm/logger': 5.0.0 - '@pnpm/resolve-workspace-range': 5.0.1 - '@pnpm/resolver-base': 11.0.0 - '@pnpm/types': 9.4.0 - '@zkochan/retry': 0.2.0 - encode-registry: 3.0.1 - load-json-file: 6.2.0 - lru-cache: 10.2.0 - normalize-path: 3.0.0 - p-limit: 3.1.0 - p-memoize: 4.0.1 - parse-npm-tarball-url: 3.0.0 - path-temp: 2.1.0 - ramda: /@pnpm/ramda@0.28.1 - rename-overwrite: 4.0.4 - semver: 7.6.0 - ssri: 10.0.5 - version-selector-type: 3.0.0 - transitivePeerDependencies: - - domexception - dev: true - - /@pnpm/ramda@0.28.1: - resolution: {integrity: sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==} - dev: true - - /@pnpm/resolve-workspace-range@5.0.1: - resolution: {integrity: sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg==} - engines: {node: '>=16.14'} - dependencies: - semver: 7.6.0 - dev: true - - /@pnpm/resolver-base@11.0.0: - resolution: {integrity: sha512-oxfjO8Ie6aBQPXSqOWGJP9s0xj9Z4cbRI7fK63WKhjwmNH4CTrSfikRL2o4FoXo2APAbJEUp2lCxx+86dq2tUg==} - engines: {node: '>=16.14'} - dependencies: - '@pnpm/types': 9.4.0 - dev: true - - /@pnpm/types@9.4.0: - resolution: {integrity: sha512-IRDuIuNobLRQe0UyY2gbrrTzYS46tTNvOEfL6fOf0Qa8NyxUzeXz946v7fQuQE3LSBf8ENBC5SXhRmDl+mBEqA==} - engines: {node: '>=16.14'} - dev: true - - /@pnpm/workspace.pkgs-graph@2.0.11(@pnpm/logger@5.0.0): - resolution: {integrity: sha512-VRX7E7pX92C0akCMYGzsTqJoOwQS7/8R40pAPK7smgaEpKeEgVThqnIXt+wPdseD5CzS7OzMaIWlT3WXr3O5rQ==} - engines: {node: '>=16.14'} - dependencies: - '@pnpm/npm-package-arg': 1.0.0 - '@pnpm/npm-resolver': 18.0.0(@pnpm/logger@5.0.0) - '@pnpm/resolve-workspace-range': 5.0.1 - ramda: /@pnpm/ramda@0.28.1 - transitivePeerDependencies: - - '@pnpm/logger' - - domexception - dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] @@ -1301,16 +1192,6 @@ packages: minimatch: 9.0.3 dev: true - /@types/chai-subset@1.3.5: - resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} - dependencies: - '@types/chai': 4.3.14 - dev: true - - /@types/chai@4.3.14: - resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} - dev: true - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true @@ -1327,8 +1208,12 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@18.19.26: - resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} + /@types/node@18.18.6: + resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} + dev: true + + /@types/node@20.14.9: + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} dependencies: undici-types: 5.26.5 dev: true @@ -1348,59 +1233,48 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 18.19.26 + '@types/node': 20.14.9 dev: true - /@vitest/expect@0.34.6: - resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} dependencies: - '@vitest/spy': 0.34.6 - '@vitest/utils': 0.34.6 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 dev: true - /@vitest/runner@0.34.6: - resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} dependencies: - '@vitest/utils': 0.34.6 - p-limit: 4.0.0 + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@0.34.6: - resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@0.34.6: - resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@0.34.6: - resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} dependencies: diff-sequences: 29.6.3 + estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 dev: true - /@zkochan/retry@0.2.0: - resolution: {integrity: sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw==} - engines: {node: '>=10'} - dev: true - - /@zkochan/rimraf@2.1.3: - resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==} - engines: {node: '>=12.10'} - dependencies: - rimraf: 3.0.2 - dev: true - /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -1504,6 +1378,7 @@ packages: /are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: delegates: 1.0.0 readable-stream: 3.6.2 @@ -1604,13 +1479,6 @@ packages: engines: {node: '>=8'} dev: true - /bole@5.0.11: - resolution: {integrity: sha512-KB0Ye0iMAW5BnNbnLfMSQcnI186hKUzE2fpkZWqcxsoTR7eqzlTidSOMYPHJOn/yR7VGH7uSZp37qH9q2Et0zQ==} - dependencies: - fast-safe-stringify: 2.1.1 - individual: 3.0.0 - dev: true - /boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -1669,13 +1537,13 @@ packages: semver: 7.6.0 dev: true - /bundle-require@4.0.2(esbuild@0.17.19): + /bundle-require@4.0.2(esbuild@0.21.5): resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.17.19 + esbuild: 0.21.5 load-tsconfig: 0.2.5 dev: true @@ -1984,11 +1852,6 @@ packages: which: 2.0.2 dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: true - /crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} @@ -2018,11 +1881,6 @@ packages: stream-transform: 2.1.3 dev: true - /data-uri-to-buffer@3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} - dev: true - /data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -2094,10 +1952,6 @@ packages: engines: {node: '>=4.0.0'} dev: true - /deep-freeze@0.0.1: - resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} - dev: true - /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} requiresBuild: true @@ -2193,13 +2047,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /encode-registry@3.0.1: - resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==} - engines: {node: '>=10'} - dependencies: - mem: 8.1.1 - dev: true - /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true @@ -2326,36 +2173,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - /esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -2387,6 +2204,37 @@ packages: '@esbuild/win32-x64': 0.20.2 dev: true + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -2408,6 +2256,12 @@ packages: hasBin: true dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2423,6 +2277,21 @@ packages: strip-final-newline: 2.0.0 dev: true + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: true @@ -2455,26 +2324,12 @@ packages: resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} dev: true - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true - /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 dev: true - /fetch-blob@2.1.2: - resolution: {integrity: sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==} - engines: {node: ^10.17.0 || >=12.3.0} - peerDependencies: - domexception: '*' - peerDependenciesMeta: - domexception: - optional: true - dev: true - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2482,10 +2337,6 @@ packages: to-regex-range: 5.0.1 dev: true - /filter-iterator@0.0.1: - resolution: {integrity: sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==} - dev: true - /filter-obj@1.1.0: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} @@ -2538,15 +2389,6 @@ packages: engines: {node: '>=10'} dev: true - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2612,6 +2454,7 @@ packages: /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -2653,6 +2496,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -2683,6 +2531,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2695,6 +2544,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2729,17 +2579,6 @@ packages: slash: 3.0.0 dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -2841,13 +2680,6 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - /hosted-git-info@5.2.1: resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2904,6 +2736,11 @@ packages: engines: {node: '>=10.17.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -2957,16 +2794,13 @@ packages: engines: {node: '>=8'} dev: true - /individual@3.0.0: - resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==} - dev: true - /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -3168,6 +3002,11 @@ packages: engines: {node: '>=8'} dev: true + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -3224,12 +3063,12 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isomorphic-ws@5.0.0(ws@8.16.0): + /isomorphic-ws@5.0.0(ws@8.17.1): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: ws: '*' dependencies: - ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) dev: false /iterable-lookahead@1.0.0: @@ -3264,6 +3103,10 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3302,10 +3145,6 @@ packages: jju: 1.4.0 dev: true - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3322,14 +3161,6 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - /jsonlines@0.1.1: resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} dev: true @@ -3355,33 +3186,34 @@ packages: engines: {node: '>=6'} dev: true - /knip@2.43.0: - resolution: {integrity: sha512-xXtBpC+XiHZzqBoXtvqH0sLV3iSMu9yPIUoP9GRZVUHAegQyDjC4jOTRfFgc5gJKrfqW4NKc71t7l85NqYieUg==} - engines: {node: '>=16.17.0 <17 || >=18.6.0'} + /knip@5.23.2(@types/node@18.18.6)(typescript@5.5.2): + resolution: {integrity: sha512-3IbIzu2K6mB4aLBLkhYWYLVL5kbyjgDW3LPW4wFN9fl4I8F7VK5gF/m9C0HZmTBmoW9OkCzQapBv6H7E1+NI1g==} + engines: {node: '>=18.6.0'} hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4' dependencies: - '@ericcornelissen/bash-parser': 0.5.2 - '@npmcli/map-workspaces': 3.0.4 - '@pkgjs/parseargs': 0.11.0 - '@pnpm/logger': 5.0.0 - '@pnpm/workspace.pkgs-graph': 2.0.11(@pnpm/logger@5.0.0) + '@ericcornelissen/bash-parser': 0.5.3 + '@nodelib/fs.walk': 2.0.0 '@snyk/github-codeowners': 1.1.0 - chalk: 5.3.0 + '@types/node': 18.18.6 easy-table: 1.2.0 fast-glob: 3.3.2 - globby: 13.2.2 jiti: 1.21.0 js-yaml: 4.1.0 - micromatch: 4.0.5 minimist: 1.2.8 - pretty-ms: 8.0.0 + picocolors: 1.0.0 + picomatch: 4.0.2 + pretty-ms: 9.0.0 + resolve: 1.22.8 + smol-toml: 1.2.2 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.4.3 + tsconfig-paths: 4.2.0 + typescript: 5.5.2 zod: 3.22.4 - zod-validation-error: 1.5.0(zod@3.22.4) - transitivePeerDependencies: - - domexception + zod-validation-error: 3.3.0(zod@3.22.4) dev: true /latest-version@7.0.0: @@ -3391,25 +3223,15 @@ packages: package-json: 8.1.1 dev: true - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + /lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - dev: true - /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3425,9 +3247,12 @@ packages: strip-bom: 3.0.0 dev: true - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 dev: true /locate-path@5.0.0: @@ -3556,13 +3381,6 @@ packages: - supports-color dev: true - /map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} - dependencies: - p-defer: 1.0.0 - dev: true - /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -3578,22 +3396,6 @@ packages: engines: {node: '>=8'} dev: true - /mem@6.1.1: - resolution: {integrity: sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==} - engines: {node: '>=8'} - dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 3.1.0 - dev: true - - /mem@8.1.1: - resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} - engines: {node: '>=10'} - dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 3.1.0 - dev: true - /meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -3633,9 +3435,9 @@ packages: engines: {node: '>=6'} dev: true - /mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} dev: true /mimic-response@3.1.0: @@ -3810,33 +3612,11 @@ packages: hasBin: true dev: true - /ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - json-stringify-safe: 5.0.1 - minimist: 1.2.8 - readable-stream: 3.6.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: true - /node-fetch@3.0.0-beta.9: - resolution: {integrity: sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==} - engines: {node: ^10.17 || >=12.3} - dependencies: - data-uri-to-buffer: 3.0.1 - fetch-blob: 2.1.2 - transitivePeerDependencies: - - domexception - dev: true - /node-gyp-build@4.8.1: resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true @@ -3908,8 +3688,8 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true - /npm-check-updates@16.14.18: - resolution: {integrity: sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==} + /npm-check-updates@16.14.20: + resolution: {integrity: sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==} engines: {node: '>=14.14'} hasBin: true dependencies: @@ -4012,9 +3792,17 @@ packages: path-key: 3.1.1 dev: true + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 @@ -4068,6 +3856,13 @@ packages: mimic-fn: 2.1.0 dev: true + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + /openapi-fetch@0.9.8: resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} dependencies: @@ -4092,11 +3887,6 @@ packages: engines: {node: '>=12.20'} dev: true - /p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - dev: true - /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -4118,9 +3908,9 @@ packages: yocto-queue: 0.1.0 dev: true - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} dependencies: yocto-queue: 1.0.0 dev: true @@ -4151,14 +3941,6 @@ packages: aggregate-error: 3.1.0 dev: true - /p-memoize@4.0.1: - resolution: {integrity: sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==} - engines: {node: '>=10'} - dependencies: - mem: 6.1.1 - mimic-fn: 3.1.0 - dev: true - /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -4218,16 +4000,9 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} - dev: true - - /parse-npm-tarball-url@3.0.0: - resolution: {integrity: sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g==} - engines: {node: '>=8.15'} - dependencies: - semver: 6.3.1 + /parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} dev: true /path-exists@4.0.0: @@ -4245,6 +4020,11 @@ packages: engines: {node: '>=8'} dev: true + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -4257,13 +4037,6 @@ packages: minipass: 7.0.4 dev: true - /path-temp@2.1.0: - resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} - engines: {node: '>=8.15'} - dependencies: - unique-string: 2.0.0 - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4286,6 +4059,11 @@ packages: engines: {node: '>=8.6'} dev: true + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -4320,9 +4098,9 @@ packages: engines: {node: '>= 0.4'} dev: true - /postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} + /postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -4332,8 +4110,8 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 + lilconfig: 3.1.2 + yaml: 2.4.5 dev: true /postcss@8.4.38: @@ -4370,11 +4148,11 @@ packages: react-is: 18.2.0 dev: true - /pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} + /pretty-ms@9.0.0: + resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + engines: {node: '>=18'} dependencies: - parse-ms: 3.0.0 + parse-ms: 4.0.0 dev: true /proc-log@3.0.0: @@ -4482,6 +4260,7 @@ packages: /read-package-json@6.0.4: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. dependencies: glob: 10.3.10 json-parse-even-better-errors: 3.0.1 @@ -4575,14 +4354,6 @@ packages: engines: {node: '>=8'} dev: true - /rename-overwrite@4.0.4: - resolution: {integrity: sha512-5MC+p5npnyaJlFkwTHb0pqU2mkUkkW65ZWH8qwxcDlv+5nchtalcdzG+gaaianbWWwvwxi7vu7WSg6jdCweKug==} - engines: {node: '>=12.10'} - dependencies: - '@zkochan/rimraf': 2.1.3 - fs-extra: 10.1.0 - dev: true - /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4638,6 +4409,7 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -4651,14 +4423,6 @@ packages: glob: 10.3.10 dev: true - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - /rollup@4.13.0: resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4732,11 +4496,6 @@ packages: hasBin: true dev: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -4845,11 +4604,6 @@ packages: engines: {node: '>=8'} dev: true - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -4868,6 +4622,11 @@ packages: yargs: 15.4.1 dev: true + /smol-toml@1.2.2: + resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} + engines: {node: '>= 18'} + dev: true + /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} @@ -4947,12 +4706,6 @@ packages: resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: true - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.2 - dev: true - /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -5063,16 +4816,16 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -5090,10 +4843,10 @@ packages: engines: {node: '>=14.16'} dev: true - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} dependencies: - acorn: 8.11.3 + js-tokens: 9.0.0 dev: true /sucrase@3.35.0: @@ -5163,18 +4916,12 @@ packages: any-promise: 1.3.0 dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.2 - dev: true - /tinybench@2.6.0: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} dev: true @@ -5233,15 +4980,27 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tsup@6.7.0(typescript@5.4.3): - resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} - engines: {node: '>=14.18'} + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsup@8.1.0(typescript@5.5.2): + resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} + engines: {node: '>=18'} hasBin: true peerDependencies: + '@microsoft/api-extractor': ^7.36.0 '@swc/core': ^1 postcss: ^8.4.12 - typescript: '>=4.1.0' + typescript: '>=4.5.0' peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true '@swc/core': optional: true postcss: @@ -5249,21 +5008,21 @@ packages: typescript: optional: true dependencies: - bundle-require: 4.0.2(esbuild@0.17.19) + bundle-require: 4.0.2(esbuild@0.21.5) cac: 6.7.14 chokidar: 3.6.0 debug: 4.3.4 - esbuild: 0.17.19 + esbuild: 0.21.5 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4 + postcss-load-config: 4.0.2 resolve-from: 5.0.0 - rollup: 3.29.4 + rollup: 4.13.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 - typescript: 5.4.3 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - ts-node @@ -5374,8 +5133,8 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -5439,13 +5198,6 @@ packages: imurmurhash: 0.1.4 dev: true - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - dev: true - /unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} @@ -5458,11 +5210,6 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -5507,13 +5254,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /validate-npm-package-name@4.0.0: - resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - builtins: 5.0.1 - dev: true - /validate-npm-package-name@5.0.0: resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5521,24 +5261,16 @@ packages: builtins: 5.0.1 dev: true - /version-selector-type@3.0.0: - resolution: {integrity: sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA==} - engines: {node: '>=10.13'} - dependencies: - semver: 7.6.0 - dev: true - - /vite-node@0.34.6(@types/node@18.19.26): - resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} - engines: {node: '>=v14.18.0'} + /vite-node@1.6.0(@types/node@18.18.6): + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.6(@types/node@18.19.26) + vite: 5.2.6(@types/node@18.18.6) transitivePeerDependencies: - '@types/node' - less @@ -5550,7 +5282,7 @@ packages: - terser dev: true - /vite@5.2.6(@types/node@18.19.26): + /vite@5.2.6(@types/node@18.18.6): resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -5578,7 +5310,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.26 + '@types/node': 18.18.6 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 @@ -5586,22 +5318,22 @@ packages: fsevents: 2.3.3 dev: true - /vitest@0.34.6: - resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} - engines: {node: '>=v14.18.0'} + /vitest@1.6.0(@types/node@18.18.6): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 happy-dom: '*' jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': @@ -5610,36 +5342,27 @@ packages: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true dependencies: - '@types/chai': 4.3.14 - '@types/chai-subset': 1.3.5 - '@types/node': 18.19.26 - '@vitest/expect': 0.34.6 - '@vitest/runner': 0.34.6 - '@vitest/snapshot': 0.34.6 - '@vitest/spy': 0.34.6 - '@vitest/utils': 0.34.6 - acorn: 8.11.3 + '@types/node': 18.18.6 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 - cac: 6.7.14 chai: 4.4.1 debug: 4.3.4 - local-pkg: 0.4.3 + execa: 8.0.1 + local-pkg: 0.5.0 magic-string: 0.30.8 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 1.3.0 + strip-literal: 2.1.0 tinybench: 2.6.0 - tinypool: 0.7.0 - vite: 5.2.6(@types/node@18.19.26) - vite-node: 0.34.6(@types/node@18.19.26) + tinypool: 0.8.4 + vite: 5.2.6(@types/node@18.18.6) + vite-node: 1.6.0(@types/node@18.18.6) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -5792,8 +5515,8 @@ packages: typedarray-to-buffer: 3.1.5 dev: true - /ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5830,9 +5553,10 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + /yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true dev: true /yargs-parser@18.1.3: @@ -5888,9 +5612,9 @@ packages: engines: {node: '>=12.20'} dev: true - /zod-validation-error@1.5.0(zod@3.22.4): - resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} - engines: {node: '>=16.0.0'} + /zod-validation-error@3.3.0(zod@3.22.4): + resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.18.0 dependencies: diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index aa04c93d..037dac81 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -2,3 +2,4 @@ from .main import CodeInterpreter, JupyterExtension from .models import Execution, Error, Result, KernelException, MIMEType, Logs +from .messaging import CellMessage diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d8eeab52..2b34871c 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -61,6 +61,10 @@ def get_protocol(self, base_protocol: str = "http") -> str: """ return base_protocol if self._connection_config.debug else f"{base_protocol}s" + def __exit__(self, exc_type, exc_value, traceback): + self.close() + super().__exit__(exc_type, exc_value, traceback) + class JupyterExtension: def __init__(self, sandbox: CodeInterpreter, request_timeout: float = TIMEOUT): diff --git a/python/package.json b/python/package.json index e092b250..d24de01f 100644 --- a/python/package.json +++ b/python/package.json @@ -3,7 +3,7 @@ "private": true, "version": "0.0.10", "scripts": { - "test": "poetry run pytest -n 1 --verbose -x", + "test": "poetry run pytest -n 4 --verbose -x", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install" From 036d6c5016bf87cd883ef3cab8bd6c98a6c65be4 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 29 Jun 2024 19:46:54 -0700 Subject: [PATCH 051/722] Update core SDK --- js/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 60ae3cff..a97d75c3 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.9", + "e2b": "0.16.2-beta.12", "isomorphic-ws": "^5.0.0", "ws": "^8.17.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4766f21a..f053664c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.9 - version: 0.16.2-beta.9 + specifier: 0.16.2-beta.12 + version: 0.16.2-beta.12 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.17.1) @@ -2015,8 +2015,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.9: - resolution: {integrity: sha512-dK6jDQKHHkyqJ8nj1er3kLstxWsbUTEIaWoVrxtR3fjSqBRkJuMPVX7GDZDlefZnAlQx+ODHkmyFO91Mmdjh5A==} + /e2b@0.16.2-beta.12: + resolution: {integrity: sha512-zWRGO3NDmkILedlXlR6LVROQOv8Fv0NTI9x1tB6vSnqDYfly1lUP/p319TH9cryI+nVXaDdOYeKuh+sexl/1fg==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 diff --git a/python/poetry.lock b/python/poetry.lock index 876eb1c9..603775f1 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -231,13 +231,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a17" +version = "0.17.2a20" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a17-py3-none-any.whl", hash = "sha256:390b76d2d8f693ef92f22d0c31bcf09de4ace6bdcfede185b673964774a214f3"}, - {file = "e2b-0.17.2a17.tar.gz", hash = "sha256:7988825c82302bf746ecf9f78d8924a2d5d9a3cadf90980035f70fcb1652e4f3"}, + {file = "e2b-0.17.2a20-py3-none-any.whl", hash = "sha256:55b58d05129f544df645f3b4d7575b8f9ebf3713a9ef89482ac59e2a5ee52b8a"}, + {file = "e2b-0.17.2a20.tar.gz", hash = "sha256:abe3b6b3735ddf302932e479b636819fdb48e41b24eabc980bb40df3627fa48b"}, ] [package.dependencies] @@ -782,4 +782,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "84f77f3ae7bac9da7eacdac00ab507c7341b0abacb6e9c05157b0dcca9fbd959" +content-hash = "b65ebc300a71eff98944e4be8565d654cfdc34ca2b821a1f1a11935e9a09f25d" diff --git a/python/pyproject.toml b/python/pyproject.toml index 110e6b64..8d8fd234 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a17" +e2b = "0.17.2a20" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From 106a5d66bf79c715b08f91929478a02dcc7fba73 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 29 Jun 2024 20:56:21 -0700 Subject: [PATCH 052/722] Cleanup examples --- js/example.mts | 16 ---------------- python/example.py | 31 ------------------------------- 2 files changed, 47 deletions(-) diff --git a/js/example.mts b/js/example.mts index 6dba5500..e69de29b 100644 --- a/js/example.mts +++ b/js/example.mts @@ -1,16 +0,0 @@ -import dotenv from 'dotenv' - -import { CodeInterpreter } from './dist' - -dotenv.config() - -console.log('api', process.env.E2B_API_KEY) -console.log('api', process.env.E2B_DOMAIN) - - -const start = Date.now() - -const sandbox = await CodeInterpreter.create() -console.log(`Time taken: ${Date.now() - start}ms`) -const r = await sandbox.notebook.execCell('x = 1; x') -console.log(r) diff --git a/python/example.py b/python/example.py index 5634b0f9..e69de29b 100644 --- a/python/example.py +++ b/python/example.py @@ -1,31 +0,0 @@ -from e2b_code_interpreter.main import CodeInterpreter -from dotenv import load_dotenv - -load_dotenv() - - -code = """ -import matplotlib.pyplot as plt -import numpy as np - -x = np.linspace(0, 20, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.show() - -x = np.linspace(0, 10, 100) - -plt.plot(x, y) -plt.show() - -import pandas -pandas.DataFrame({"a": [1, 2, 3]}) -""" - -with CodeInterpreter() as sandbox: - print(sandbox.sandbox_id) - execution = sandbox.notebook.exec_cell(code) - -print(execution.results[0].formats()) -print(len(execution.results)) From 3ee0f6cbf3d1fdfcc364a3906006186e8399aeb6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 30 Jun 2024 03:57:09 +0000 Subject: [PATCH 053/722] [skip ci] Release new versions --- js/package.json | 4 ++-- python/pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/package.json b/js/package.json index a97d75c3..68bc53cd 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.8", + "version": "0.0.9-beta.0", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -75,4 +75,4 @@ "browserslist": [ "defaults" ] -} \ No newline at end of file +} diff --git a/python/pyproject.toml b/python/pyproject.toml index 8d8fd234..8c850527 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.10" +version = "0.0.11a0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 56e38797a53fafae2f99a62f472bc0bb8388eb5c Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Mon, 1 Jul 2024 12:32:19 -0700 Subject: [PATCH 054/722] Update core sdk --- js/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 68bc53cd..c6bcf630 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.12", + "e2b": "0.16.2-beta.13", "isomorphic-ws": "^5.0.0", "ws": "^8.17.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f053664c..f3a3fada 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.12 - version: 0.16.2-beta.12 + specifier: 0.16.2-beta.13 + version: 0.16.2-beta.13 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.17.1) @@ -2015,8 +2015,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.12: - resolution: {integrity: sha512-zWRGO3NDmkILedlXlR6LVROQOv8Fv0NTI9x1tB6vSnqDYfly1lUP/p319TH9cryI+nVXaDdOYeKuh+sexl/1fg==} + /e2b@0.16.2-beta.13: + resolution: {integrity: sha512-Q7l2ruIYNx9eCn5paeANch/CcrmS/FWCm3wkR6tuRcNAKHy5lYXh0xQbTwJsoVp9shlm1JX0ddP9nTekUqgfTA==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 diff --git a/python/poetry.lock b/python/poetry.lock index 603775f1..05f89b04 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -231,13 +231,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a20" +version = "0.17.2a21" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a20-py3-none-any.whl", hash = "sha256:55b58d05129f544df645f3b4d7575b8f9ebf3713a9ef89482ac59e2a5ee52b8a"}, - {file = "e2b-0.17.2a20.tar.gz", hash = "sha256:abe3b6b3735ddf302932e479b636819fdb48e41b24eabc980bb40df3627fa48b"}, + {file = "e2b-0.17.2a21-py3-none-any.whl", hash = "sha256:2bb173a3c22e60690cc82ae163cc7fa8078824b57e9f7d1a5ab6970d8a86e235"}, + {file = "e2b-0.17.2a21.tar.gz", hash = "sha256:37d90745bc31096b00583fce0c4a17e801b2296d1a9f30a1399ad486f3587d83"}, ] [package.dependencies] @@ -782,4 +782,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "b65ebc300a71eff98944e4be8565d654cfdc34ca2b821a1f1a11935e9a09f25d" +content-hash = "2f91fbe0f500edc87629e8e895955a1708090d48e96269c153e3d0ab06fc47ae" diff --git a/python/pyproject.toml b/python/pyproject.toml index 8c850527..46576265 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a20" +e2b = "0.17.2a21" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From 6c236dee297af42034aa67b3a25bb079cf8af65d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 1 Jul 2024 19:33:15 +0000 Subject: [PATCH 055/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c6bcf630..08c2d0c3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.0", + "version": "0.0.9-beta.1", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 46576265..0601306c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a0" +version = "0.0.11a1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 1e07fc2e5d2d3d219f7cd6cb22828cfb2511611d Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 2 Jul 2024 17:29:01 -0700 Subject: [PATCH 056/722] Update core SDK --- js/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 08c2d0c3..1f4b6274 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.13", + "e2b": "0.16.2-beta.15", "isomorphic-ws": "^5.0.0", "ws": "^8.17.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3a3fada..d315a7c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.13 - version: 0.16.2-beta.13 + specifier: 0.16.2-beta.15 + version: 0.16.2-beta.15 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.17.1) @@ -2015,8 +2015,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.13: - resolution: {integrity: sha512-Q7l2ruIYNx9eCn5paeANch/CcrmS/FWCm3wkR6tuRcNAKHy5lYXh0xQbTwJsoVp9shlm1JX0ddP9nTekUqgfTA==} + /e2b@0.16.2-beta.15: + resolution: {integrity: sha512-b4ZNnNvQI8HGJ6N3Yr90FaSiRN5hae9yY6LIDMAIRpjj2hRcaQ4iaAK1DqXOWwhiZphcPrlTWmoU/17cXxNztw==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 diff --git a/python/poetry.lock b/python/poetry.lock index 05f89b04..8d9b31b1 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -231,13 +231,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a21" +version = "0.17.2a23" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a21-py3-none-any.whl", hash = "sha256:2bb173a3c22e60690cc82ae163cc7fa8078824b57e9f7d1a5ab6970d8a86e235"}, - {file = "e2b-0.17.2a21.tar.gz", hash = "sha256:37d90745bc31096b00583fce0c4a17e801b2296d1a9f30a1399ad486f3587d83"}, + {file = "e2b-0.17.2a23-py3-none-any.whl", hash = "sha256:12e65f4f2c18c750c076f7bd22c24ed0b13ad0b59ecc9b99655990e7aeb7c93d"}, + {file = "e2b-0.17.2a23.tar.gz", hash = "sha256:948542564255d913da97a754765ea3ec1bf1482a897599ace9421e6857910cdd"}, ] [package.dependencies] @@ -782,4 +782,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "2f91fbe0f500edc87629e8e895955a1708090d48e96269c153e3d0ab06fc47ae" +content-hash = "ff4c6f3e9666ec83df741787901a2ea856e1dce0f046a3f011e7feb9e2cff46c" diff --git a/python/pyproject.toml b/python/pyproject.toml index 0601306c..d2ac3000 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a21" +e2b = "0.17.2a23" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From deb0f652518d9742c085175b206a0aaba1f4b974 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 3 Jul 2024 00:30:07 +0000 Subject: [PATCH 057/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 1f4b6274..66b38fc3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.1", + "version": "0.0.9-beta.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index d2ac3000..2416210e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a1" +version = "0.0.11a2" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 8f2d633515d636bbaa6d420592923c6a1ebef1ee Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 21:46:16 +0200 Subject: [PATCH 058/722] Remove websocket from code interpreter - server part --- Makefile | 35 ++++ openapi.yml | 166 ++++++++++++++++++ template/e2b.Dockerfile | 7 +- template/e2b.toml | 16 -- template/jupyter_server_config.py | 1 - .../server}/future.py | 0 template/server/main.py | 27 +++ .../server}/messaging.py | 32 ++-- template/server/models/error.py | 118 +++++++++++++ template/server/models/execution.py | 136 ++++++++++++++ template/server/models/execution_request.py | 101 +++++++++++ template/server/models/logs.py | 98 +++++++++++ template/server/models/result.py | 154 ++++++++++++++++ template/server/requirements.txt | 2 + .../server}/websocket_client.py | 0 template/start-up.sh | 2 + 16 files changed, 855 insertions(+), 40 deletions(-) create mode 100644 Makefile create mode 100644 openapi.yml delete mode 100644 template/e2b.toml rename {python/e2b_code_interpreter => template/server}/future.py (100%) create mode 100644 template/server/main.py rename {python/e2b_code_interpreter => template/server}/messaging.py (90%) create mode 100644 template/server/models/error.py create mode 100644 template/server/models/execution.py create mode 100644 template/server/models/execution_request.py create mode 100644 template/server/models/logs.py create mode 100644 template/server/models/result.py create mode 100644 template/server/requirements.txt rename {python/e2b_code_interpreter => template/server}/websocket_client.py (100%) diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..65a9bbfe --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +.PHONY: generate +generate: + rm -rf ./python/e2b_code_interpreter/client + npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 + npx -yes @openapitools/openapi-generator-cli generate \ + -i openapi.yml \ + -g python \ + -o ./python/e2b_code_interpreter/client \ + --global-property apis,models,supportingFiles,modelDocs=false \ + --additional-properties=generateSourceCodeOnly=true \ + --additional-properties=disallowAdditionalPropertiesIfNotPresent=false \ + --additional-properties=usePydanticV2=true \ + --additional-properties=packageName=e2b_code_interpreter.client + mv ./python/e2b_code_interpreter/client/e2b_code_interpreter/client/* ./python/e2b_code_interpreter/client + rm -r ./python/e2b_code_interpreter/client/docs + rm -r .//python/e2b_code_interpreter/client/test + rm -r ./python/e2b_code_interpreter/client/.openapi-generator + rm -r ./python/e2b_code_interpreter/client/e2b_code_interpreter + rm -r ./python/e2b_code_interpreter/client/.openapi-generator-ignore + black . + + + rm -rf ./template/server/models/* + npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 + npx -yes @openapitools/openapi-generator-cli generate \ + -i openapi.yml \ + -g python \ + -o ./template/server/tmp \ + --global-property apis=false,models,supportingFiles=false,modelDocs=false \ + --additional-properties=disallowAdditionalPropertiesIfNotPresent=false \ + --additional-properties=usePydanticV2=true \ + --additional-properties=packageName=models + mv ./template/server/tmp/models/* ./template/server + rm -r ./template/server/tmp + black . diff --git a/openapi.yml b/openapi.yml new file mode 100644 index 00000000..6188e15e --- /dev/null +++ b/openapi.yml @@ -0,0 +1,166 @@ +openapi: 3.0.0 +info: + version: 0.1.0 + title: E2B Code Interpreter + +components: + parameters: + templateID: + name: templateID + in: path + required: true + schema: + type: string + buildID: + name: buildID + in: path + required: true + schema: + type: string + sandboxID: + name: sandboxID + in: path + required: true + schema: + type: string + + responses: + "400": + description: Bad request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "404": + description: Not found + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + "500": + description: Server error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + schemas: + Result: + properties: + text: + type: string + description: Textual representation of the result + html: + type: string + description: HTML representation of the result + markdown: + type: string + description: Markdown representation of the result + svg: + type: string + description: SVG representation of the result + png: + type: string + description: PNG representation of the result + jpeg: + type: string + description: JPEG representation of the result + pdf: + type: string + description: PDF representation of the result + latex: + type: string + description: LaTeX representation of the result + json: + type: object + description: JSON representation of the result + javascript: + type: string + description: JavaScript representation of the result + extra: + type: object + description: Extra representations of the result + + Logs: + properties: + stdout: + type: string + stderr: + type: string + + Error: + properties: + name: + type: string + description: Name of the exception + value: + type: string + description: Value of the exception + traceback_raw: + type: array + items: + type: string + description: List of strings representing the traceback + code: + type: integer + format: int32 + description: Error code + message: + type: string + description: Error + + Execution: + properties: + results: + type: array + items: + $ref: "#/components/schemas/Result" + logs: + $ref: "#/components/schemas/Logs" + error: + $ref: "#/components/schemas/Error" + execution_count: + type: integer + format: int32 + description: "Execution count of the cell." + + ExecutionRequest: + required: + - code + properties: + code: + type: string + description: Code to be executed + language: + type: string + description: Language of the code to be executed + +paths: + /health: + get: + description: Health check + responses: + "200": + description: Request was successful + + /exec: + post: + description: Create a sandbox from the template + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ExecutionRequest" + responses: + "201": + description: The sandbox was created successfully + content: + application/json: + schema: + $ref: "#/components/schemas/Execution" + "400": + $ref: "#/components/responses/400" + "500": + $ref: "#/components/responses/500" diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 39c82e62..91e09145 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -7,7 +7,8 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_NO_CACHE_DIR=1 \ JUPYTER_CONFIG_PATH="/root/.jupyter" \ - IPYTHON_CONFIG_PATH="/root/.ipython" + IPYTHON_CONFIG_PATH="/root/.ipython" \ + SERVER_PATH="/root/.server" COPY ./requirements.txt requirements.txt @@ -19,3 +20,7 @@ COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh + +RUN mkdir -p $SERVER_PATH/ +COPY ./server $SERVER_PATH +RUN pip install --no-cache-dir -r $SERVER_PATH/requirements.txt diff --git a/template/e2b.toml b/template/e2b.toml deleted file mode 100644 index 03d45b92..00000000 --- a/template/e2b.toml +++ /dev/null @@ -1,16 +0,0 @@ -# This is a config for E2B sandbox template. -# You can use 'template_id' (1tsfj5yvigmgc5gmgqz2) or 'template_name (code-interpreter-stateful) from this config to spawn a sandbox: - -# Python SDK -# from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-stateful') - -# JS SDK -# import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-stateful' }) - -memory_mb = 1_024 -start_cmd = "/root/.jupyter/start-up.sh" -dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-stateful" -template_id = "1tsfj5yvigmgc5gmgqz2" diff --git a/template/jupyter_server_config.py b/template/jupyter_server_config.py index a414d1d7..97ff4f59 100644 --- a/template/jupyter_server_config.py +++ b/template/jupyter_server_config.py @@ -45,4 +45,3 @@ # Whether to allow the user to run the server as root. # Default: False c.ServerApp.allow_root = True - diff --git a/python/e2b_code_interpreter/future.py b/template/server/future.py similarity index 100% rename from python/e2b_code_interpreter/future.py rename to template/server/future.py diff --git a/template/server/main.py b/template/server/main.py new file mode 100644 index 00000000..0b04042b --- /dev/null +++ b/template/server/main.py @@ -0,0 +1,27 @@ +import uuid + +from fastapi import FastAPI + +from messaging import JupyterKernelWebSocket +from models.execution import Execution +from models.execution_request import ExecutionRequest + +app = FastAPI() + + +session_id = str(uuid.uuid4()) + +with open("/root/.jupyter/kernel_id") as file: + kernel_id = file.read().strip() + +ws = JupyterKernelWebSocket(f"localhost:8888/api/kernels/{kernel_id}/channels", session_id) +ws.connect() + +@app.get("/health") +def health(): + return "Request was successful" + + +@app.post("/execute", response_model=Execution) +def execute(request: ExecutionRequest): + return ws.execute(code=request.code) diff --git a/python/e2b_code_interpreter/messaging.py b/template/server/messaging.py similarity index 90% rename from python/e2b_code_interpreter/messaging.py rename to template/server/messaging.py index d24ecf55..3c829085 100644 --- a/python/e2b_code_interpreter/messaging.py +++ b/template/server/messaging.py @@ -8,12 +8,13 @@ from queue import Queue from typing import Callable, Dict, Any, Optional from pydantic import BaseModel -from e2b import TimeoutException -from e2b_code_interpreter.websocket_client import WebSocket -from e2b_code_interpreter.future import DeferredFuture -from e2b_code_interpreter.models import Execution, Result, Error -from e2b_code_interpreter.constants import TIMEOUT +from models.error import Error +from models.execution import Execution +from models.result import Result +from future import DeferredFuture + +TIMEOUT = 60 logger = logging.getLogger(__name__) @@ -112,7 +113,7 @@ def connect(self, timeout: float = TIMEOUT): time.sleep(0.1) if not started.is_set(): - raise TimeoutException("WebSocket failed to start") + raise Exception("WebSocket failed to start") except BaseException as e: self.close() raise Exception(f"WebSocket failed to start: {e}") from e @@ -141,28 +142,15 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: } ) - def send_execution_message( - self, - code: str, - on_stdout: Optional[Callable[[CellMessage], Any]] = None, - on_stderr: Optional[Callable[[CellMessage], Any]] = None, - on_result: Optional[Callable[[Result], Any]] = None, - ) -> str: + def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: message_id = str(uuid.uuid4()) logger.debug(f"Sending execution message: {message_id}") - self._cells[message_id] = CellExecution( - on_stdout=on_stdout, - on_stderr=on_stderr, - on_result=on_result, - ) + self._cells[message_id] = CellExecution() request = self._get_execute_request(message_id, code) self._queue_in.put(request) - return message_id - def get_result( - self, message_id: str, timeout: Optional[float] = TIMEOUT - ) -> Execution: + logger.debug(f"Waiting for result for message: {message_id}") result = self._cells[message_id].execution.result(timeout=timeout) logger.debug(f"Got result for message: {message_id}") del self._cells[message_id] diff --git a/template/server/models/error.py b/template/server/models/error.py new file mode 100644 index 00000000..7f3fa279 --- /dev/null +++ b/template/server/models/error.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictInt, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Error(BaseModel): + """ + Error + """ # noqa: E501 + + name: Optional[StrictStr] = Field(default=None, description="Name of the exception") + value: Optional[StrictStr] = Field( + default=None, description="Value of the exception" + ) + traceback_raw: Optional[List[StrictStr]] = Field( + default=None, description="List of strings representing the traceback" + ) + code: Optional[StrictInt] = Field(default=None, description="Error code") + message: Optional[StrictStr] = Field(default=None, description="Error") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = [ + "name", + "value", + "traceback_raw", + "code", + "message", + ] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Error from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Error from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "name": obj.get("name"), + "value": obj.get("value"), + "traceback_raw": obj.get("traceback_raw"), + "code": obj.get("code"), + "message": obj.get("message"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/template/server/models/execution.py b/template/server/models/execution.py new file mode 100644 index 00000000..553ecdfc --- /dev/null +++ b/template/server/models/execution.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictInt +from pydantic import Field +from models.error import Error +from models.logs import Logs +from models.result import Result + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Execution(BaseModel): + """ + Execution + """ # noqa: E501 + + results: Optional[List[Result]] = None + logs: Optional[Logs] = None + error: Optional[Error] = None + execution_count: Optional[StrictInt] = Field( + default=None, description="Execution count of the cell." + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["results", "logs", "error", "execution_count"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Execution from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in results (list) + _items = [] + if self.results: + for _item in self.results: + if _item: + _items.append(_item.to_dict()) + _dict["results"] = _items + # override the default output from pydantic by calling `to_dict()` of logs + if self.logs: + _dict["logs"] = self.logs.to_dict() + # override the default output from pydantic by calling `to_dict()` of error + if self.error: + _dict["error"] = self.error.to_dict() + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Execution from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "results": ( + [Result.from_dict(_item) for _item in obj.get("results")] + if obj.get("results") is not None + else None + ), + "logs": ( + Logs.from_dict(obj.get("logs")) + if obj.get("logs") is not None + else None + ), + "error": ( + Error.from_dict(obj.get("error")) + if obj.get("error") is not None + else None + ), + "execution_count": obj.get("execution_count"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/template/server/models/execution_request.py b/template/server/models/execution_request.py new file mode 100644 index 00000000..b0ff03e2 --- /dev/null +++ b/template/server/models/execution_request.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class ExecutionRequest(BaseModel): + """ + ExecutionRequest + """ # noqa: E501 + + code: StrictStr = Field(description="Code to be executed") + language: Optional[StrictStr] = Field( + default=None, description="Language of the code to be executed" + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["code", "language"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ExecutionRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of ExecutionRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"code": obj.get("code"), "language": obj.get("language")} + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/template/server/models/logs.py b/template/server/models/logs.py new file mode 100644 index 00000000..e91a91b2 --- /dev/null +++ b/template/server/models/logs.py @@ -0,0 +1,98 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictStr + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Logs(BaseModel): + """ + Logs + """ # noqa: E501 + + stdout: Optional[StrictStr] = None + stderr: Optional[StrictStr] = None + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["stdout", "stderr"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Logs from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Logs from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"stdout": obj.get("stdout"), "stderr": obj.get("stderr")} + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/template/server/models/result.py b/template/server/models/result.py new file mode 100644 index 00000000..7d21bb86 --- /dev/null +++ b/template/server/models/result.py @@ -0,0 +1,154 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional, Union +from pydantic import BaseModel, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Result(BaseModel): + """ + Result + """ # noqa: E501 + + text: Optional[StrictStr] = Field( + default=None, description="Textual representation of the result" + ) + html: Optional[StrictStr] = Field( + default=None, description="HTML representation of the result" + ) + markdown: Optional[StrictStr] = Field( + default=None, description="Markdown representation of the result" + ) + svg: Optional[StrictStr] = Field( + default=None, description="SVG representation of the result" + ) + png: Optional[StrictStr] = Field( + default=None, description="PNG representation of the result" + ) + jpeg: Optional[StrictStr] = Field( + default=None, description="JPEG representation of the result" + ) + pdf: Optional[StrictStr] = Field( + default=None, description="PDF representation of the result" + ) + latex: Optional[StrictStr] = Field( + default=None, description="LaTeX representation of the result" + ) + var_json: Optional[Union[str, Any]] = Field( + default=None, description="JSON representation of the result", alias="json" + ) + javascript: Optional[StrictStr] = Field( + default=None, description="JavaScript representation of the result" + ) + extra: Optional[Union[str, Any]] = Field( + default=None, description="Extra representations of the result" + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = [ + "text", + "html", + "markdown", + "svg", + "png", + "jpeg", + "pdf", + "latex", + "json", + "javascript", + "extra", + ] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Result from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Result from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "text": obj.get("text"), + "html": obj.get("html"), + "markdown": obj.get("markdown"), + "svg": obj.get("svg"), + "png": obj.get("png"), + "jpeg": obj.get("jpeg"), + "pdf": obj.get("pdf"), + "latex": obj.get("latex"), + "json": obj.get("json"), + "javascript": obj.get("javascript"), + "extra": obj.get("extra"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/template/server/requirements.txt b/template/server/requirements.txt new file mode 100644 index 00000000..4b14b153 --- /dev/null +++ b/template/server/requirements.txt @@ -0,0 +1,2 @@ +pydantic==2.8.0 +fastapi==0.111.0 diff --git a/python/e2b_code_interpreter/websocket_client.py b/template/server/websocket_client.py similarity index 100% rename from python/e2b_code_interpreter/websocket_client.py rename to template/server/websocket_client.py diff --git a/template/start-up.sh b/template/start-up.sh index f3cb09eb..cc667912 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -27,6 +27,8 @@ function start_jupyter_server() { sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" + + python3 server/main.py } echo "Starting Jupyter Server..." From 0f8b9d40c4126dd7c5ad5d2c44c3c468b70225cd Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 21:46:23 +0200 Subject: [PATCH 059/722] Remove websocket from code interpreter - Python SDK --- .../e2b_code_interpreter/client/__init__.py | 38 + .../client/api/__init__.py | 4 + .../client/api/default_api.py | 512 +++++++++++++ .../e2b_code_interpreter/client/api_client.py | 697 ++++++++++++++++++ .../client/api_response.py | 22 + .../client/configuration.py | 443 +++++++++++ .../e2b_code_interpreter/client/exceptions.py | 167 +++++ .../client/models/__init__.py | 21 + .../client/models/error.py | 118 +++ .../client/models/execution.py | 136 ++++ .../client/models/execution_request.py | 101 +++ .../client/models/logs.py | 98 +++ .../client/models/result.py | 154 ++++ python/e2b_code_interpreter/client/rest.py | 214 ++++++ python/e2b_code_interpreter/main.py | 278 +------ 15 files changed, 2732 insertions(+), 271 deletions(-) create mode 100644 python/e2b_code_interpreter/client/__init__.py create mode 100644 python/e2b_code_interpreter/client/api/__init__.py create mode 100644 python/e2b_code_interpreter/client/api/default_api.py create mode 100644 python/e2b_code_interpreter/client/api_client.py create mode 100644 python/e2b_code_interpreter/client/api_response.py create mode 100644 python/e2b_code_interpreter/client/configuration.py create mode 100644 python/e2b_code_interpreter/client/exceptions.py create mode 100644 python/e2b_code_interpreter/client/models/__init__.py create mode 100644 python/e2b_code_interpreter/client/models/error.py create mode 100644 python/e2b_code_interpreter/client/models/execution.py create mode 100644 python/e2b_code_interpreter/client/models/execution_request.py create mode 100644 python/e2b_code_interpreter/client/models/logs.py create mode 100644 python/e2b_code_interpreter/client/models/result.py create mode 100644 python/e2b_code_interpreter/client/rest.py diff --git a/python/e2b_code_interpreter/client/__init__.py b/python/e2b_code_interpreter/client/__init__.py new file mode 100644 index 00000000..04875f3c --- /dev/null +++ b/python/e2b_code_interpreter/client/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +# flake8: noqa + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +__version__ = "1.0.0" + +# import apis into sdk package +from e2b_code_interpreter.client.api.default_api import DefaultApi + +# import ApiClient +from e2b_code_interpreter.client.api_response import ApiResponse +from e2b_code_interpreter.client.api_client import ApiClient +from e2b_code_interpreter.client.configuration import Configuration +from e2b_code_interpreter.client.exceptions import OpenApiException +from e2b_code_interpreter.client.exceptions import ApiTypeError +from e2b_code_interpreter.client.exceptions import ApiValueError +from e2b_code_interpreter.client.exceptions import ApiKeyError +from e2b_code_interpreter.client.exceptions import ApiAttributeError +from e2b_code_interpreter.client.exceptions import ApiException + +# import models into sdk package +from e2b_code_interpreter.client.models.error import Error +from e2b_code_interpreter.client.models.execution import Execution +from e2b_code_interpreter.client.models.execution_request import ExecutionRequest +from e2b_code_interpreter.client.models.logs import Logs +from e2b_code_interpreter.client.models.result import Result diff --git a/python/e2b_code_interpreter/client/api/__init__.py b/python/e2b_code_interpreter/client/api/__init__.py new file mode 100644 index 00000000..855104a1 --- /dev/null +++ b/python/e2b_code_interpreter/client/api/__init__.py @@ -0,0 +1,4 @@ +# flake8: noqa + +# import apis into api package +from e2b_code_interpreter.client.api.default_api import DefaultApi diff --git a/python/e2b_code_interpreter/client/api/default_api.py b/python/e2b_code_interpreter/client/api/default_api.py new file mode 100644 index 00000000..6fa164ba --- /dev/null +++ b/python/e2b_code_interpreter/client/api/default_api.py @@ -0,0 +1,512 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import io +import warnings + +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Dict, List, Optional, Tuple, Union, Any + +try: + from typing import Annotated +except ImportError: + from typing_extensions import Annotated + +from e2b_code_interpreter.client.models.execution import Execution +from e2b_code_interpreter.client.models.execution_request import ExecutionRequest + +from e2b_code_interpreter.client.api_client import ApiClient +from e2b_code_interpreter.client.api_response import ApiResponse +from e2b_code_interpreter.client.rest import RESTResponseType + + +class DefaultApi: + """NOTE: This class is auto generated by OpenAPI Generator + Ref: https://openapi-generator.tech + + Do not edit the class manually. + """ + + def __init__(self, api_client=None) -> None: + if api_client is None: + api_client = ApiClient.get_default() + self.api_client = api_client + + @validate_call + def exec_post( + self, + execution_request: ExecutionRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> Execution: + """exec_post + + Create a sandbox from the template + + :param execution_request: (required) + :type execution_request: ExecutionRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._exec_post_serialize( + execution_request=execution_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "201": "Execution", + "400": "Error", + "500": "Error", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def exec_post_with_http_info( + self, + execution_request: ExecutionRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[Execution]: + """exec_post + + Create a sandbox from the template + + :param execution_request: (required) + :type execution_request: ExecutionRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._exec_post_serialize( + execution_request=execution_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "201": "Execution", + "400": "Error", + "500": "Error", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def exec_post_without_preload_content( + self, + execution_request: ExecutionRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """exec_post + + Create a sandbox from the template + + :param execution_request: (required) + :type execution_request: ExecutionRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._exec_post_serialize( + execution_request=execution_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "201": "Execution", + "400": "Error", + "500": "Error", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + return response_data.response + + def _exec_post_serialize( + self, + execution_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> Tuple: + + _host = None + + _collection_formats: Dict[str, str] = {} + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[str, str] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if execution_request is not None: + _body_params = execution_request + + # set the HTTP header `Accept` + _header_params["Accept"] = self.api_client.select_header_accept( + ["application/json"] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params["Content-Type"] = _content_type + else: + _default_content_type = self.api_client.select_header_content_type( + ["application/json"] + ) + if _default_content_type is not None: + _header_params["Content-Type"] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [] + + return self.api_client.param_serialize( + method="POST", + resource_path="/exec", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth, + ) + + @validate_call + def health_get( + self, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> None: + """health_get + + Health check + + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._health_get_serialize( + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = {} + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def health_get_with_http_info( + self, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[None]: + """health_get + + Health check + + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._health_get_serialize( + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = {} + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def health_get_without_preload_content( + self, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """health_get + + Health check + + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._health_get_serialize( + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = {} + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + return response_data.response + + def _health_get_serialize( + self, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> Tuple: + + _host = None + + _collection_formats: Dict[str, str] = {} + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[str, str] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # authentication setting + _auth_settings: List[str] = [] + + return self.api_client.param_serialize( + method="GET", + resource_path="/health", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth, + ) diff --git a/python/e2b_code_interpreter/client/api_client.py b/python/e2b_code_interpreter/client/api_client.py new file mode 100644 index 00000000..ddb934de --- /dev/null +++ b/python/e2b_code_interpreter/client/api_client.py @@ -0,0 +1,697 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import atexit +import datetime +from dateutil.parser import parse +import json +import mimetypes +import os +import re +import tempfile + +from urllib.parse import quote +from typing import Tuple, Optional, List + +from e2b_code_interpreter.client.configuration import Configuration +from e2b_code_interpreter.client.api_response import ApiResponse +import e2b_code_interpreter.client.models +from e2b_code_interpreter.client import rest +from e2b_code_interpreter.client.exceptions import ( + ApiValueError, + ApiException, + BadRequestException, + UnauthorizedException, + ForbiddenException, + NotFoundException, + ServiceException, +) + + +class ApiClient: + """Generic API client for OpenAPI client library builds. + + OpenAPI generic API client. This client handles the client- + server communication, and is invariant across implementations. Specifics of + the methods and models for each application are generated from the OpenAPI + templates. + + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, str, int) + NATIVE_TYPES_MAPPING = { + "int": int, + "long": int, # TODO remove as only py3 is supported? + "float": float, + "str": str, + "bool": bool, + "date": datetime.date, + "datetime": datetime.datetime, + "object": object, + } + _pool = None + + def __init__( + self, configuration=None, header_name=None, header_value=None, cookie=None + ) -> None: + # use default configuration if none is provided + if configuration is None: + configuration = Configuration.get_default() + self.configuration = configuration + + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = "OpenAPI-Generator/1.0.0/python" + self.client_side_validation = configuration.client_side_validation + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers["User-Agent"] + + @user_agent.setter + def user_agent(self, value): + self.default_headers["User-Agent"] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + _default = None + + @classmethod + def get_default(cls): + """Return new instance of ApiClient. + + This method returns newly created, based on default constructor, + object of ApiClient class or returns a copy of default + ApiClient. + + :return: The ApiClient object. + """ + if cls._default is None: + cls._default = ApiClient() + return cls._default + + @classmethod + def set_default(cls, default): + """Set default instance of ApiClient. + + It stores default ApiClient. + + :param default: object of ApiClient. + """ + cls._default = default + + def param_serialize( + self, + method, + resource_path, + path_params=None, + query_params=None, + header_params=None, + body=None, + post_params=None, + files=None, + auth_settings=None, + collection_formats=None, + _host=None, + _request_auth=None, + ) -> Tuple: + """Builds the HTTP request params needed by the request. + :param method: Method to call. + :param resource_path: Path to method endpoint. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the authentication + in the spec for a single request. + :return: tuple of form (path, http_method, query_params, header_params, + body, post_params, files) + """ + + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params["Cookie"] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict( + self.parameters_to_tuples(header_params, collection_formats) + ) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples(path_params, collection_formats) + for k, v in path_params: + # specified safe chars, encode everything + resource_path = resource_path.replace( + "{%s}" % k, quote(str(v), safe=config.safe_chars_for_path_param) + ) + + # post parameters + if post_params or files: + post_params = post_params if post_params else [] + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples(post_params, collection_formats) + post_params.extend(self.files_parameters(files)) + + # auth setting + self.update_params_for_auth( + header_params, + query_params, + auth_settings, + resource_path, + method, + body, + request_auth=_request_auth, + ) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + if _host is None: + url = self.configuration.host + resource_path + else: + # use server/host defined in path or operation instead + url = _host + resource_path + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + url_query = self.parameters_to_url_query(query_params, collection_formats) + url += "?" + url_query + + return method, url, header_params, body, post_params + + def call_api( + self, + method, + url, + header_params=None, + body=None, + post_params=None, + _request_timeout=None, + ) -> rest.RESTResponse: + """Makes the HTTP request (synchronous) + :param method: Method to call. + :param url: Path to method endpoint. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param _request_timeout: timeout setting for this request. + :return: RESTResponse + """ + + try: + # perform request and return response + response_data = self.rest_client.request( + method, + url, + headers=header_params, + body=body, + post_params=post_params, + _request_timeout=_request_timeout, + ) + + except ApiException as e: + if e.body: + e.body = e.body.decode("utf-8") + raise e + + return response_data + + def response_deserialize( + self, response_data=None, response_types_map=None + ) -> ApiResponse: + """Deserializes response into an object. + :param response_data: RESTResponse object to be deserialized. + :param response_types_map: dict of response types. + :return: ApiResponse + """ + + response_type = response_types_map.get(str(response_data.status), None) + if ( + not response_type + and isinstance(response_data.status, int) + and 100 <= response_data.status <= 599 + ): + # if not found, look for '1XX', '2XX', etc. + response_type = response_types_map.get( + str(response_data.status)[0] + "XX", None + ) + + if not 200 <= response_data.status <= 299: + if response_data.status == 400: + raise BadRequestException(http_resp=response_data) + + if response_data.status == 401: + raise UnauthorizedException(http_resp=response_data) + + if response_data.status == 403: + raise ForbiddenException(http_resp=response_data) + + if response_data.status == 404: + raise NotFoundException(http_resp=response_data) + + if 500 <= response_data.status <= 599: + raise ServiceException(http_resp=response_data) + raise ApiException(http_resp=response_data) + + # deserialize response data + + if response_type == "bytearray": + return_data = response_data.data + elif response_type is None: + return_data = None + elif response_type == "file": + return_data = self.__deserialize_file(response_data) + else: + match = None + content_type = response_data.getheader("content-type") + if content_type is not None: + match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) + encoding = match.group(1) if match else "utf-8" + response_text = response_data.data.decode(encoding) + return_data = self.deserialize(response_text, response_type) + + return ApiResponse( + status_code=response_data.status, + data=return_data, + headers=response_data.getheaders(), + raw_data=response_data.data, + ) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is OpenAPI model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] + elif isinstance(obj, tuple): + return tuple(self.sanitize_for_serialization(sub_obj) for sub_obj in obj) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + + elif isinstance(obj, dict): + obj_dict = obj + else: + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + obj_dict = obj.to_dict() + + return { + key: self.sanitize_for_serialization(val) for key, val in obj_dict.items() + } + + def deserialize(self, response_text, response_type): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + + :return: deserialized object. + """ + + # fetch data from response object + try: + data = json.loads(response_text) + except ValueError: + data = response_text + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if isinstance(klass, str): + if klass.startswith("List["): + sub_kls = re.match(r"List\[(.*)]", klass).group(1) + return [self.__deserialize(sub_data, sub_kls) for sub_data in data] + + if klass.startswith("Dict["): + sub_kls = re.match(r"Dict\[([^,]*), (.*)]", klass).group(2) + return {k: self.__deserialize(v, sub_kls) for k, v in data.items()} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(e2b_code_interpreter.client.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datetime(data) + else: + return self.__deserialize_model(data, klass) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, value) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append((k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def parameters_to_url_query(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: URL query string (e.g. a=Hello%20World&b=123) + """ + new_params = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if isinstance(v, bool): + v = str(v).lower() + if isinstance(v, (int, float)): + v = str(v) + if isinstance(v, dict): + v = json.dumps(v) + + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, value) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append( + (k, delimiter.join(quote(str(value)) for value in v)) + ) + else: + new_params.append((k, quote(str(v)))) + + return "&".join(["=".join(item) for item in new_params]) + + def files_parameters(self, files=None): + """Builds form parameters. + + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + + if files: + for k, v in files.items(): + if not v: + continue + file_names = v if type(v) is list else [v] + for n in file_names: + with open(n, "rb") as f: + filename = os.path.basename(f.name) + filedata = f.read() + mimetype = ( + mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + params.append(tuple([k, tuple([filename, filedata, mimetype])])) + + return params + + def select_header_accept(self, accepts: List[str]) -> Optional[str]: + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return None + + for accept in accepts: + if re.search("json", accept, re.IGNORECASE): + return accept + + return accepts[0] + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return None + + for content_type in content_types: + if re.search("json", content_type, re.IGNORECASE): + return content_type + + return content_types[0] + + def update_params_for_auth( + self, + headers, + queries, + auth_settings, + resource_path, + method, + body, + request_auth=None, + ) -> None: + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param request_auth: if set, the provided settings will + override the token in the configuration. + """ + if not auth_settings: + return + + if request_auth: + self._apply_auth_params( + headers, queries, resource_path, method, body, request_auth + ) + else: + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + self._apply_auth_params( + headers, queries, resource_path, method, body, auth_setting + ) + + def _apply_auth_params( + self, headers, queries, resource_path, method, body, auth_setting + ) -> None: + """Updates the request parameters based on a single auth_setting + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param auth_setting: auth settings for the endpoint + """ + if auth_setting["in"] == "cookie": + headers["Cookie"] = auth_setting["value"] + elif auth_setting["in"] == "header": + if auth_setting["type"] != "http-signature": + headers[auth_setting["key"]] = auth_setting["value"] + elif auth_setting["in"] == "query": + queries.append((auth_setting["key"], auth_setting["value"])) + else: + raise ApiValueError("Authentication token must be in `query` or `header`") + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + handle file downloading + save response body into a tmp file and return the instance + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + filename = re.search( + r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition + ).group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return str(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return an original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datetime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=("Failed to parse `{0}` as datetime object".format(string)), + ) + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + return klass.from_dict(data) diff --git a/python/e2b_code_interpreter/client/api_response.py b/python/e2b_code_interpreter/client/api_response.py new file mode 100644 index 00000000..f3855566 --- /dev/null +++ b/python/e2b_code_interpreter/client/api_response.py @@ -0,0 +1,22 @@ +"""API response object.""" + +from __future__ import annotations +from typing import Any, Dict, Optional, Generic, TypeVar +from pydantic import Field, StrictInt, StrictStr, StrictBytes, BaseModel + +T = TypeVar("T") + + +class ApiResponse(BaseModel, Generic[T]): + """ + API response object + """ + + status_code: StrictInt = Field(description="HTTP status code") + headers: Optional[Dict[StrictStr, StrictStr]] = Field( + None, description="HTTP headers" + ) + data: T = Field(description="Deserialized data given the data type") + raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") + + model_config = {"arbitrary_types_allowed": True} diff --git a/python/e2b_code_interpreter/client/configuration.py b/python/e2b_code_interpreter/client/configuration.py new file mode 100644 index 00000000..a2899946 --- /dev/null +++ b/python/e2b_code_interpreter/client/configuration.py @@ -0,0 +1,443 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import copy +import logging +import sys +import urllib3 + +import http.client as httplib + +JSON_SCHEMA_VALIDATION_KEYWORDS = { + "multipleOf", + "maximum", + "exclusiveMaximum", + "minimum", + "exclusiveMinimum", + "maxLength", + "minLength", + "pattern", + "maxItems", + "minItems", +} + + +class Configuration: + """This class contains various settings of the API client. + + :param host: Base url. + :param api_key: Dict to store API key(s). + Each entry in the dict specifies an API key. + The dict key is the name of the security scheme in the OAS specification. + The dict value is the API key secret. + :param api_key_prefix: Dict to store API prefix (e.g. Bearer). + The dict key is the name of the security scheme in the OAS specification. + The dict value is an API key prefix when generating the auth data. + :param username: Username for HTTP basic authentication. + :param password: Password for HTTP basic authentication. + :param access_token: Access token. + :param server_index: Index to servers configuration. + :param server_variables: Mapping with string values to replace variables in + templated server configuration. The validation of enums is performed for + variables with defined enum values before. + :param server_operation_index: Mapping from operation ID to an index to server + configuration. + :param server_operation_variables: Mapping from operation ID to a mapping with + string values to replace variables in templated server configuration. + The validation of enums is performed for variables with defined enum + values before. + :param ssl_ca_cert: str - the path to a file of concatenated CA certificates + in PEM format. + + """ + + _default = None + + def __init__( + self, + host=None, + api_key=None, + api_key_prefix=None, + username=None, + password=None, + access_token=None, + server_index=None, + server_variables=None, + server_operation_index=None, + server_operation_variables=None, + ssl_ca_cert=None, + ) -> None: + """Constructor""" + self._base_path = "http://localhost" if host is None else host + """Default Base url + """ + self.server_index = 0 if server_index is None and host is None else server_index + self.server_operation_index = server_operation_index or {} + """Default server index + """ + self.server_variables = server_variables or {} + self.server_operation_variables = server_operation_variables or {} + """Default server variables + """ + self.temp_folder_path = None + """Temp file folder for downloading files + """ + # Authentication Settings + self.api_key = {} + if api_key: + self.api_key = api_key + """dict to store API key(s) + """ + self.api_key_prefix = {} + if api_key_prefix: + self.api_key_prefix = api_key_prefix + """dict to store API prefix (e.g. Bearer) + """ + self.refresh_api_key_hook = None + """function hook to refresh API key if expired + """ + self.username = username + """Username for HTTP basic authentication + """ + self.password = password + """Password for HTTP basic authentication + """ + self.access_token = access_token + """Access token + """ + self.logger = {} + """Logging Settings + """ + self.logger["package_logger"] = logging.getLogger("e2b_code_interpreter.client") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + self.logger_format = "%(asctime)s %(levelname)s %(message)s" + """Log format + """ + self.logger_stream_handler = None + """Log stream handler + """ + self.logger_file_handler = None + """Log file handler + """ + self.logger_file = None + """Debug file location + """ + self.debug = False + """Debug switch + """ + + self.verify_ssl = True + """SSL/TLS verification + Set this to false to skip verifying SSL certificate when calling API + from https server. + """ + self.ssl_ca_cert = ssl_ca_cert + """Set this to customize the certificate file to verify the peer. + """ + self.cert_file = None + """client certificate file + """ + self.key_file = None + """client key file + """ + self.assert_hostname = None + """Set this to True/False to enable/disable SSL hostname verification. + """ + self.tls_server_name = None + """SSL/TLS Server Name Indication (SNI) + Set this to the SNI value expected by the server. + """ + + self.proxy = None + """Proxy URL + """ + self.proxy_headers = None + """Proxy headers + """ + self.safe_chars_for_path_param = "" + """Safe chars for path_param + """ + self.retries = None + """Adding retries to override urllib3 default value 3 + """ + # Enable client side validation + self.client_side_validation = True + + self.socket_options = None + """Options to pass down to the underlying urllib3 socket + """ + + self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" + """datetime format + """ + + self.date_format = "%Y-%m-%d" + """date format + """ + + def __deepcopy__(self, memo): + cls = self.__class__ + result = cls.__new__(cls) + memo[id(self)] = result + for k, v in self.__dict__.items(): + if k not in ("logger", "logger_file_handler"): + setattr(result, k, copy.deepcopy(v, memo)) + # shallow copy of loggers + result.logger = copy.copy(self.logger) + # use setters to configure loggers + result.logger_file = self.logger_file + result.debug = self.debug + return result + + def __setattr__(self, name, value): + object.__setattr__(self, name, value) + + @classmethod + def set_default(cls, default): + """Set default instance of configuration. + + It stores default configuration, which can be + returned by get_default_copy method. + + :param default: object of Configuration + """ + cls._default = default + + @classmethod + def get_default_copy(cls): + """Deprecated. Please use `get_default` instead. + + Deprecated. Please use `get_default` instead. + + :return: The configuration object. + """ + return cls.get_default() + + @classmethod + def get_default(cls): + """Return the default configuration. + + This method returns newly created, based on default constructor, + object of Configuration class or returns a copy of default + configuration. + + :return: The configuration object. + """ + if cls._default is None: + cls._default = Configuration() + return cls._default + + @property + def logger_file(self): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in self.logger.items(): + logger.addHandler(self.logger_file_handler) + + @property + def debug(self): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in self.logger.items(): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in self.logger.items(): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier, alias=None): + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :param alias: The alternative identifier of apiKey. + :return: The token for api key authentication. + """ + if self.refresh_api_key_hook is not None: + self.refresh_api_key_hook(self) + key = self.api_key.get( + identifier, self.api_key.get(alias) if alias is not None else None + ) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + else: + return key + + def get_basic_auth_token(self): + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + username = "" + if self.username is not None: + username = self.username + password = "" + if self.password is not None: + password = self.password + return urllib3.util.make_headers(basic_auth=username + ":" + password).get( + "authorization" + ) + + def auth_settings(self): + """Gets Auth Settings dict for api client. + + :return: The Auth Settings information dict. + """ + auth = {} + return auth + + def to_debug_report(self): + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return ( + "Python SDK Debug Report:\n" + "OS: {env}\n" + "Python Version: {pyversion}\n" + "Version of the API: 0.1.0\n" + "SDK Package Version: 1.0.0".format(env=sys.platform, pyversion=sys.version) + ) + + def get_host_settings(self): + """Gets an array of host settings + + :return: An array of host settings + """ + return [ + { + "url": "", + "description": "No description provided", + } + ] + + def get_host_from_settings(self, index, variables=None, servers=None): + """Gets host URL based on the index and variables + :param index: array index of the host settings + :param variables: hash of variable and the corresponding value + :param servers: an array of host settings or None + :return: URL based on host settings + """ + if index is None: + return self._base_path + + variables = {} if variables is None else variables + servers = self.get_host_settings() if servers is None else servers + + try: + server = servers[index] + except IndexError: + raise ValueError( + "Invalid index {0} when selecting the host settings. " + "Must be less than {1}".format(index, len(servers)) + ) + + url = server["url"] + + # go through variables and replace placeholders + for variable_name, variable in server.get("variables", {}).items(): + used_value = variables.get(variable_name, variable["default_value"]) + + if "enum_values" in variable and used_value not in variable["enum_values"]: + raise ValueError( + "The variable `{0}` in the host URL has invalid value " + "{1}. Must be {2}.".format( + variable_name, variables[variable_name], variable["enum_values"] + ) + ) + + url = url.replace("{" + variable_name + "}", used_value) + + return url + + @property + def host(self): + """Return generated host.""" + return self.get_host_from_settings( + self.server_index, variables=self.server_variables + ) + + @host.setter + def host(self, value): + """Fix base path.""" + self._base_path = value + self.server_index = None diff --git a/python/e2b_code_interpreter/client/exceptions.py b/python/e2b_code_interpreter/client/exceptions.py new file mode 100644 index 00000000..d0a4d0f0 --- /dev/null +++ b/python/e2b_code_interpreter/client/exceptions.py @@ -0,0 +1,167 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +class OpenApiException(Exception): + """The base exception class for all OpenAPIExceptions""" + + +class ApiTypeError(OpenApiException, TypeError): + def __init__( + self, msg, path_to_item=None, valid_classes=None, key_type=None + ) -> None: + """Raises an exception for TypeErrors + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list): a list of keys an indices to get to the + current_item + None if unset + valid_classes (tuple): the primitive classes that current item + should be an instance of + None if unset + key_type (bool): False if our value is a value in a dict + True if it is a key in a dict + False if our item is an item in a list + None if unset + """ + self.path_to_item = path_to_item + self.valid_classes = valid_classes + self.key_type = key_type + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiTypeError, self).__init__(full_msg) + + +class ApiValueError(OpenApiException, ValueError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list) the path to the exception in the + received_data dict. None if unset + """ + + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiValueError, self).__init__(full_msg) + + +class ApiAttributeError(OpenApiException, AttributeError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Raised when an attribute reference or assignment fails. + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiAttributeError, self).__init__(full_msg) + + +class ApiKeyError(OpenApiException, KeyError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiKeyError, self).__init__(full_msg) + + +class ApiException(OpenApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + if http_resp: + self.status = http_resp.status + self.reason = http_resp.reason + self.body = http_resp.data.decode("utf-8") + self.headers = http_resp.getheaders() + else: + self.status = status + self.reason = reason + self.body = None + self.headers = None + + def __str__(self): + """Custom error messages for exception""" + error_message = "({0})\n" "Reason: {1}\n".format(self.status, self.reason) + if self.headers: + error_message += "HTTP response headers: {0}\n".format(self.headers) + + if self.body: + error_message += "HTTP response body: {0}\n".format(self.body) + + return error_message + + +class BadRequestException(ApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + super(BadRequestException, self).__init__(status, reason, http_resp) + + +class NotFoundException(ApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + super(NotFoundException, self).__init__(status, reason, http_resp) + + +class UnauthorizedException(ApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + super(UnauthorizedException, self).__init__(status, reason, http_resp) + + +class ForbiddenException(ApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + super(ForbiddenException, self).__init__(status, reason, http_resp) + + +class ServiceException(ApiException): + + def __init__(self, status=None, reason=None, http_resp=None) -> None: + super(ServiceException, self).__init__(status, reason, http_resp) + + +def render_path(path_to_item): + """Returns a string representation of a path""" + result = "" + for pth in path_to_item: + if isinstance(pth, int): + result += "[{0}]".format(pth) + else: + result += "['{0}']".format(pth) + return result diff --git a/python/e2b_code_interpreter/client/models/__init__.py b/python/e2b_code_interpreter/client/models/__init__.py new file mode 100644 index 00000000..8265128c --- /dev/null +++ b/python/e2b_code_interpreter/client/models/__init__.py @@ -0,0 +1,21 @@ +# coding: utf-8 + +# flake8: noqa +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +# import models into model package +from e2b_code_interpreter.client.models.error import Error +from e2b_code_interpreter.client.models.execution import Execution +from e2b_code_interpreter.client.models.execution_request import ExecutionRequest +from e2b_code_interpreter.client.models.logs import Logs +from e2b_code_interpreter.client.models.result import Result diff --git a/python/e2b_code_interpreter/client/models/error.py b/python/e2b_code_interpreter/client/models/error.py new file mode 100644 index 00000000..7f3fa279 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/error.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictInt, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Error(BaseModel): + """ + Error + """ # noqa: E501 + + name: Optional[StrictStr] = Field(default=None, description="Name of the exception") + value: Optional[StrictStr] = Field( + default=None, description="Value of the exception" + ) + traceback_raw: Optional[List[StrictStr]] = Field( + default=None, description="List of strings representing the traceback" + ) + code: Optional[StrictInt] = Field(default=None, description="Error code") + message: Optional[StrictStr] = Field(default=None, description="Error") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = [ + "name", + "value", + "traceback_raw", + "code", + "message", + ] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Error from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Error from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "name": obj.get("name"), + "value": obj.get("value"), + "traceback_raw": obj.get("traceback_raw"), + "code": obj.get("code"), + "message": obj.get("message"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/python/e2b_code_interpreter/client/models/execution.py b/python/e2b_code_interpreter/client/models/execution.py new file mode 100644 index 00000000..e97cdc50 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/execution.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictInt +from pydantic import Field +from e2b_code_interpreter.client.models.error import Error +from e2b_code_interpreter.client.models.logs import Logs +from e2b_code_interpreter.client.models.result import Result + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Execution(BaseModel): + """ + Execution + """ # noqa: E501 + + results: Optional[List[Result]] = None + logs: Optional[Logs] = None + error: Optional[Error] = None + execution_count: Optional[StrictInt] = Field( + default=None, description="Execution count of the cell." + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["results", "logs", "error", "execution_count"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Execution from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in results (list) + _items = [] + if self.results: + for _item in self.results: + if _item: + _items.append(_item.to_dict()) + _dict["results"] = _items + # override the default output from pydantic by calling `to_dict()` of logs + if self.logs: + _dict["logs"] = self.logs.to_dict() + # override the default output from pydantic by calling `to_dict()` of error + if self.error: + _dict["error"] = self.error.to_dict() + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Execution from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "results": ( + [Result.from_dict(_item) for _item in obj.get("results")] + if obj.get("results") is not None + else None + ), + "logs": ( + Logs.from_dict(obj.get("logs")) + if obj.get("logs") is not None + else None + ), + "error": ( + Error.from_dict(obj.get("error")) + if obj.get("error") is not None + else None + ), + "execution_count": obj.get("execution_count"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/python/e2b_code_interpreter/client/models/execution_request.py b/python/e2b_code_interpreter/client/models/execution_request.py new file mode 100644 index 00000000..b0ff03e2 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/execution_request.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class ExecutionRequest(BaseModel): + """ + ExecutionRequest + """ # noqa: E501 + + code: StrictStr = Field(description="Code to be executed") + language: Optional[StrictStr] = Field( + default=None, description="Language of the code to be executed" + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["code", "language"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ExecutionRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of ExecutionRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"code": obj.get("code"), "language": obj.get("language")} + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/python/e2b_code_interpreter/client/models/logs.py b/python/e2b_code_interpreter/client/models/logs.py new file mode 100644 index 00000000..e91a91b2 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/logs.py @@ -0,0 +1,98 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import BaseModel, StrictStr + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Logs(BaseModel): + """ + Logs + """ # noqa: E501 + + stdout: Optional[StrictStr] = None + stderr: Optional[StrictStr] = None + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["stdout", "stderr"] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Logs from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Logs from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"stdout": obj.get("stdout"), "stderr": obj.get("stderr")} + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/python/e2b_code_interpreter/client/models/result.py b/python/e2b_code_interpreter/client/models/result.py new file mode 100644 index 00000000..7d21bb86 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/result.py @@ -0,0 +1,154 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Any, ClassVar, Dict, List, Optional, Union +from pydantic import BaseModel, StrictStr +from pydantic import Field + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Result(BaseModel): + """ + Result + """ # noqa: E501 + + text: Optional[StrictStr] = Field( + default=None, description="Textual representation of the result" + ) + html: Optional[StrictStr] = Field( + default=None, description="HTML representation of the result" + ) + markdown: Optional[StrictStr] = Field( + default=None, description="Markdown representation of the result" + ) + svg: Optional[StrictStr] = Field( + default=None, description="SVG representation of the result" + ) + png: Optional[StrictStr] = Field( + default=None, description="PNG representation of the result" + ) + jpeg: Optional[StrictStr] = Field( + default=None, description="JPEG representation of the result" + ) + pdf: Optional[StrictStr] = Field( + default=None, description="PDF representation of the result" + ) + latex: Optional[StrictStr] = Field( + default=None, description="LaTeX representation of the result" + ) + var_json: Optional[Union[str, Any]] = Field( + default=None, description="JSON representation of the result", alias="json" + ) + javascript: Optional[StrictStr] = Field( + default=None, description="JavaScript representation of the result" + ) + extra: Optional[Union[str, Any]] = Field( + default=None, description="Extra representations of the result" + ) + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = [ + "text", + "html", + "markdown", + "svg", + "png", + "jpeg", + "pdf", + "latex", + "json", + "javascript", + "extra", + ] + + model_config = {"populate_by_name": True, "validate_assignment": True} + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Result from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + _dict = self.model_dump( + by_alias=True, + exclude={ + "additional_properties", + }, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Dict) -> Self: + """Create an instance of Result from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "text": obj.get("text"), + "html": obj.get("html"), + "markdown": obj.get("markdown"), + "svg": obj.get("svg"), + "png": obj.get("png"), + "jpeg": obj.get("jpeg"), + "pdf": obj.get("pdf"), + "latex": obj.get("latex"), + "json": obj.get("json"), + "javascript": obj.get("javascript"), + "extra": obj.get("extra"), + } + ) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj diff --git a/python/e2b_code_interpreter/client/rest.py b/python/e2b_code_interpreter/client/rest.py new file mode 100644 index 00000000..bd2bccce --- /dev/null +++ b/python/e2b_code_interpreter/client/rest.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + E2B Code Interpreter + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import io +import json +import re +import ssl + +import urllib3 + +from e2b_code_interpreter.client.exceptions import ApiException, ApiValueError + +RESTResponseType = urllib3.HTTPResponse + + +class RESTResponse(io.IOBase): + + def __init__(self, resp) -> None: + self.response = resp + self.status = resp.status + self.reason = resp.reason + self.data = None + + def read(self): + if self.data is None: + self.data = self.response.data + return self.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.response.headers + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.response.headers.get(name, default) + + +class RESTClientObject: + + def __init__(self, configuration) -> None: + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + addition_pool_args = {} + if configuration.assert_hostname is not None: + addition_pool_args["assert_hostname"] = configuration.assert_hostname + + if configuration.retries is not None: + addition_pool_args["retries"] = configuration.retries + + if configuration.tls_server_name: + addition_pool_args["server_hostname"] = configuration.tls_server_name + + if configuration.socket_options is not None: + addition_pool_args["socket_options"] = configuration.socket_options + + # https pool manager + if configuration.proxy: + self.pool_manager = urllib3.ProxyManager( + cert_reqs=cert_reqs, + ca_certs=configuration.ssl_ca_cert, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + proxy_url=configuration.proxy, + proxy_headers=configuration.proxy_headers, + **addition_pool_args + ) + else: + self.pool_manager = urllib3.PoolManager( + cert_reqs=cert_reqs, + ca_certs=configuration.ssl_ca_cert, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + **addition_pool_args + ) + + def request( + self, + method, + url, + headers=None, + body=None, + post_params=None, + _request_timeout=None, + ): + """Perform requests. + + :param method: http request method + :param url: http request url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"] + + if post_params and body: + raise ApiValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, float)): + timeout = urllib3.Timeout(total=_request_timeout) + elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2: + timeout = urllib3.Timeout( + connect=_request_timeout[0], read=_request_timeout[1] + ) + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: + + # no content type provided or payload is json + content_type = headers.get("Content-Type") + if not content_type or re.search("json", content_type, re.IGNORECASE): + request_body = None + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, + url, + body=request_body, + timeout=timeout, + headers=headers, + preload_content=False, + ) + elif content_type == "application/x-www-form-urlencoded": + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=False, + timeout=timeout, + headers=headers, + preload_content=False, + ) + elif content_type == "multipart/form-data": + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers["Content-Type"] + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=True, + timeout=timeout, + headers=headers, + preload_content=False, + ) + # Pass a `string` parameter directly in the body to support + # other content types than Json when `body` argument is + # provided in serialized form + elif isinstance(body, str) or isinstance(body, bytes): + request_body = body + r = self.pool_manager.request( + method, + url, + body=request_body, + timeout=timeout, + headers=headers, + preload_content=False, + ) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request( + method, + url, + fields={}, + timeout=timeout, + headers=headers, + preload_content=False, + ) + except urllib3.exceptions.SSLError as e: + msg = "\n".join([type(e).__name__, str(e)]) + raise ApiException(status=0, reason=msg) + + return RESTResponse(r) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d8eeab52..4323e51b 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -1,17 +1,13 @@ from __future__ import annotations import logging -import threading -import uuid -import requests -from concurrent.futures import Future -from typing import Any, Callable, List, Optional, Dict +from typing import Any, Callable, Optional, Dict from e2b import Sandbox +from e2b_code_interpreter.client import ApiClient, DefaultApi, ExecutionRequest from e2b_code_interpreter.constants import TIMEOUT -from e2b_code_interpreter.messaging import CellMessage, JupyterKernelWebSocket -from e2b_code_interpreter.models import KernelException, Execution, Result +from e2b_code_interpreter.models import Execution, Result logger = logging.getLogger(__name__) @@ -44,41 +40,12 @@ def __init__( sandbox_id=sandbox_id, request_timeout=request_timeout, ) - self.notebook = JupyterExtension(self, request_timeout=request_timeout) - - def close(self): - # Close all the websocket connections to the kernels - self.notebook.close() - - def get_protocol(self, base_protocol: str = "http") -> str: - """ - The function decides whether to use the secure or insecure protocol. - - :param base_protocol: Specify the specific protocol you want to use. Do not include the `s` in `https` or `wss`. - :param secure: Specify whether you want to use the secure protocol or not. - - :return: Protocol for the connection to the sandbox - """ - return base_protocol if self._connection_config.debug else f"{base_protocol}s" - - -class JupyterExtension: - def __init__(self, sandbox: CodeInterpreter, request_timeout: float = TIMEOUT): - self._sandbox = sandbox - self._kernel_id_set = Future() - self._start_connecting_to_default_kernel(request_timeout=request_timeout) - self._connected_kernels: Dict[str, Future[JupyterKernelWebSocket]] = {} - self._default_kernel_id: Optional[str] = None def exec_cell( self, code: str, kernel_id: Optional[str] = None, - on_stdout: Optional[Callable[[CellMessage], Any]] = None, - on_stderr: Optional[Callable[[CellMessage], Any]] = None, - on_result: Optional[Callable[[Result], Any]] = None, timeout: float = TIMEOUT, - request_timeout: float = TIMEOUT, ) -> Execution: """ Execute code in a notebook cell. @@ -89,248 +56,17 @@ def exec_cell( :param on_stderr: A callback function to handle standard error messages from the code execution. :param on_result: A callback function to handle the result and display calls of the code execution. :param timeout: Timeout for the call + :param request_timeout: Timeout for the request :return: Result of the execution """ - kernel_id = kernel_id or self.default_kernel_id - ws_future = self._connected_kernels.get(kernel_id) - logger.debug(f"Executing code in kernel {kernel_id}") - if ws_future: - logger.debug(f"Using existing websocket connection to kernel {kernel_id}") - ws = ws_future.result(timeout=timeout) - else: - logger.debug(f"Creating new websocket connection to kernel {kernel_id}") - ws = self._connect_to_kernel_ws( - kernel_id, - None, - request_timeout=request_timeout, - ) + with DefaultApi() as api_client: + result = api_client.exec_post(ExecutionRequest(code=code), _request_timeout=timeout) - message_id = ws.send_execution_message(code, on_stdout, on_stderr, on_result) logger.debug( - f"Sent execution message to kernel {kernel_id}, message_id: {message_id}" - ) - - result = ws.get_result(message_id, timeout=timeout) - logger.debug( - f"Received result from kernel {kernel_id}, message_id: {message_id}, result: {result}" + f"Received result from kernel {kernel_id}, result: {result}" ) return result - - @property - def default_kernel_id(self) -> str: - """ - Get the default kernel id - - :return: Default kernel id - """ - if not self._default_kernel_id: - logger.debug("Waiting for default kernel id") - self._default_kernel_id = self._kernel_id_set.result() - - return self._default_kernel_id - - def create_kernel( - self, - cwd: str = "/home/user", - kernel_name: Optional[str] = None, - request_timeout: Optional[float] = TIMEOUT, - ) -> str: - """ - Creates a new kernel, this can be useful if you want to have multiple independent code execution environments. - - The kernel can be optionally configured to start in a specific working directory and/or - with a specific kernel name. If no kernel name is provided, the default kernel will be used. - Once the kernel is created, this method establishes a WebSocket connection to the new kernel for - real-time communication. - - :param cwd: Sets the current working directory for the kernel. Defaults to "/home/user". - :param kernel_name: - Specifies which kernel should be used, useful if you have multiple kernel types. - If not provided, the default kernel will be used. - :param request_timeout: Timeout for the kernel creation request. - :return: Kernel id of the created kernel - """ - kernel_name = kernel_name or "python3" - - data = { - "path": str(uuid.uuid4()), - "kernel": {"name": kernel_name}, - "type": "notebook", - "name": str(uuid.uuid4()), - } - logger.debug(f"Creating kernel with data: {data}") - - response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions", - json=data, - timeout=request_timeout, - ) - if not response.ok: - raise KernelException(f"Failed to create kernel: {response.text}") - - session_data = response.json() - session_id = session_data["id"] - kernel_id = session_data["kernel"]["id"] - - response = requests.patch( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/sessions/{session_id}", - json={"path": cwd}, - timeout=request_timeout, - ) - if not response.ok: - raise KernelException(f"Failed to create kernel: {response.text}") - - logger.debug(f"Created kernel {kernel_id}") - - threading.Thread( - target=self._connect_to_kernel_ws, - args=(kernel_id, session_id, request_timeout), - ).start() - return kernel_id - - def restart_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = TIMEOUT, - ) -> None: - """ - Restarts an existing Jupyter kernel. This can be useful to reset the kernel's state or to recover from errors. - - :param kernel_id: The unique identifier of the kernel to restart. If not provided, the default kernel is restarted. - :param timeout: The timeout in milliseconds for the kernel restart request. - """ - kernel_id = kernel_id or self.default_kernel_id - logger.debug(f"Restarting kernel {kernel_id}") - - self._connected_kernels[kernel_id].result().close() - del self._connected_kernels[kernel_id] - logger.debug(f"Closed websocket connection to kernel {kernel_id}") - - response = requests.post( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}/restart", - timeout=request_timeout, - ) - if not response.ok: - raise KernelException(f"Failed to restart kernel {kernel_id}") - - logger.debug(f"Restarted kernel {kernel_id}") - - threading.Thread( - target=self._connect_to_kernel_ws, args=(kernel_id, None, request_timeout) - ).start() - - def shutdown_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = TIMEOUT, - ) -> None: - """ - Shuts down an existing Jupyter kernel. This method is used to gracefully terminate a kernel's process. - - :param kernel_id: The unique identifier of the kernel to shutdown. If not provided, the default kernel is shutdown. - :param timeout: The timeout for the kernel shutdown request. - """ - kernel_id = kernel_id or self.default_kernel_id - logger.debug(f"Shutting down kernel {kernel_id}") - - self._connected_kernels[kernel_id].result().close() - del self._connected_kernels[kernel_id] - logger.debug(f"Closed websocket connection to kernel {kernel_id}") - - response = requests.delete( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}", - timeout=request_timeout, - ) - if not response.ok: - raise KernelException(f"Failed to shutdown kernel {kernel_id}") - - logger.debug(f"Shutdown kernel {kernel_id}") - - def list_kernels(self, request_timeout: Optional[float] = TIMEOUT) -> List[str]: - """ - Lists all available Jupyter kernels. - - This method fetches a list of all currently available Jupyter kernels from the server. It can be used - to retrieve the IDs of all kernels that are currently running or available for connection. - - :param timeout: The timeout for the kernel list request. - :return: List of kernel ids - """ - response = requests.get( - f"{self._sandbox.get_protocol()}://{self._sandbox.get_host(8888)}/api/kernels", - timeout=request_timeout, - ) - - if not response.ok: - raise KernelException(f"Failed to list kernels: {response.text}") - - return [kernel["id"] for kernel in response.json()] - - def close(self): - """ - Close all the websocket connections to the kernels. It doesn't shutdown the kernels. - """ - logger.debug("Closing all websocket connections") - for ws in self._connected_kernels.values(): - ws.result().close() - - def _connect_to_kernel_ws( - self, - kernel_id: str, - session_id: Optional[str], - request_timeout: float = TIMEOUT, - ) -> JupyterKernelWebSocket: - """ - Establishes a WebSocket connection to a specified Jupyter kernel. - - :param kernel_id: Kernel id - :param timeout: The timeout for the kernel connection request. - - :return: Websocket connection - """ - logger.debug(f"Connecting to kernel's ({kernel_id}) websocket") - future = Future() - self._connected_kernels[kernel_id] = future - - session_id = session_id or str(uuid.uuid4()) - ws = JupyterKernelWebSocket( - url=f"{self._sandbox.get_protocol('ws')}://{self._sandbox.get_host(8888)}/api/kernels/{kernel_id}/channels", - session_id=session_id, - ) - - ws.connect(timeout=request_timeout) - logger.debug(f"Connected to kernel's ({kernel_id}) websocket.") - - future.set_result(ws) - return ws - - def _start_connecting_to_default_kernel( - self, request_timeout: float = TIMEOUT - ) -> None: - """ - Start connecting to the default kernel in a separate thread to avoid blocking the main thread. - :param timeout: Timeout for the call - """ - logger.debug("Starting to connect to the default kernel") - - def setup_default_kernel(): - kernel_id = self._sandbox.files.read( - "/root/.jupyter/kernel_id", request_timeout=request_timeout - ) - - if kernel_id is None and not self._sandbox.is_running( - request_timeout=request_timeout - ): - return - - kernel_id = kernel_id.strip() - - logger.debug(f"Default kernel id: {kernel_id}") - self._connect_to_kernel_ws(kernel_id, None, request_timeout=request_timeout) - self._kernel_id_set.set_result(kernel_id) - - threading.Thread(target=setup_default_kernel).start() From 37ef1a845710fde066b5521423661b06ce35cb5e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 22:28:05 +0200 Subject: [PATCH 060/722] Clean up --- python/e2b_code_interpreter/main.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 4323e51b..a7a96be7 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -2,12 +2,12 @@ import logging -from typing import Any, Callable, Optional, Dict +from typing import Optional, Dict from e2b import Sandbox -from e2b_code_interpreter.client import ApiClient, DefaultApi, ExecutionRequest +from e2b_code_interpreter.client import DefaultApi, ExecutionRequest from e2b_code_interpreter.constants import TIMEOUT -from e2b_code_interpreter.models import Execution, Result +from e2b_code_interpreter.models import Execution logger = logging.getLogger(__name__) @@ -52,11 +52,7 @@ def exec_cell( :param code: Code to execute :param kernel_id: The ID of the kernel to execute the code on. If not provided, the default kernel is used. - :param on_stdout: A callback function to handle standard output messages from the code execution. - :param on_stderr: A callback function to handle standard error messages from the code execution. - :param on_result: A callback function to handle the result and display calls of the code execution. :param timeout: Timeout for the call - :param request_timeout: Timeout for the request :return: Result of the execution """ From 7a14a0621dadf7e2d605e5db81b43e0a8c6b35a7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 22:30:08 +0200 Subject: [PATCH 061/722] Change params --- python/e2b_code_interpreter/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index a7a96be7..6e124a7f 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -44,25 +44,25 @@ def __init__( def exec_cell( self, code: str, - kernel_id: Optional[str] = None, + language: Optional[str] = None, timeout: float = TIMEOUT, ) -> Execution: """ Execute code in a notebook cell. :param code: Code to execute - :param kernel_id: The ID of the kernel to execute the code on. If not provided, the default kernel is used. + :param language: Language of the code to be executed :param timeout: Timeout for the call :return: Result of the execution """ - logger.debug(f"Executing code in kernel {kernel_id}") + logger.debug(f"Executing code {code} for language {language}") with DefaultApi() as api_client: - result = api_client.exec_post(ExecutionRequest(code=code), _request_timeout=timeout) + result = api_client.exec_post(ExecutionRequest(code=code, language=language), _request_timeout=timeout) logger.debug( - f"Received result from kernel {kernel_id}, result: {result}" + f"Received result: {result}" ) return result From 4dda74ddbf73ceeb3fe3589cb2ed9799f87eaceb Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 22:54:44 +0200 Subject: [PATCH 062/722] Fix Python API client --- python/e2b_code_interpreter/__init__.py | 2 +- python/e2b_code_interpreter/main.py | 22 +++++++++++++--------- python/example.py | 4 ++-- python/poetry.lock | 10 +++++----- python/pyproject.toml | 2 +- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index aa04c93d..980d6925 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -1,4 +1,4 @@ from e2b import * -from .main import CodeInterpreter, JupyterExtension +from .main import CodeInterpreter from .models import Execution, Error, Result, KernelException, MIMEType, Logs diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 6e124a7f..218f8fe0 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -5,7 +5,7 @@ from typing import Optional, Dict from e2b import Sandbox -from e2b_code_interpreter.client import DefaultApi, ExecutionRequest +from e2b_code_interpreter.client import DefaultApi, ExecutionRequest, ApiClient, Configuration from e2b_code_interpreter.constants import TIMEOUT from e2b_code_interpreter.models import Execution @@ -17,7 +17,7 @@ class CodeInterpreter(Sandbox): E2B code interpreter sandbox extension. """ - default_template = "code-interpreter-stateful" + default_template = "ci-no-ws" def __init__( self, @@ -41,7 +41,7 @@ def __init__( request_timeout=request_timeout, ) - def exec_cell( + def exec_code( self, code: str, language: Optional[str] = None, @@ -56,13 +56,17 @@ def exec_cell( :return: Result of the execution """ - logger.debug(f"Executing code {code} for language {language}") - - with DefaultApi() as api_client: - result = api_client.exec_post(ExecutionRequest(code=code, language=language), _request_timeout=timeout) - logger.debug( - f"Received result: {result}" + f"Executing code {code} for language {language} (Sandbox: {self.sandbox_id})" ) + configuration = Configuration(host=self.get_host(8000)) + with ApiClient(configuration=configuration) as client: + api_client = DefaultApi(api_client=client) + result = api_client.exec_post( + ExecutionRequest(code=code, language=language), _request_timeout=timeout + ) + + logger.debug(f"Received result: {result} (Sandbox: {self.sandbox_id})") + return result diff --git a/python/example.py b/python/example.py index a1aec4bd..28ccf43f 100644 --- a/python/example.py +++ b/python/example.py @@ -24,8 +24,8 @@ """ with CodeInterpreter() as sandbox: - print(sandbox.id) - execution = sandbox.notebook.exec_cell(code) + print(sandbox.sandbox_id) + execution = sandbox.exec_code(code) print(execution.results[0].formats()) print(len(execution.results)) diff --git a/python/poetry.lock b/python/poetry.lock index 98db51fa..ee13b784 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aenum" @@ -231,13 +231,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a10" +version = "0.17.2a23" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a10-py3-none-any.whl", hash = "sha256:1db226b59875746174f1890b552bd161c8d2b59bc9b5a91a225ce221c00b118f"}, - {file = "e2b-0.17.2a10.tar.gz", hash = "sha256:817bcc7efd9858a7c0ea440d6b5a7caf1287f3361db81618a356509475809d6b"}, + {file = "e2b-0.17.2a23-py3-none-any.whl", hash = "sha256:12e65f4f2c18c750c076f7bd22c24ed0b13ad0b59ecc9b99655990e7aeb7c93d"}, + {file = "e2b-0.17.2a23.tar.gz", hash = "sha256:948542564255d913da97a754765ea3ec1bf1482a897599ace9421e6857910cdd"}, ] [package.dependencies] @@ -782,4 +782,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "974c1728366275810eda7188edf69c90b2d003fabd3d3fd1d68a879f633ce0f2" +content-hash = "ff4c6f3e9666ec83df741787901a2ea856e1dce0f046a3f011e7feb9e2cff46c" diff --git a/python/pyproject.toml b/python/pyproject.toml index 9a8ef10d..8afaec14 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a10" +e2b = "0.17.2a23" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From db54dc874282dee364e2d1fbd0f4fafd28134e9e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:13:44 +0200 Subject: [PATCH 063/722] Add missing protocol --- template/server/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index 0b04042b..3476267f 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -14,7 +14,7 @@ with open("/root/.jupyter/kernel_id") as file: kernel_id = file.read().strip() -ws = JupyterKernelWebSocket(f"localhost:8888/api/kernels/{kernel_id}/channels", session_id) +ws = JupyterKernelWebSocket(f"http://localhost:8888/api/kernels/{kernel_id}/channels", session_id) ws.connect() @app.get("/health") From b0d56d85d604574e35226a0b01262f895ed3eb65 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:20:12 +0200 Subject: [PATCH 064/722] Fix startup script --- template/start-up.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/start-up.sh b/template/start-up.sh index cc667912..85f0e184 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -28,7 +28,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" - python3 server/main.py + python3 /root/.server/main.py } echo "Starting Jupyter Server..." From c97278ec18192b2fade9112ae54253aa01e9c02f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:28:13 +0200 Subject: [PATCH 065/722] Add e2b.toml --- template/e2b.toml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 template/e2b.toml diff --git a/template/e2b.toml b/template/e2b.toml new file mode 100644 index 00000000..3109f8ce --- /dev/null +++ b/template/e2b.toml @@ -0,0 +1,16 @@ +# This is a config for E2B sandbox template. +# You can use 'template_id' (6rn8gnglohgpuk1wsack) or 'template_name (ci-no-ws) from this config to spawn a sandbox: + +# Python SDK +# from e2b import Sandbox +# sandbox = Sandbox(template='ci-no-ws') + +# JS SDK +# import { Sandbox } from 'e2b' +# const sandbox = await Sandbox.create({ template: 'ci-no-ws' }) + +memory_mb = 1_024 +start_cmd = "/root/.jupyter/start-up.sh" +dockerfile = "e2b.Dockerfile" +template_name = "ci-no-ws" +template_id = "6rn8gnglohgpuk1wsack" From fc122c4ad6be2ffef8e89da33d8a7ef63b9f33db Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:33:41 +0200 Subject: [PATCH 066/722] Fix missing import --- template/server/messaging.py | 1 + 1 file changed, 1 insertion(+) diff --git a/template/server/messaging.py b/template/server/messaging.py index 3c829085..130148dd 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -13,6 +13,7 @@ from models.execution import Execution from models.result import Result from future import DeferredFuture +from websocket_client import WebSocket TIMEOUT = 60 From ba2b84d381e4059bc4754eb984cb99fc0e02e832 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:39:54 +0200 Subject: [PATCH 067/722] Fix import --- template/server/websocket_client.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/template/server/websocket_client.py b/template/server/websocket_client.py index 67db915c..ca71b101 100644 --- a/template/server/websocket_client.py +++ b/template/server/websocket_client.py @@ -12,8 +12,6 @@ from websockets.exceptions import ConnectionClosed from websockets.typing import Data -from e2b import SandboxException - logger = logging.getLogger(__name__) @@ -135,7 +133,7 @@ async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]: except Exception: retries += 1 if retries >= max_retries: - raise SandboxException("Failed to connect to the server") + raise Exception("Failed to connect to the server") # Add a random initial delay between 0 and 5 seconds. # See 7.2.3. Recovering from Abnormal Closure in RFC 6544. if backoff_delay == 0.1: From 5692484f13904cf337cf289ef27f5704b1376fe1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:43:51 +0200 Subject: [PATCH 068/722] Start fastapi the correct way --- template/start-up.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/start-up.sh b/template/start-up.sh index 85f0e184..24ceabd4 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -28,7 +28,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" - python3 /root/.server/main.py + fastapi run /root/.server/main.py } echo "Starting Jupyter Server..." From dd929f979f694f6b21f558f1d12a556f81ee2b19 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 3 Jul 2024 23:44:51 +0200 Subject: [PATCH 069/722] Fix ws protocol --- template/server/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index 3476267f..bbbae5f8 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -14,7 +14,7 @@ with open("/root/.jupyter/kernel_id") as file: kernel_id = file.read().strip() -ws = JupyterKernelWebSocket(f"http://localhost:8888/api/kernels/{kernel_id}/channels", session_id) +ws = JupyterKernelWebSocket(f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id) ws.connect() @app.get("/health") From afffe99ea7f53ab99516d3bc46430c68dd3b798f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 07:21:54 +0200 Subject: [PATCH 070/722] Fix endpoint name + code generation --- Makefile | 11 ++++++---- openapi.yml | 2 +- .../client/api/default_api.py | 22 +++++++++---------- python/e2b_code_interpreter/main.py | 11 +++++++--- template/server/{ => api}/models/error.py | 0 template/server/{ => api}/models/execution.py | 6 ++--- .../{ => api}/models/execution_request.py | 0 template/server/{ => api}/models/logs.py | 0 template/server/{ => api}/models/result.py | 0 template/server/main.py | 9 +++++--- template/server/messaging.py | 8 +++---- 11 files changed, 40 insertions(+), 29 deletions(-) rename template/server/{ => api}/models/error.py (100%) rename template/server/{ => api}/models/execution.py (97%) rename template/server/{ => api}/models/execution_request.py (100%) rename template/server/{ => api}/models/logs.py (100%) rename template/server/{ => api}/models/result.py (100%) diff --git a/Makefile b/Makefile index 65a9bbfe..a6ff8927 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ .PHONY: generate generate: + # Generate Python client rm -rf ./python/e2b_code_interpreter/client npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 npx -yes @openapitools/openapi-generator-cli generate \ @@ -17,10 +18,10 @@ generate: rm -r ./python/e2b_code_interpreter/client/.openapi-generator rm -r ./python/e2b_code_interpreter/client/e2b_code_interpreter rm -r ./python/e2b_code_interpreter/client/.openapi-generator-ignore - black . - rm -rf ./template/server/models/* + # Generate models in server + rm -rf ./template/server/api/* npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 npx -yes @openapitools/openapi-generator-cli generate \ -i openapi.yml \ @@ -29,7 +30,9 @@ generate: --global-property apis=false,models,supportingFiles=false,modelDocs=false \ --additional-properties=disallowAdditionalPropertiesIfNotPresent=false \ --additional-properties=usePydanticV2=true \ - --additional-properties=packageName=models - mv ./template/server/tmp/models/* ./template/server + --additional-properties=packageName=api + mv ./template/server/tmp/api/* ./template/server/api rm -r ./template/server/tmp + + # Format the code black . diff --git a/openapi.yml b/openapi.yml index 6188e15e..ddd0c2a9 100644 --- a/openapi.yml +++ b/openapi.yml @@ -144,7 +144,7 @@ paths: "200": description: Request was successful - /exec: + /execute: post: description: Create a sandbox from the template requestBody: diff --git a/python/e2b_code_interpreter/client/api/default_api.py b/python/e2b_code_interpreter/client/api/default_api.py index 6fa164ba..3e92cf14 100644 --- a/python/e2b_code_interpreter/client/api/default_api.py +++ b/python/e2b_code_interpreter/client/api/default_api.py @@ -44,7 +44,7 @@ def __init__(self, api_client=None) -> None: self.api_client = api_client @validate_call - def exec_post( + def execute_post( self, execution_request: ExecutionRequest, _request_timeout: Union[ @@ -59,7 +59,7 @@ def exec_post( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> Execution: - """exec_post + """execute_post Create a sandbox from the template @@ -87,7 +87,7 @@ def exec_post( :return: Returns the result object. """ # noqa: E501 - _param = self._exec_post_serialize( + _param = self._execute_post_serialize( execution_request=execution_request, _request_auth=_request_auth, _content_type=_content_type, @@ -110,7 +110,7 @@ def exec_post( ).data @validate_call - def exec_post_with_http_info( + def execute_post_with_http_info( self, execution_request: ExecutionRequest, _request_timeout: Union[ @@ -125,7 +125,7 @@ def exec_post_with_http_info( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[Execution]: - """exec_post + """execute_post Create a sandbox from the template @@ -153,7 +153,7 @@ def exec_post_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._exec_post_serialize( + _param = self._execute_post_serialize( execution_request=execution_request, _request_auth=_request_auth, _content_type=_content_type, @@ -176,7 +176,7 @@ def exec_post_with_http_info( ) @validate_call - def exec_post_without_preload_content( + def execute_post_without_preload_content( self, execution_request: ExecutionRequest, _request_timeout: Union[ @@ -191,7 +191,7 @@ def exec_post_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """exec_post + """execute_post Create a sandbox from the template @@ -219,7 +219,7 @@ def exec_post_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._exec_post_serialize( + _param = self._execute_post_serialize( execution_request=execution_request, _request_auth=_request_auth, _content_type=_content_type, @@ -237,7 +237,7 @@ def exec_post_without_preload_content( ) return response_data.response - def _exec_post_serialize( + def _execute_post_serialize( self, execution_request, _request_auth, @@ -285,7 +285,7 @@ def _exec_post_serialize( return self.api_client.param_serialize( method="POST", - resource_path="/exec", + resource_path="/execute", path_params=_path_params, query_params=_query_params, header_params=_header_params, diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 218f8fe0..93feb2fd 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -5,7 +5,12 @@ from typing import Optional, Dict from e2b import Sandbox -from e2b_code_interpreter.client import DefaultApi, ExecutionRequest, ApiClient, Configuration +from e2b_code_interpreter.client import ( + DefaultApi, + ExecutionRequest, + ApiClient, + Configuration, +) from e2b_code_interpreter.constants import TIMEOUT from e2b_code_interpreter.models import Execution @@ -60,10 +65,10 @@ def exec_code( f"Executing code {code} for language {language} (Sandbox: {self.sandbox_id})" ) - configuration = Configuration(host=self.get_host(8000)) + configuration = Configuration(host=f"https://{self.get_host(8000)}") with ApiClient(configuration=configuration) as client: api_client = DefaultApi(api_client=client) - result = api_client.exec_post( + result = api_client.execute_post( ExecutionRequest(code=code, language=language), _request_timeout=timeout ) diff --git a/template/server/models/error.py b/template/server/api/models/error.py similarity index 100% rename from template/server/models/error.py rename to template/server/api/models/error.py diff --git a/template/server/models/execution.py b/template/server/api/models/execution.py similarity index 97% rename from template/server/models/execution.py rename to template/server/api/models/execution.py index 553ecdfc..6b093a06 100644 --- a/template/server/models/execution.py +++ b/template/server/api/models/execution.py @@ -21,9 +21,9 @@ from typing import Any, ClassVar, Dict, List, Optional from pydantic import BaseModel, StrictInt from pydantic import Field -from models.error import Error -from models.logs import Logs -from models.result import Result +from api.models.error import Error +from api.models.logs import Logs +from api.models.result import Result try: from typing import Self diff --git a/template/server/models/execution_request.py b/template/server/api/models/execution_request.py similarity index 100% rename from template/server/models/execution_request.py rename to template/server/api/models/execution_request.py diff --git a/template/server/models/logs.py b/template/server/api/models/logs.py similarity index 100% rename from template/server/models/logs.py rename to template/server/api/models/logs.py diff --git a/template/server/models/result.py b/template/server/api/models/result.py similarity index 100% rename from template/server/models/result.py rename to template/server/api/models/result.py diff --git a/template/server/main.py b/template/server/main.py index bbbae5f8..58aafed1 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -3,8 +3,8 @@ from fastapi import FastAPI from messaging import JupyterKernelWebSocket -from models.execution import Execution -from models.execution_request import ExecutionRequest +from api.models.execution import Execution +from api.models.execution_request import ExecutionRequest app = FastAPI() @@ -14,9 +14,12 @@ with open("/root/.jupyter/kernel_id") as file: kernel_id = file.read().strip() -ws = JupyterKernelWebSocket(f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id) +ws = JupyterKernelWebSocket( + f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id +) ws.connect() + @app.get("/health") def health(): return "Request was successful" diff --git a/template/server/messaging.py b/template/server/messaging.py index 130148dd..a377b2e2 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -9,11 +9,11 @@ from typing import Callable, Dict, Any, Optional from pydantic import BaseModel -from models.error import Error -from models.execution import Execution -from models.result import Result +from api.models.error import Error +from api.models.execution import Execution +from api.models.result import Result from future import DeferredFuture -from websocket_client import WebSocket +from websocket_client import WebSocket TIMEOUT = 60 From 5a730ab291dc87d00211a3097086feb8e34a566c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 07:33:11 +0200 Subject: [PATCH 071/722] Reorder dockerfile --- template/e2b.Dockerfile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 91e09145..d6cc253f 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -13,14 +13,17 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user -COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default -COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ +RUN mkdir -p $SERVER_PATH/ +COPY ./server/requirements.txt $SERVER_PATH +RUN pip install --no-cache-dir -r $SERVER_PATH/requirements.txt COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh -RUN mkdir -p $SERVER_PATH/ +COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ + +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default +COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ + COPY ./server $SERVER_PATH -RUN pip install --no-cache-dir -r $SERVER_PATH/requirements.txt From 868d60078a424e98bf327edfec2487a4ab665b6d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 09:29:12 +0200 Subject: [PATCH 072/722] Change response to json --- template/server/main.py | 6 ++++-- template/server/messaging.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 58aafed1..ba950b49 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,6 +1,7 @@ import uuid from fastapi import FastAPI +from starlette.responses import JSONResponse from messaging import JupyterKernelWebSocket from api.models.execution import Execution @@ -26,5 +27,6 @@ def health(): @app.post("/execute", response_model=Execution) -def execute(request: ExecutionRequest): - return ws.execute(code=request.code) +def execute(request: ExecutionRequest) -> JSONResponse: + result = ws.execute(code=request.code) + return JSONResponse(content=result) diff --git a/template/server/messaging.py b/template/server/messaging.py index a377b2e2..136c7d5c 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -55,7 +55,7 @@ def __init__( on_stderr: Optional[Callable[[CellMessage], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, ): - self.partial_result = Execution() + self.partial_result = Execution(results=[]) self.execution = Future() self.on_stdout = on_stdout self.on_stderr = on_stderr From b6b359fd73a4c5d78b8acd9457087099afd2eebc Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 16:29:52 +0200 Subject: [PATCH 073/722] Fix status code --- openapi.yml | 2 +- python/e2b_code_interpreter/client/api/default_api.py | 6 +++--- template/server/main.py | 8 +++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/openapi.yml b/openapi.yml index ddd0c2a9..ce68e49e 100644 --- a/openapi.yml +++ b/openapi.yml @@ -154,7 +154,7 @@ paths: schema: $ref: "#/components/schemas/ExecutionRequest" responses: - "201": + "200": description: The sandbox was created successfully content: application/json: diff --git a/python/e2b_code_interpreter/client/api/default_api.py b/python/e2b_code_interpreter/client/api/default_api.py index 3e92cf14..d4ab6bd5 100644 --- a/python/e2b_code_interpreter/client/api/default_api.py +++ b/python/e2b_code_interpreter/client/api/default_api.py @@ -96,7 +96,7 @@ def execute_post( ) _response_types_map: Dict[str, Optional[str]] = { - "201": "Execution", + "200": "Execution", "400": "Error", "500": "Error", } @@ -162,7 +162,7 @@ def execute_post_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - "201": "Execution", + "200": "Execution", "400": "Error", "500": "Error", } @@ -228,7 +228,7 @@ def execute_post_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - "201": "Execution", + "200": "Execution", "400": "Error", "500": "Error", } diff --git a/template/server/main.py b/template/server/main.py index ba950b49..3f75fbaf 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,7 +1,6 @@ import uuid from fastapi import FastAPI -from starlette.responses import JSONResponse from messaging import JupyterKernelWebSocket from api.models.execution import Execution @@ -26,7 +25,6 @@ def health(): return "Request was successful" -@app.post("/execute", response_model=Execution) -def execute(request: ExecutionRequest) -> JSONResponse: - result = ws.execute(code=request.code) - return JSONResponse(content=result) +@app.post("/execute") +def execute(request: ExecutionRequest) -> Execution: + return ws.execute(code=request.code) From a632abe2e6d6c820bf28d84f2c2ed05ef907b4c2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 21:57:11 +0200 Subject: [PATCH 074/722] Fix models --- openapi.yml | 4 ++++ python/e2b_code_interpreter/main.py | 17 ++++++++++---- python/e2b_code_interpreter/models.py | 34 +++++++++++---------------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/openapi.yml b/openapi.yml index ce68e49e..e4ff7c67 100644 --- a/openapi.yml +++ b/openapi.yml @@ -81,6 +81,10 @@ components: extra: type: object description: Extra representations of the result + is_main_result: + type: boolean + description: Whether this is the main result of the cell + Logs: properties: diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 93feb2fd..d404f165 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -12,7 +12,7 @@ Configuration, ) from e2b_code_interpreter.constants import TIMEOUT -from e2b_code_interpreter.models import Execution +from e2b_code_interpreter.models import Execution, Result, Logs, Error logger = logging.getLogger(__name__) @@ -68,10 +68,19 @@ def exec_code( configuration = Configuration(host=f"https://{self.get_host(8000)}") with ApiClient(configuration=configuration) as client: api_client = DefaultApi(api_client=client) - result = api_client.execute_post( + execution = api_client.execute_post( ExecutionRequest(code=code, language=language), _request_timeout=timeout ) - logger.debug(f"Received result: {result} (Sandbox: {self.sandbox_id})") + logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") - return result + return Execution( + results=[ + Result(**result.model_dump(exclude={"additional_properties"})) + for result in execution.results + ] if execution.results else None, + logs=Logs(stdout=execution.logs.stdout, stderr=execution.logs.stderr) if execution.logs else Logs(), + error=Error( + **execution.error.model_dump(exclude={"additional_properties"}) + ) if execution.error else None, + ) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 58706f79..27b68242 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -60,29 +60,22 @@ class Result: is_main_result: bool "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." - raw: Dict[MIMEType, str] - "Dictionary that maps MIME types to their corresponding string representations of the data." - - def __init__(self, is_main_result: bool, data: [MIMEType, str]): - self.is_main_result = is_main_result - self.raw = copy.deepcopy(data) - - self.text = data.pop("text/plain", None) - self.html = data.pop("text/html", None) - self.markdown = data.pop("text/markdown", None) - self.svg = data.pop("image/svg+xml", None) - self.png = data.pop("image/png", None) - self.jpeg = data.pop("image/jpeg", None) - self.pdf = data.pop("application/pdf", None) - self.latex = data.pop("text/latex", None) - self.json = data.pop("application/json", None) - self.javascript = data.pop("application/javascript", None) - self.extra = data + def __init__(self, **kwargs): + self.text = kwargs.pop("text", None) + self.html = kwargs.pop("html", None) + self.markdown = kwargs.pop("markdown", None) + self.svg = kwargs.pop("svg", None) + self.png = kwargs.pop("png", None) + self.jpeg = kwargs.pop("jpeg", None) + self.pdf = kwargs.pop("pdf", None) + self.latex = kwargs.pop("latex", None) + self.json = kwargs.pop("json", None) + self.javascript = kwargs.pop("javascript", None) + self.is_main_result = kwargs.pop("is_main_result", False) + self.extra = kwargs # Allows to iterate over formats() def __getitem__(self, item): - if item in self.raw: - return self.raw[item] return getattr(self, item) def formats(self) -> Iterable[str]: @@ -230,6 +223,7 @@ class Execution(BaseModel): """ class Config: + from_attributes = True arbitrary_types_allowed = True json_encoders = { List[Result]: serialize_results, From 0640e38d8d9ed227433a7b22ad0da5093bab9680 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 4 Jul 2024 22:00:03 +0200 Subject: [PATCH 075/722] Regenerate models --- python/e2b_code_interpreter/client/models/result.py | 7 ++++++- template/server/api/models/result.py | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/client/models/result.py b/python/e2b_code_interpreter/client/models/result.py index 7d21bb86..c16651bf 100644 --- a/python/e2b_code_interpreter/client/models/result.py +++ b/python/e2b_code_interpreter/client/models/result.py @@ -19,7 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Union -from pydantic import BaseModel, StrictStr +from pydantic import BaseModel, StrictBool, StrictStr from pydantic import Field try: @@ -66,6 +66,9 @@ class Result(BaseModel): extra: Optional[Union[str, Any]] = Field( default=None, description="Extra representations of the result" ) + is_main_result: Optional[StrictBool] = Field( + default=None, description="Whether this is the main result of the cell" + ) additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = [ "text", @@ -79,6 +82,7 @@ class Result(BaseModel): "json", "javascript", "extra", + "is_main_result", ] model_config = {"populate_by_name": True, "validate_assignment": True} @@ -144,6 +148,7 @@ def from_dict(cls, obj: Dict) -> Self: "json": obj.get("json"), "javascript": obj.get("javascript"), "extra": obj.get("extra"), + "is_main_result": obj.get("is_main_result"), } ) # store additional fields in additional_properties diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 7d21bb86..c16651bf 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -19,7 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Union -from pydantic import BaseModel, StrictStr +from pydantic import BaseModel, StrictBool, StrictStr from pydantic import Field try: @@ -66,6 +66,9 @@ class Result(BaseModel): extra: Optional[Union[str, Any]] = Field( default=None, description="Extra representations of the result" ) + is_main_result: Optional[StrictBool] = Field( + default=None, description="Whether this is the main result of the cell" + ) additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = [ "text", @@ -79,6 +82,7 @@ class Result(BaseModel): "json", "javascript", "extra", + "is_main_result", ] model_config = {"populate_by_name": True, "validate_assignment": True} @@ -144,6 +148,7 @@ def from_dict(cls, obj: Dict) -> Self: "json": obj.get("json"), "javascript": obj.get("javascript"), "extra": obj.get("extra"), + "is_main_result": obj.get("is_main_result"), } ) # store additional fields in additional_properties From 892b6404339bedc543ced0bc3afc7287a58a3ad4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 10:29:33 +0200 Subject: [PATCH 076/722] Fix serialization --- python/e2b_code_interpreter/main.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d404f165..b4a7c78d 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -75,12 +75,22 @@ def exec_code( logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") return Execution( - results=[ - Result(**result.model_dump(exclude={"additional_properties"})) - for result in execution.results - ] if execution.results else None, - logs=Logs(stdout=execution.logs.stdout, stderr=execution.logs.stderr) if execution.logs else Logs(), - error=Error( - **execution.error.model_dump(exclude={"additional_properties"}) - ) if execution.error else None, + results=( + [ + Result(**result.model_dump(exclude={"additional_properties"})) + for result in execution.results + ] + if execution.results + else None + ), + logs=( + Logs(stdout=execution.logs.stdout, stderr=execution.logs.stderr) + if execution.logs + else Logs() + ), + error=( + Error(**execution.error.model_dump(exclude={"additional_properties"})) + if execution.error + else None + ), ) From 137c7d73c5f6ec53524fa2204dbcfdff30dbaa71 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 13:46:30 +0200 Subject: [PATCH 077/722] Refactor from threading to async --- python/e2b_code_interpreter/main.py | 1 + python/e2b_code_interpreter/models.py | 56 ++++++-- template/e2b.Dockerfile | 5 + template/server/future.py | 46 ------- template/server/main.py | 35 +++-- template/server/messaging.py | 191 +++++++++++++++----------- template/server/requirements.txt | 1 - template/server/websocket_client.py | 161 ---------------------- template/start-up.sh | 2 +- 9 files changed, 189 insertions(+), 309 deletions(-) delete mode 100644 template/server/future.py delete mode 100644 template/server/websocket_client.py diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index b4a7c78d..d55f10a6 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -66,6 +66,7 @@ def exec_code( ) configuration = Configuration(host=f"https://{self.get_host(8000)}") + # configuration = Configuration(host=f"http://localhost:8000") with ApiClient(configuration=configuration) as client: api_client = DefaultApi(api_client=client) execution = api_client.execute_post( diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 27b68242..f137218a 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,9 +1,8 @@ -import copy +import json from typing import List, Optional, Iterable, Dict -from pydantic import BaseModel -class Error(BaseModel): +class Error: """ Represents an error that occurred during the execution of a cell. The error contains the name of the error, the value of the error, and the traceback. @@ -16,6 +15,11 @@ class Error(BaseModel): traceback_raw: List[str] "List of strings representing the traceback." + def __init__(self, name: str, value: str, traceback: List[str]): + self.name = name + self.value = value + self.traceback_raw = traceback + @property def traceback(self) -> str: """ @@ -25,6 +29,13 @@ def traceback(self) -> str: """ return "\n".join(self.traceback_raw) + def to_json(self) -> str: + """ + Returns the JSON representation of the Error object. + """ + data = {"name": self.name, "value": self.value, "traceback": self.traceback} + return json.dumps(data) + class MIMEType(str): """ @@ -72,7 +83,7 @@ def __init__(self, **kwargs): self.json = kwargs.pop("json", None) self.javascript = kwargs.pop("javascript", None) self.is_main_result = kwargs.pop("is_main_result", False) - self.extra = kwargs + self.extra = kwargs.pop("extra", None) or {} # Allows to iterate over formats() def __getitem__(self, item): @@ -193,7 +204,7 @@ def _repr_javascript_(self) -> Optional[str]: return self.javascript -class Logs(BaseModel): +class Logs: """ Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. """ @@ -203,6 +214,19 @@ class Logs(BaseModel): stderr: List[str] = [] "List of strings printed to stderr by prints, subprocesses, etc." + def __init__( + self, stdout: Optional[List[str]] = None, stderr: Optional[List[str]] = None + ): + self.stdout = stdout or [] + self.stderr = stderr or [] + + def to_json(self) -> str: + """ + Returns the JSON representation of the Logs object. + """ + data = {"stdout": self.stdout, "stderr": self.stderr} + return json.dumps(data) + def serialize_results(results: List[Result]) -> List[Dict[str, str]]: """ @@ -217,18 +241,11 @@ def serialize_results(results: List[Result]) -> List[Dict[str, str]]: return serialized -class Execution(BaseModel): +class Execution: """ Represents the result of a cell execution. """ - class Config: - from_attributes = True - arbitrary_types_allowed = True - json_encoders = { - List[Result]: serialize_results, - } - results: List[Result] = [] "List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots)." logs: Logs = Logs() @@ -238,6 +255,12 @@ class Config: execution_count: Optional[int] = None "Execution count of the cell." + def __init__(self, **kwargs): + self.results = kwargs.pop("results", []) + self.logs = kwargs.pop("logs", Logs()) + self.error = kwargs.pop("error", None) + self.execution_count = kwargs.pop("execution_count", None) + @property def text(self) -> Optional[str]: """ @@ -253,7 +276,12 @@ def to_json(self) -> str: """ Returns the JSON representation of the Execution object. """ - return self.model_dump_json(exclude_none=True) + data = { + "results": serialize_results(self.results), + "logs": self.logs.to_json(), + "error": self.error.to_json() if self.error else None, + } + return json.dumps(data) class KernelException(Exception): diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index d6cc253f..4d744a10 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -27,3 +27,8 @@ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ COPY ./server $SERVER_PATH + +RUN apt-get install sudo +EXPOSE 8000 + +ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/server/future.py b/template/server/future.py deleted file mode 100644 index 25af546f..00000000 --- a/template/server/future.py +++ /dev/null @@ -1,46 +0,0 @@ -import asyncio - -from asyncio import AbstractEventLoop -from concurrent.futures import Future, CancelledError -from typing import Any, Awaitable, Callable, Generic, List, Optional, TypeVar - -T = TypeVar("T") - - -# Check if using event is not better for most use cases -class DeferredFuture(Generic[T]): - def __init__(self, cleanup_list: Optional[List[Callable[[], Any]]] = None): - self._future = Future() - if cleanup_list is not None: - cleanup_list.append(self.cancel) - - def __call__(self, result: T): - if not self._future.done(): - self._future.set_result(result) - - def result(self, timeout: Optional[float] = None) -> T: - try: - return self._future.result(timeout=timeout) - # The thread was interrupted while waiting, it's okay to release the thread - except CancelledError: - pass - - def done(self) -> bool: - return self._future.done() - - def cancel(self): - if not self._future.done(): - self._future.cancel() - - def reject(self, reason: Exception): - if not self._future.done(): - self._future.set_exception(reason) - - -def run_async_func_in_loop(loop: AbstractEventLoop, coro: Awaitable): - asyncio.set_event_loop(loop) - - try: - return loop.run_until_complete(coro) - finally: - loop.close() diff --git a/template/server/main.py b/template/server/main.py index 3f75fbaf..05acd6c4 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,4 +1,7 @@ +import asyncio import uuid +from contextlib import asynccontextmanager +from typing import Dict from fastapi import FastAPI @@ -6,18 +9,33 @@ from api.models.execution import Execution from api.models.execution_request import ExecutionRequest -app = FastAPI() - session_id = str(uuid.uuid4()) +websockets: Dict[str, JupyterKernelWebSocket] = {} + with open("/root/.jupyter/kernel_id") as file: kernel_id = file.read().strip() -ws = JupyterKernelWebSocket( - f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id -) -ws.connect() + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Load the ML model + default_ws = JupyterKernelWebSocket(f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id) + + websockets['default'] = default_ws + websockets['python'] = default_ws + + task = asyncio.create_task(default_ws.connect()) + await default_ws.started + + yield + + await default_ws.close() + task.cancel() + + +app = FastAPI(lifespan=lifespan) @app.get("/health") @@ -26,5 +44,6 @@ def health(): @app.post("/execute") -def execute(request: ExecutionRequest) -> Execution: - return ws.execute(code=request.code) +async def execute(request: ExecutionRequest) -> Execution: + ws = websockets['default'] + return await ws.execute(code=request.code) diff --git a/template/server/messaging.py b/template/server/messaging.py index 136c7d5c..dceebe92 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -1,19 +1,19 @@ import json import logging import threading -import time import uuid +import asyncio +import random +from asyncio import Future + +from typing import Callable, Dict, Any, Optional, AsyncIterator, List -from concurrent.futures import Future -from queue import Queue -from typing import Callable, Dict, Any, Optional -from pydantic import BaseModel from api.models.error import Error from api.models.execution import Execution from api.models.result import Result -from future import DeferredFuture -from websocket_client import WebSocket +from websockets.legacy.client import WebSocketClientProtocol, Connect +from websockets.exceptions import ConnectionClosed TIMEOUT = 60 @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) -class CellMessage(BaseModel): +class CellMessage: """ A message from a process. """ @@ -45,14 +45,14 @@ class CellExecution: input_accepted: bool = False - on_stdout: Optional[Callable[[CellMessage], Any]] = None - on_stderr: Optional[Callable[[CellMessage], Any]] = None + on_stdout: Optional[Callable[[str], Any]] = None + on_stderr: Optional[Callable[[str], Any]] = None on_result: Optional[Callable[[Result], Any]] = None def __init__( self, - on_stdout: Optional[Callable[[CellMessage], Any]] = None, - on_stderr: Optional[Callable[[CellMessage], Any]] = None, + on_stdout: Optional[Callable[[str], Any]] = None, + on_stderr: Optional[Callable[[str], Any]] = None, on_result: Optional[Callable[[Result], Any]] = None, ): self.partial_result = Execution(results=[]) @@ -63,63 +63,55 @@ def __init__( class JupyterKernelWebSocket: + _ws: WebSocketClientProtocol = None + def __init__(self, url: str, session_id: str): self.url = url self.session_id = session_id self._cells: Dict[str, CellExecution] = {} - self._waiting_for_replies: Dict[str, DeferredFuture] = {} - self._queue_in = Queue() - self._queue_out = Queue() - self._stopped = threading.Event() - - def process_messages(self): - while not self._stopped.is_set(): - if self._queue_out.empty(): - time.sleep(0.01) - continue + self._process_cleanup: List[Callable[[], Any]] = [] + self._waiting_for_replies: Dict[str, Future] = {} + self._stopped = Future() + self.started = Future() + + async def connect(self, timeout: float = TIMEOUT): + logger.debug(f"WebSocket connecting to {self.url}") + + ws_logger = logger.getChild("websockets.client") + ws_logger.setLevel(logging.ERROR) + + websocket_connector = E2BConnect( + self.url, + max_size=None, + max_queue=None, + logger=ws_logger, + ) - data = self._queue_out.get() - logger.debug(f"WebSocket received message: {data}".strip()) - self._receive_message(json.loads(data)) - self._queue_out.task_done() + websocket_connector.BACKOFF_MIN = 1 + websocket_connector.BACKOFF_FACTOR = 1 + websocket_connector.BACKOFF_INITIAL = 0.2 # type: ignore - def connect(self, timeout: float = TIMEOUT): - started = threading.Event() + async for websocket in websocket_connector: + try: + self._ws = websocket + self.started.set_result(None) - threading.Thread( - target=self.process_messages, daemon=True, name="e2b-process-messages" - ).start() + logger.info(f"WebSocket connected to {self.url}") - threading.Thread( - target=WebSocket( - url=self.url, - queue_in=self._queue_in, - queue_out=self._queue_out, - started=started, - stopped=self._stopped, - ).run, - daemon=True, - name="e2b-code-interpreter-websocket", - ).start() + receive_task = asyncio.create_task( + self._receive_message(), name="receive_message" + ) + self._process_cleanup.append(receive_task.cancel) - logger.debug("WebSocket waiting to start") + while not self._stopped.done(): + await asyncio.sleep(0) - try: - start_time = time.time() - while ( - not started.is_set() - and time.time() - start_time < timeout - and not self._stopped.is_set() - ): - time.sleep(0.1) - - if not started.is_set(): - raise Exception("WebSocket failed to start") - except BaseException as e: - self.close() - raise Exception(f"WebSocket failed to start: {e}") from e - - logger.debug("WebSocket started") + logger.info("WebSocket stopped") + break + except ConnectionClosed: + logger.warning("WebSocket disconnected, it will try to reconnect") + if self._stopped.done(): + break def _get_execute_request(self, msg_id: str, code: str) -> str: return json.dumps( @@ -143,21 +135,33 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: } ) - def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: + async def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: message_id = str(uuid.uuid4()) logger.debug(f"Sending execution message: {message_id}") self._cells[message_id] = CellExecution() request = self._get_execute_request(message_id, code) - self._queue_in.put(request) - logger.debug(f"Waiting for result for message: {message_id}") - result = self._cells[message_id].execution.result(timeout=timeout) + await self._ws.send(request) + + result = await asyncio.wait_for(self._cells[message_id].execution, timeout=timeout) logger.debug(f"Got result for message: {message_id}") + del self._cells[message_id] return result - def _receive_message(self, data: dict): + async def _receive_message(self): + try: + if not self._ws: + logger.error("No WebSocket connection") + return + async for message in self._ws: + logger.debug(f"WebSocket received message: {message}".strip()) + self._process_message(json.loads(message)) + except Exception as e: + logger.error(f"WebSocket received error while receiving messages: {e}") + + def _process_message(self, data: dict): """ Process messages from the WebSocket @@ -166,6 +170,7 @@ def _receive_message(self, data: dict): :param data: The message data """ + parent_msg_ig = data["parent_header"].get("msg_id", None) if parent_msg_ig is None: logger.warning("Parent message ID not found. %s", data) @@ -191,23 +196,12 @@ def _receive_message(self, data: dict): if data["content"]["name"] == "stdout": execution.logs.stdout.append(data["content"]["text"]) if cell.on_stdout: - cell.on_stdout( - CellMessage( - line=data["content"]["text"], - timestamp=time.time_ns(), - ) - ) + cell.on_stdout(data["content"]["text"]) elif data["content"]["name"] == "stderr": execution.logs.stderr.append(data["content"]["text"]) if cell.on_stderr: - cell.on_stderr( - CellMessage( - line=data["content"]["text"], - error=True, - timestamp=time.time_ns(), - ) - ) + cell.on_stderr( data["content"]["text"]) elif data["msg_type"] in "display_data": result = Result(is_main_result=False, data=data["content"]["data"]) @@ -254,9 +248,50 @@ def _receive_message(self, data: dict): def close(self): logger.debug("Closing WebSocket") - self._stopped.set() + self._stopped.set_result(None) + self._ws.close() for handler in self._waiting_for_replies.values(): logger.debug(f"Cancelling waiting for execution result for {handler}") handler.cancel() del handler + + +class E2BConnect(Connect): + async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]: + retries = 0 + max_retries = 12 + backoff_delay = 0.1 + while True: + try: + async with self as protocol: + yield protocol + except Exception: + retries += 1 + if retries >= max_retries: + raise Exception("Failed to connect to the server") + # Add a random initial delay between 0 and 5 seconds. + # See 7.2.3. Recovering from Abnormal Closure in RFC 6544. + if backoff_delay == 0.1: + initial_delay = random.random() + self.logger.info( + "! connect failed; reconnecting in %.1f seconds", + initial_delay, + exc_info=True, + ) + await asyncio.sleep(initial_delay) + else: + self.logger.info( + "! connect failed again; retrying in %d seconds", + int(backoff_delay), + exc_info=True, + ) + await asyncio.sleep(int(backoff_delay)) + # Increase delay with truncated exponential backoff. + if retries > 4: + backoff_delay = backoff_delay * 1.2 + backoff_delay = min(backoff_delay, 10) + continue + else: + # Connection succeeded - reset backoff delay + backoff_delay = 0.1 diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 4b14b153..61ad0d5f 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -1,2 +1 @@ -pydantic==2.8.0 fastapi==0.111.0 diff --git a/template/server/websocket_client.py b/template/server/websocket_client.py deleted file mode 100644 index ca71b101..00000000 --- a/template/server/websocket_client.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -import asyncio -import logging -import random - -from queue import Queue -from threading import Event -from typing import Any, Callable, List, Optional, AsyncIterator - -from websockets.legacy.client import WebSocketClientProtocol, Connect -from websockets.exceptions import ConnectionClosed -from websockets.typing import Data - -logger = logging.getLogger(__name__) - - -class WebSocket: - def __init__( - self, - url: str, - started: Event, - stopped: Event, - queue_in: Queue[dict], - queue_out: Queue[Data], - ): - self._ws: Optional[WebSocketClientProtocol] = None - self.url = url - self.started = started - self.stopped = stopped - self._process_cleanup: List[Callable[[], Any]] = [] - self._queue_in = queue_in - self._queue_out = queue_out - - def run(self): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - loop.run_until_complete(self.async_run()) - - async def async_run(self): - await self._connect() - await self.close() - - async def _send_message(self): - logger.debug("WebSocket starting to send messages") - while True: - if self._queue_in.empty(): - await asyncio.sleep(0) - continue - message = self._queue_in.get() - logger.debug(f"WebSocket message to send: {message}") - if self._ws: - await self._ws.send(message) - logger.debug(f"WebSocket message sent: {message}") - self._queue_in.task_done() - else: - logger.error("No WebSocket connection") - - async def _receive_message(self): - try: - if not self._ws: - logger.error("No WebSocket connection") - return - async for message in self._ws: - logger.debug(f"WebSocket received message: {message}".strip()) - self._queue_out.put(message) - except Exception as e: - logger.error(f"WebSocket received error while receiving messages: {e}") - - async def _connect(self): - logger.debug(f"WebSocket connecting to {self.url}") - - ws_logger = logger.getChild("websockets.client") - ws_logger.setLevel(logging.ERROR) - - websocket_connector = E2BConnect( - self.url, - max_size=None, - max_queue=None, - logger=ws_logger, - ) - - websocket_connector.BACKOFF_MIN = 1 - websocket_connector.BACKOFF_FACTOR = 1 - websocket_connector.BACKOFF_INITIAL = 0.2 # type: ignore - - async for websocket in websocket_connector: - try: - self._ws = websocket - self.started.set() - logger.info(f"WebSocket connected to {self.url}") - - send_task = asyncio.create_task( - self._send_message(), name="send_message" - ) - self._process_cleanup.append(send_task.cancel) - - receive_task = asyncio.create_task( - self._receive_message(), name="receive_message" - ) - self._process_cleanup.append(receive_task.cancel) - - while not self.stopped.is_set(): - await asyncio.sleep(0) - - logger.info("WebSocket stopped") - break - except ConnectionClosed: - logger.warning("WebSocket disconnected, it will try to reconnect") - if self.stopped.is_set(): - break - - async def close(self): - for cancel in self._process_cleanup: - cancel() - - self._process_cleanup.clear() - - if self._ws: - await self._ws.close() - - -class E2BConnect(Connect): - async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]: - retries = 0 - max_retries = 12 - backoff_delay = 0.1 - while True: - try: - async with self as protocol: - yield protocol - except Exception: - retries += 1 - if retries >= max_retries: - raise Exception("Failed to connect to the server") - # Add a random initial delay between 0 and 5 seconds. - # See 7.2.3. Recovering from Abnormal Closure in RFC 6544. - if backoff_delay == 0.1: - initial_delay = random.random() - self.logger.info( - "! connect failed; reconnecting in %.1f seconds", - initial_delay, - exc_info=True, - ) - await asyncio.sleep(initial_delay) - else: - self.logger.info( - "! connect failed again; retrying in %d seconds", - int(backoff_delay), - exc_info=True, - ) - await asyncio.sleep(int(backoff_delay)) - # Increase delay with truncated exponential backoff. - if retries > 4: - backoff_delay = backoff_delay * 1.2 - backoff_delay = min(backoff_delay, 10) - continue - else: - # Connection succeeded - reset backoff delay - backoff_delay = 0.1 diff --git a/template/start-up.sh b/template/start-up.sh index 24ceabd4..6f964073 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -28,7 +28,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null echo "Jupyter Server started" - fastapi run /root/.server/main.py + fastapi run /root/.server/main.py --port 8000 } echo "Starting Jupyter Server..." From fa3076e8c4a297631a674606f281698e8e0264da Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 15:17:40 +0200 Subject: [PATCH 078/722] Don't trim the result --- template/ipython_kernel_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/template/ipython_kernel_config.py b/template/ipython_kernel_config.py index 58c8ec2d..26900faa 100644 --- a/template/ipython_kernel_config.py +++ b/template/ipython_kernel_config.py @@ -962,3 +962,8 @@ ## Username for the Session. Default is your system username. # Default: 'user' # c.Session.username = 'user' + +# Truncate large collections (lists, dicts, tuples, sets) to this size. +# Set to 0 to disable truncation. +# Default: 1000 +c.PlainTextFormatter.max_seq_length = 0 From 60cd792e892d1cca30d6681f86030439b6801328 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 16:18:19 +0200 Subject: [PATCH 079/722] Refactor --- Makefile | 37 +- .../e2b_code_interpreter/client/__init__.py | 42 +- .../client/api/__init__.py | 5 +- .../client/api/default/__init__.py | 0 .../client/api/default/get_health.py | 83 +++ .../client/api/default/post_execute.py | 166 +++++ .../client/api/default_api.py | 512 ------------- .../e2b_code_interpreter/client/api_client.py | 697 ------------------ .../client/api_response.py | 22 - python/e2b_code_interpreter/client/client.py | 286 +++++++ .../client/configuration.py | 443 ----------- python/e2b_code_interpreter/client/errors.py | 16 + .../e2b_code_interpreter/client/exceptions.py | 167 ----- .../client/models/__init__.py | 36 +- .../client/models/error.py | 178 ++--- .../client/models/execution.py | 223 +++--- .../client/models/execution_request.py | 132 ++-- .../client/models/logs.py | 127 ++-- .../client/models/result.py | 302 ++++---- .../client/models/result_extra.py | 43 ++ .../client/models/result_json.py | 43 ++ python/e2b_code_interpreter/client/rest.py | 214 ------ python/e2b_code_interpreter/client/types.py | 45 ++ python/e2b_code_interpreter/main.py | 45 +- python/e2b_code_interpreter/models.py | 58 +- python/pyproject.toml | 4 +- template/server/api/models/execution.py | 6 +- template/server/api/models/result.py | 189 ++--- template/server/main.py | 12 +- template/server/messaging.py | 6 +- 30 files changed, 1279 insertions(+), 2860 deletions(-) create mode 100644 python/e2b_code_interpreter/client/api/default/__init__.py create mode 100644 python/e2b_code_interpreter/client/api/default/get_health.py create mode 100644 python/e2b_code_interpreter/client/api/default/post_execute.py delete mode 100644 python/e2b_code_interpreter/client/api/default_api.py delete mode 100644 python/e2b_code_interpreter/client/api_client.py delete mode 100644 python/e2b_code_interpreter/client/api_response.py create mode 100644 python/e2b_code_interpreter/client/client.py delete mode 100644 python/e2b_code_interpreter/client/configuration.py create mode 100644 python/e2b_code_interpreter/client/errors.py delete mode 100644 python/e2b_code_interpreter/client/exceptions.py create mode 100644 python/e2b_code_interpreter/client/models/result_extra.py create mode 100644 python/e2b_code_interpreter/client/models/result_json.py delete mode 100644 python/e2b_code_interpreter/client/rest.py create mode 100644 python/e2b_code_interpreter/client/types.py diff --git a/Makefile b/Makefile index a6ff8927..ee999617 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,11 @@ .PHONY: generate generate: # Generate Python client + pipx install openapi-python-client rm -rf ./python/e2b_code_interpreter/client - npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 - npx -yes @openapitools/openapi-generator-cli generate \ - -i openapi.yml \ - -g python \ - -o ./python/e2b_code_interpreter/client \ - --global-property apis,models,supportingFiles,modelDocs=false \ - --additional-properties=generateSourceCodeOnly=true \ - --additional-properties=disallowAdditionalPropertiesIfNotPresent=false \ - --additional-properties=usePydanticV2=true \ - --additional-properties=packageName=e2b_code_interpreter.client - mv ./python/e2b_code_interpreter/client/e2b_code_interpreter/client/* ./python/e2b_code_interpreter/client - rm -r ./python/e2b_code_interpreter/client/docs - rm -r .//python/e2b_code_interpreter/client/test - rm -r ./python/e2b_code_interpreter/client/.openapi-generator - rm -r ./python/e2b_code_interpreter/client/e2b_code_interpreter - rm -r ./python/e2b_code_interpreter/client/.openapi-generator-ignore + openapi-python-client generate --path openapi.yml --output-path ./python/e2b_code_interpreter/client + mv ./python/e2b_code_interpreter/client/e2b_code_interpreter_client/* ./python/e2b_code_interpreter/client - - # Generate models in server - rm -rf ./template/server/api/* - npx -yes @openapitools/openapi-generator-cli@latest version-manager set 7.1.0 - npx -yes @openapitools/openapi-generator-cli generate \ - -i openapi.yml \ - -g python \ - -o ./template/server/tmp \ - --global-property apis=false,models,supportingFiles=false,modelDocs=false \ - --additional-properties=disallowAdditionalPropertiesIfNotPresent=false \ - --additional-properties=usePydanticV2=true \ - --additional-properties=packageName=api - mv ./template/server/tmp/api/* ./template/server/api - rm -r ./template/server/tmp - - # Format the code + rm ./python/e2b_code_interpreter/client/.gitignore ./python/e2b_code_interpreter/client/pyproject.toml ./python/e2b_code_interpreter/client/README.md ./python/e2b_code_interpreter/client/py.typed + rm -rf ./python/e2b_code_interpreter/client/e2b_code_interpreter_client black . diff --git a/python/e2b_code_interpreter/client/__init__.py b/python/e2b_code_interpreter/client/__init__.py index 04875f3c..6a910c79 100644 --- a/python/e2b_code_interpreter/client/__init__.py +++ b/python/e2b_code_interpreter/client/__init__.py @@ -1,38 +1,8 @@ -# coding: utf-8 +"""A client library for accessing E2B Code Interpreter""" -# flake8: noqa +from .client import AuthenticatedClient, Client -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -__version__ = "1.0.0" - -# import apis into sdk package -from e2b_code_interpreter.client.api.default_api import DefaultApi - -# import ApiClient -from e2b_code_interpreter.client.api_response import ApiResponse -from e2b_code_interpreter.client.api_client import ApiClient -from e2b_code_interpreter.client.configuration import Configuration -from e2b_code_interpreter.client.exceptions import OpenApiException -from e2b_code_interpreter.client.exceptions import ApiTypeError -from e2b_code_interpreter.client.exceptions import ApiValueError -from e2b_code_interpreter.client.exceptions import ApiKeyError -from e2b_code_interpreter.client.exceptions import ApiAttributeError -from e2b_code_interpreter.client.exceptions import ApiException - -# import models into sdk package -from e2b_code_interpreter.client.models.error import Error -from e2b_code_interpreter.client.models.execution import Execution -from e2b_code_interpreter.client.models.execution_request import ExecutionRequest -from e2b_code_interpreter.client.models.logs import Logs -from e2b_code_interpreter.client.models.result import Result +__all__ = ( + "AuthenticatedClient", + "Client", +) diff --git a/python/e2b_code_interpreter/client/api/__init__.py b/python/e2b_code_interpreter/client/api/__init__.py index 855104a1..81f9fa24 100644 --- a/python/e2b_code_interpreter/client/api/__init__.py +++ b/python/e2b_code_interpreter/client/api/__init__.py @@ -1,4 +1 @@ -# flake8: noqa - -# import apis into api package -from e2b_code_interpreter.client.api.default_api import DefaultApi +"""Contains methods for accessing the API""" diff --git a/python/e2b_code_interpreter/client/api/default/__init__.py b/python/e2b_code_interpreter/client/api/default/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/e2b_code_interpreter/client/api/default/get_health.py b/python/e2b_code_interpreter/client/api/default/get_health.py new file mode 100644 index 00000000..e474e5fe --- /dev/null +++ b/python/e2b_code_interpreter/client/api/default/get_health.py @@ -0,0 +1,83 @@ +from http import HTTPStatus +from typing import Any, Dict, Optional, Union + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...types import Response + + +def _get_kwargs() -> Dict[str, Any]: + _kwargs: Dict[str, Any] = { + "method": "get", + "url": "/health", + } + + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[Any]: + if response.status_code == HTTPStatus.OK: + return None + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[Any]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: Union[AuthenticatedClient, Client], +) -> Response[Any]: + """Health check + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any] + """ + + kwargs = _get_kwargs() + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +async def asyncio_detailed( + *, + client: Union[AuthenticatedClient, Client], +) -> Response[Any]: + """Health check + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any] + """ + + kwargs = _get_kwargs() + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) diff --git a/python/e2b_code_interpreter/client/api/default/post_execute.py b/python/e2b_code_interpreter/client/api/default/post_execute.py new file mode 100644 index 00000000..d692177b --- /dev/null +++ b/python/e2b_code_interpreter/client/api/default/post_execute.py @@ -0,0 +1,166 @@ +from http import HTTPStatus +from typing import Any, Dict, Optional, Union, cast + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.execution import Execution +from ...models.execution_request import ExecutionRequest +from ...types import Response + + +def _get_kwargs( + *, + body: ExecutionRequest, +) -> Dict[str, Any]: + headers: Dict[str, Any] = {} + + _kwargs: Dict[str, Any] = { + "method": "post", + "url": "/execute", + } + + _body = body.to_dict() + + _kwargs["json"] = _body + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Optional[Union[Any, Execution]]: + if response.status_code == HTTPStatus.OK: + response_200 = Execution.from_dict(response.json()) + + return response_200 + if response.status_code == HTTPStatus.BAD_REQUEST: + response_400 = cast(Any, None) + return response_400 + if response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR: + response_500 = cast(Any, None) + return response_500 + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: Union[AuthenticatedClient, Client], response: httpx.Response +) -> Response[Union[Any, Execution]]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: Union[AuthenticatedClient, Client], + body: ExecutionRequest, +) -> Response[Union[Any, Execution]]: + """Create a sandbox from the template + + Args: + body (ExecutionRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Union[Any, Execution]] + """ + + kwargs = _get_kwargs( + body=body, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + *, + client: Union[AuthenticatedClient, Client], + body: ExecutionRequest, +) -> Optional[Union[Any, Execution]]: + """Create a sandbox from the template + + Args: + body (ExecutionRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Union[Any, Execution] + """ + + return sync_detailed( + client=client, + body=body, + ).parsed + + +async def asyncio_detailed( + *, + client: Union[AuthenticatedClient, Client], + body: ExecutionRequest, +) -> Response[Union[Any, Execution]]: + """Create a sandbox from the template + + Args: + body (ExecutionRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Union[Any, Execution]] + """ + + kwargs = _get_kwargs( + body=body, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: Union[AuthenticatedClient, Client], + body: ExecutionRequest, +) -> Optional[Union[Any, Execution]]: + """Create a sandbox from the template + + Args: + body (ExecutionRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Union[Any, Execution] + """ + + return ( + await asyncio_detailed( + client=client, + body=body, + ) + ).parsed diff --git a/python/e2b_code_interpreter/client/api/default_api.py b/python/e2b_code_interpreter/client/api/default_api.py deleted file mode 100644 index d4ab6bd5..00000000 --- a/python/e2b_code_interpreter/client/api/default_api.py +++ /dev/null @@ -1,512 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import io -import warnings - -from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt -from typing import Dict, List, Optional, Tuple, Union, Any - -try: - from typing import Annotated -except ImportError: - from typing_extensions import Annotated - -from e2b_code_interpreter.client.models.execution import Execution -from e2b_code_interpreter.client.models.execution_request import ExecutionRequest - -from e2b_code_interpreter.client.api_client import ApiClient -from e2b_code_interpreter.client.api_response import ApiResponse -from e2b_code_interpreter.client.rest import RESTResponseType - - -class DefaultApi: - """NOTE: This class is auto generated by OpenAPI Generator - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None) -> None: - if api_client is None: - api_client = ApiClient.get_default() - self.api_client = api_client - - @validate_call - def execute_post( - self, - execution_request: ExecutionRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> Execution: - """execute_post - - Create a sandbox from the template - - :param execution_request: (required) - :type execution_request: ExecutionRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._execute_post_serialize( - execution_request=execution_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = { - "200": "Execution", - "400": "Error", - "500": "Error", - } - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - @validate_call - def execute_post_with_http_info( - self, - execution_request: ExecutionRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[Execution]: - """execute_post - - Create a sandbox from the template - - :param execution_request: (required) - :type execution_request: ExecutionRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._execute_post_serialize( - execution_request=execution_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = { - "200": "Execution", - "400": "Error", - "500": "Error", - } - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - @validate_call - def execute_post_without_preload_content( - self, - execution_request: ExecutionRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """execute_post - - Create a sandbox from the template - - :param execution_request: (required) - :type execution_request: ExecutionRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._execute_post_serialize( - execution_request=execution_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = { - "200": "Execution", - "400": "Error", - "500": "Error", - } - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - return response_data.response - - def _execute_post_serialize( - self, - execution_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> Tuple: - - _host = None - - _collection_formats: Dict[str, str] = {} - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[str, str] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if execution_request is not None: - _body_params = execution_request - - # set the HTTP header `Accept` - _header_params["Accept"] = self.api_client.select_header_accept( - ["application/json"] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params["Content-Type"] = _content_type - else: - _default_content_type = self.api_client.select_header_content_type( - ["application/json"] - ) - if _default_content_type is not None: - _header_params["Content-Type"] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [] - - return self.api_client.param_serialize( - method="POST", - resource_path="/execute", - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth, - ) - - @validate_call - def health_get( - self, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> None: - """health_get - - Health check - - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._health_get_serialize( - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = {} - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - @validate_call - def health_get_with_http_info( - self, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[None]: - """health_get - - Health check - - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._health_get_serialize( - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = {} - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - @validate_call - def health_get_without_preload_content( - self, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] - ], - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """health_get - - Health check - - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._health_get_serialize( - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index, - ) - - _response_types_map: Dict[str, Optional[str]] = {} - response_data = self.api_client.call_api( - *_param, _request_timeout=_request_timeout - ) - return response_data.response - - def _health_get_serialize( - self, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> Tuple: - - _host = None - - _collection_formats: Dict[str, str] = {} - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[str, str] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - # authentication setting - _auth_settings: List[str] = [] - - return self.api_client.param_serialize( - method="GET", - resource_path="/health", - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth, - ) diff --git a/python/e2b_code_interpreter/client/api_client.py b/python/e2b_code_interpreter/client/api_client.py deleted file mode 100644 index ddb934de..00000000 --- a/python/e2b_code_interpreter/client/api_client.py +++ /dev/null @@ -1,697 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import atexit -import datetime -from dateutil.parser import parse -import json -import mimetypes -import os -import re -import tempfile - -from urllib.parse import quote -from typing import Tuple, Optional, List - -from e2b_code_interpreter.client.configuration import Configuration -from e2b_code_interpreter.client.api_response import ApiResponse -import e2b_code_interpreter.client.models -from e2b_code_interpreter.client import rest -from e2b_code_interpreter.client.exceptions import ( - ApiValueError, - ApiException, - BadRequestException, - UnauthorizedException, - ForbiddenException, - NotFoundException, - ServiceException, -) - - -class ApiClient: - """Generic API client for OpenAPI client library builds. - - OpenAPI generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the OpenAPI - templates. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - """ - - PRIMITIVE_TYPES = (float, bool, bytes, str, int) - NATIVE_TYPES_MAPPING = { - "int": int, - "long": int, # TODO remove as only py3 is supported? - "float": float, - "str": str, - "bool": bool, - "date": datetime.date, - "datetime": datetime.datetime, - "object": object, - } - _pool = None - - def __init__( - self, configuration=None, header_name=None, header_value=None, cookie=None - ) -> None: - # use default configuration if none is provided - if configuration is None: - configuration = Configuration.get_default() - self.configuration = configuration - - self.rest_client = rest.RESTClientObject(configuration) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - self.user_agent = "OpenAPI-Generator/1.0.0/python" - self.client_side_validation = configuration.client_side_validation - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - pass - - @property - def user_agent(self): - """User agent for this API client""" - return self.default_headers["User-Agent"] - - @user_agent.setter - def user_agent(self, value): - self.default_headers["User-Agent"] = value - - def set_default_header(self, header_name, header_value): - self.default_headers[header_name] = header_value - - _default = None - - @classmethod - def get_default(cls): - """Return new instance of ApiClient. - - This method returns newly created, based on default constructor, - object of ApiClient class or returns a copy of default - ApiClient. - - :return: The ApiClient object. - """ - if cls._default is None: - cls._default = ApiClient() - return cls._default - - @classmethod - def set_default(cls, default): - """Set default instance of ApiClient. - - It stores default ApiClient. - - :param default: object of ApiClient. - """ - cls._default = default - - def param_serialize( - self, - method, - resource_path, - path_params=None, - query_params=None, - header_params=None, - body=None, - post_params=None, - files=None, - auth_settings=None, - collection_formats=None, - _host=None, - _request_auth=None, - ) -> Tuple: - """Builds the HTTP request params needed by the request. - :param method: Method to call. - :param resource_path: Path to method endpoint. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. - :return: tuple of form (path, http_method, query_params, header_params, - body, post_params, files) - """ - - config = self.configuration - - # header parameters - header_params = header_params or {} - header_params.update(self.default_headers) - if self.cookie: - header_params["Cookie"] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict( - self.parameters_to_tuples(header_params, collection_formats) - ) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, collection_formats) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - "{%s}" % k, quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # post parameters - if post_params or files: - post_params = post_params if post_params else [] - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, collection_formats) - post_params.extend(self.files_parameters(files)) - - # auth setting - self.update_params_for_auth( - header_params, - query_params, - auth_settings, - resource_path, - method, - body, - request_auth=_request_auth, - ) - - # body - if body: - body = self.sanitize_for_serialization(body) - - # request url - if _host is None: - url = self.configuration.host + resource_path - else: - # use server/host defined in path or operation instead - url = _host + resource_path - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - url_query = self.parameters_to_url_query(query_params, collection_formats) - url += "?" + url_query - - return method, url, header_params, body, post_params - - def call_api( - self, - method, - url, - header_params=None, - body=None, - post_params=None, - _request_timeout=None, - ) -> rest.RESTResponse: - """Makes the HTTP request (synchronous) - :param method: Method to call. - :param url: Path to method endpoint. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param _request_timeout: timeout setting for this request. - :return: RESTResponse - """ - - try: - # perform request and return response - response_data = self.rest_client.request( - method, - url, - headers=header_params, - body=body, - post_params=post_params, - _request_timeout=_request_timeout, - ) - - except ApiException as e: - if e.body: - e.body = e.body.decode("utf-8") - raise e - - return response_data - - def response_deserialize( - self, response_data=None, response_types_map=None - ) -> ApiResponse: - """Deserializes response into an object. - :param response_data: RESTResponse object to be deserialized. - :param response_types_map: dict of response types. - :return: ApiResponse - """ - - response_type = response_types_map.get(str(response_data.status), None) - if ( - not response_type - and isinstance(response_data.status, int) - and 100 <= response_data.status <= 599 - ): - # if not found, look for '1XX', '2XX', etc. - response_type = response_types_map.get( - str(response_data.status)[0] + "XX", None - ) - - if not 200 <= response_data.status <= 299: - if response_data.status == 400: - raise BadRequestException(http_resp=response_data) - - if response_data.status == 401: - raise UnauthorizedException(http_resp=response_data) - - if response_data.status == 403: - raise ForbiddenException(http_resp=response_data) - - if response_data.status == 404: - raise NotFoundException(http_resp=response_data) - - if 500 <= response_data.status <= 599: - raise ServiceException(http_resp=response_data) - raise ApiException(http_resp=response_data) - - # deserialize response data - - if response_type == "bytearray": - return_data = response_data.data - elif response_type is None: - return_data = None - elif response_type == "file": - return_data = self.__deserialize_file(response_data) - else: - match = None - content_type = response_data.getheader("content-type") - if content_type is not None: - match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) - encoding = match.group(1) if match else "utf-8" - response_text = response_data.data.decode(encoding) - return_data = self.deserialize(response_text, response_type) - - return ApiResponse( - status_code=response_data.status, - data=return_data, - headers=response_data.getheaders(), - raw_data=response_data.data, - ) - - def sanitize_for_serialization(self, obj): - """Builds a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - elif isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = obj.to_dict() - - return { - key: self.sanitize_for_serialization(val) for key, val in obj_dict.items() - } - - def deserialize(self, response_text, response_type): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - - # fetch data from response object - try: - data = json.loads(response_text) - except ValueError: - data = response_text - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if isinstance(klass, str): - if klass.startswith("List["): - sub_kls = re.match(r"List\[(.*)]", klass).group(1) - return [self.__deserialize(sub_data, sub_kls) for sub_data in data] - - if klass.startswith("Dict["): - sub_kls = re.match(r"Dict\[([^,]*), (.*)]", klass).group(2) - return {k: self.__deserialize(v, sub_kls) for k, v in data.items()} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(e2b_code_interpreter.client.models, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datetime(data) - else: - return self.__deserialize_model(data, klass) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == "multi": - new_params.extend((k, value) for value in v) - else: - if collection_format == "ssv": - delimiter = " " - elif collection_format == "tsv": - delimiter = "\t" - elif collection_format == "pipes": - delimiter = "|" - else: # csv is the default - delimiter = "," - new_params.append((k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def parameters_to_url_query(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: URL query string (e.g. a=Hello%20World&b=123) - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: - if isinstance(v, bool): - v = str(v).lower() - if isinstance(v, (int, float)): - v = str(v) - if isinstance(v, dict): - v = json.dumps(v) - - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == "multi": - new_params.extend((k, value) for value in v) - else: - if collection_format == "ssv": - delimiter = " " - elif collection_format == "tsv": - delimiter = "\t" - elif collection_format == "pipes": - delimiter = "|" - else: # csv is the default - delimiter = "," - new_params.append( - (k, delimiter.join(quote(str(value)) for value in v)) - ) - else: - new_params.append((k, quote(str(v)))) - - return "&".join(["=".join(item) for item in new_params]) - - def files_parameters(self, files=None): - """Builds form parameters. - - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if files: - for k, v in files.items(): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, "rb") as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = ( - mimetypes.guess_type(filename)[0] - or "application/octet-stream" - ) - params.append(tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts: List[str]) -> Optional[str]: - """Returns `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return None - - for accept in accepts: - if re.search("json", accept, re.IGNORECASE): - return accept - - return accepts[0] - - def select_header_content_type(self, content_types): - """Returns `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return None - - for content_type in content_types: - if re.search("json", content_type, re.IGNORECASE): - return content_type - - return content_types[0] - - def update_params_for_auth( - self, - headers, - queries, - auth_settings, - resource_path, - method, - body, - request_auth=None, - ) -> None: - """Updates header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param queries: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - :resource_path: A string representation of the HTTP request resource path. - :method: A string representation of the HTTP request method. - :body: A object representing the body of the HTTP request. - The object type is the return value of sanitize_for_serialization(). - :param request_auth: if set, the provided settings will - override the token in the configuration. - """ - if not auth_settings: - return - - if request_auth: - self._apply_auth_params( - headers, queries, resource_path, method, body, request_auth - ) - else: - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - self._apply_auth_params( - headers, queries, resource_path, method, body, auth_setting - ) - - def _apply_auth_params( - self, headers, queries, resource_path, method, body, auth_setting - ) -> None: - """Updates the request parameters based on a single auth_setting - - :param headers: Header parameters dict to be updated. - :param queries: Query parameters tuple list to be updated. - :resource_path: A string representation of the HTTP request resource path. - :method: A string representation of the HTTP request method. - :body: A object representing the body of the HTTP request. - The object type is the return value of sanitize_for_serialization(). - :param auth_setting: auth settings for the endpoint - """ - if auth_setting["in"] == "cookie": - headers["Cookie"] = auth_setting["value"] - elif auth_setting["in"] == "header": - if auth_setting["type"] != "http-signature": - headers[auth_setting["key"]] = auth_setting["value"] - elif auth_setting["in"] == "query": - queries.append((auth_setting["key"], auth_setting["value"])) - else: - raise ApiValueError("Authentication token must be in `query` or `header`") - - def __deserialize_file(self, response): - """Deserializes body to file - - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - handle file downloading - save response body into a tmp file and return the instance - - :param response: RESTResponse. - :return: file path. - """ - fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - filename = re.search( - r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition - ).group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "wb") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return str(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datetime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=("Failed to parse `{0}` as datetime object".format(string)), - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - - return klass.from_dict(data) diff --git a/python/e2b_code_interpreter/client/api_response.py b/python/e2b_code_interpreter/client/api_response.py deleted file mode 100644 index f3855566..00000000 --- a/python/e2b_code_interpreter/client/api_response.py +++ /dev/null @@ -1,22 +0,0 @@ -"""API response object.""" - -from __future__ import annotations -from typing import Any, Dict, Optional, Generic, TypeVar -from pydantic import Field, StrictInt, StrictStr, StrictBytes, BaseModel - -T = TypeVar("T") - - -class ApiResponse(BaseModel, Generic[T]): - """ - API response object - """ - - status_code: StrictInt = Field(description="HTTP status code") - headers: Optional[Dict[StrictStr, StrictStr]] = Field( - None, description="HTTP headers" - ) - data: T = Field(description="Deserialized data given the data type") - raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") - - model_config = {"arbitrary_types_allowed": True} diff --git a/python/e2b_code_interpreter/client/client.py b/python/e2b_code_interpreter/client/client.py new file mode 100644 index 00000000..38b07d05 --- /dev/null +++ b/python/e2b_code_interpreter/client/client.py @@ -0,0 +1,286 @@ +import ssl +from typing import Any, Dict, Optional, Union + +import httpx +from attrs import define, evolve, field + + +@define +class Client: + """A class for keeping track of data related to the API + + The following are accepted as keyword arguments and will be used to construct httpx Clients internally: + + ``base_url``: The base URL for the API, all requests are made to a relative path to this URL + + ``cookies``: A dictionary of cookies to be sent with every request + + ``headers``: A dictionary of headers to be sent with every request + + ``timeout``: The maximum amount of a time a request can take. API functions will raise + httpx.TimeoutException if this is exceeded. + + ``verify_ssl``: Whether or not to verify the SSL certificate of the API server. This should be True in production, + but can be set to False for testing purposes. + + ``follow_redirects``: Whether or not to follow redirects. Default value is False. + + ``httpx_args``: A dictionary of additional arguments to be passed to the ``httpx.Client`` and ``httpx.AsyncClient`` constructor. + + + Attributes: + raise_on_unexpected_status: Whether or not to raise an errors.UnexpectedStatus if the API returns a + status code that was not documented in the source OpenAPI document. Can also be provided as a keyword + argument to the constructor. + """ + + raise_on_unexpected_status: bool = field(default=False, kw_only=True) + _base_url: str = field(alias="base_url") + _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") + _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers") + _timeout: Optional[httpx.Timeout] = field( + default=None, kw_only=True, alias="timeout" + ) + _verify_ssl: Union[str, bool, ssl.SSLContext] = field( + default=True, kw_only=True, alias="verify_ssl" + ) + _follow_redirects: bool = field( + default=False, kw_only=True, alias="follow_redirects" + ) + _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") + _client: Optional[httpx.Client] = field(default=None, init=False) + _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) + + def with_headers(self, headers: Dict[str, str]) -> "Client": + """Get a new client matching this one with additional headers""" + if self._client is not None: + self._client.headers.update(headers) + if self._async_client is not None: + self._async_client.headers.update(headers) + return evolve(self, headers={**self._headers, **headers}) + + def with_cookies(self, cookies: Dict[str, str]) -> "Client": + """Get a new client matching this one with additional cookies""" + if self._client is not None: + self._client.cookies.update(cookies) + if self._async_client is not None: + self._async_client.cookies.update(cookies) + return evolve(self, cookies={**self._cookies, **cookies}) + + def with_timeout(self, timeout: httpx.Timeout) -> "Client": + """Get a new client matching this one with a new timeout (in seconds)""" + if self._client is not None: + self._client.timeout = timeout + if self._async_client is not None: + self._async_client.timeout = timeout + return evolve(self, timeout=timeout) + + def set_httpx_client(self, client: httpx.Client) -> "Client": + """Manually the underlying httpx.Client + + **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. + """ + self._client = client + return self + + def get_httpx_client(self) -> httpx.Client: + """Get the underlying httpx.Client, constructing a new one if not previously set""" + if self._client is None: + self._client = httpx.Client( + base_url=self._base_url, + cookies=self._cookies, + headers=self._headers, + timeout=self._timeout, + verify=self._verify_ssl, + follow_redirects=self._follow_redirects, + **self._httpx_args, + ) + return self._client + + def __enter__(self) -> "Client": + """Enter a context manager for self.client—you cannot enter twice (see httpx docs)""" + self.get_httpx_client().__enter__() + return self + + def __exit__(self, *args: Any, **kwargs: Any) -> None: + """Exit a context manager for internal httpx.Client (see httpx docs)""" + self.get_httpx_client().__exit__(*args, **kwargs) + + def set_async_httpx_client(self, async_client: httpx.AsyncClient) -> "Client": + """Manually the underlying httpx.AsyncClient + + **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. + """ + self._async_client = async_client + return self + + def get_async_httpx_client(self) -> httpx.AsyncClient: + """Get the underlying httpx.AsyncClient, constructing a new one if not previously set""" + if self._async_client is None: + self._async_client = httpx.AsyncClient( + base_url=self._base_url, + cookies=self._cookies, + headers=self._headers, + timeout=self._timeout, + verify=self._verify_ssl, + follow_redirects=self._follow_redirects, + **self._httpx_args, + ) + return self._async_client + + async def __aenter__(self) -> "Client": + """Enter a context manager for underlying httpx.AsyncClient—you cannot enter twice (see httpx docs)""" + await self.get_async_httpx_client().__aenter__() + return self + + async def __aexit__(self, *args: Any, **kwargs: Any) -> None: + """Exit a context manager for underlying httpx.AsyncClient (see httpx docs)""" + await self.get_async_httpx_client().__aexit__(*args, **kwargs) + + +@define +class AuthenticatedClient: + """A Client which has been authenticated for use on secured endpoints + + The following are accepted as keyword arguments and will be used to construct httpx Clients internally: + + ``base_url``: The base URL for the API, all requests are made to a relative path to this URL + + ``cookies``: A dictionary of cookies to be sent with every request + + ``headers``: A dictionary of headers to be sent with every request + + ``timeout``: The maximum amount of a time a request can take. API functions will raise + httpx.TimeoutException if this is exceeded. + + ``verify_ssl``: Whether or not to verify the SSL certificate of the API server. This should be True in production, + but can be set to False for testing purposes. + + ``follow_redirects``: Whether or not to follow redirects. Default value is False. + + ``httpx_args``: A dictionary of additional arguments to be passed to the ``httpx.Client`` and ``httpx.AsyncClient`` constructor. + + + Attributes: + raise_on_unexpected_status: Whether or not to raise an errors.UnexpectedStatus if the API returns a + status code that was not documented in the source OpenAPI document. Can also be provided as a keyword + argument to the constructor. + token: The token to use for authentication + prefix: The prefix to use for the Authorization header + auth_header_name: The name of the Authorization header + """ + + raise_on_unexpected_status: bool = field(default=False, kw_only=True) + _base_url: str = field(alias="base_url") + _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") + _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers") + _timeout: Optional[httpx.Timeout] = field( + default=None, kw_only=True, alias="timeout" + ) + _verify_ssl: Union[str, bool, ssl.SSLContext] = field( + default=True, kw_only=True, alias="verify_ssl" + ) + _follow_redirects: bool = field( + default=False, kw_only=True, alias="follow_redirects" + ) + _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") + _client: Optional[httpx.Client] = field(default=None, init=False) + _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) + + token: str + prefix: str = "Bearer" + auth_header_name: str = "Authorization" + + def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient": + """Get a new client matching this one with additional headers""" + if self._client is not None: + self._client.headers.update(headers) + if self._async_client is not None: + self._async_client.headers.update(headers) + return evolve(self, headers={**self._headers, **headers}) + + def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient": + """Get a new client matching this one with additional cookies""" + if self._client is not None: + self._client.cookies.update(cookies) + if self._async_client is not None: + self._async_client.cookies.update(cookies) + return evolve(self, cookies={**self._cookies, **cookies}) + + def with_timeout(self, timeout: httpx.Timeout) -> "AuthenticatedClient": + """Get a new client matching this one with a new timeout (in seconds)""" + if self._client is not None: + self._client.timeout = timeout + if self._async_client is not None: + self._async_client.timeout = timeout + return evolve(self, timeout=timeout) + + def set_httpx_client(self, client: httpx.Client) -> "AuthenticatedClient": + """Manually the underlying httpx.Client + + **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. + """ + self._client = client + return self + + def get_httpx_client(self) -> httpx.Client: + """Get the underlying httpx.Client, constructing a new one if not previously set""" + if self._client is None: + self._headers[self.auth_header_name] = ( + f"{self.prefix} {self.token}" if self.prefix else self.token + ) + self._client = httpx.Client( + base_url=self._base_url, + cookies=self._cookies, + headers=self._headers, + timeout=self._timeout, + verify=self._verify_ssl, + follow_redirects=self._follow_redirects, + **self._httpx_args, + ) + return self._client + + def __enter__(self) -> "AuthenticatedClient": + """Enter a context manager for self.client—you cannot enter twice (see httpx docs)""" + self.get_httpx_client().__enter__() + return self + + def __exit__(self, *args: Any, **kwargs: Any) -> None: + """Exit a context manager for internal httpx.Client (see httpx docs)""" + self.get_httpx_client().__exit__(*args, **kwargs) + + def set_async_httpx_client( + self, async_client: httpx.AsyncClient + ) -> "AuthenticatedClient": + """Manually the underlying httpx.AsyncClient + + **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. + """ + self._async_client = async_client + return self + + def get_async_httpx_client(self) -> httpx.AsyncClient: + """Get the underlying httpx.AsyncClient, constructing a new one if not previously set""" + if self._async_client is None: + self._headers[self.auth_header_name] = ( + f"{self.prefix} {self.token}" if self.prefix else self.token + ) + self._async_client = httpx.AsyncClient( + base_url=self._base_url, + cookies=self._cookies, + headers=self._headers, + timeout=self._timeout, + verify=self._verify_ssl, + follow_redirects=self._follow_redirects, + **self._httpx_args, + ) + return self._async_client + + async def __aenter__(self) -> "AuthenticatedClient": + """Enter a context manager for underlying httpx.AsyncClient—you cannot enter twice (see httpx docs)""" + await self.get_async_httpx_client().__aenter__() + return self + + async def __aexit__(self, *args: Any, **kwargs: Any) -> None: + """Exit a context manager for underlying httpx.AsyncClient (see httpx docs)""" + await self.get_async_httpx_client().__aexit__(*args, **kwargs) diff --git a/python/e2b_code_interpreter/client/configuration.py b/python/e2b_code_interpreter/client/configuration.py deleted file mode 100644 index a2899946..00000000 --- a/python/e2b_code_interpreter/client/configuration.py +++ /dev/null @@ -1,443 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import copy -import logging -import sys -import urllib3 - -import http.client as httplib - -JSON_SCHEMA_VALIDATION_KEYWORDS = { - "multipleOf", - "maximum", - "exclusiveMaximum", - "minimum", - "exclusiveMinimum", - "maxLength", - "minLength", - "pattern", - "maxItems", - "minItems", -} - - -class Configuration: - """This class contains various settings of the API client. - - :param host: Base url. - :param api_key: Dict to store API key(s). - Each entry in the dict specifies an API key. - The dict key is the name of the security scheme in the OAS specification. - The dict value is the API key secret. - :param api_key_prefix: Dict to store API prefix (e.g. Bearer). - The dict key is the name of the security scheme in the OAS specification. - The dict value is an API key prefix when generating the auth data. - :param username: Username for HTTP basic authentication. - :param password: Password for HTTP basic authentication. - :param access_token: Access token. - :param server_index: Index to servers configuration. - :param server_variables: Mapping with string values to replace variables in - templated server configuration. The validation of enums is performed for - variables with defined enum values before. - :param server_operation_index: Mapping from operation ID to an index to server - configuration. - :param server_operation_variables: Mapping from operation ID to a mapping with - string values to replace variables in templated server configuration. - The validation of enums is performed for variables with defined enum - values before. - :param ssl_ca_cert: str - the path to a file of concatenated CA certificates - in PEM format. - - """ - - _default = None - - def __init__( - self, - host=None, - api_key=None, - api_key_prefix=None, - username=None, - password=None, - access_token=None, - server_index=None, - server_variables=None, - server_operation_index=None, - server_operation_variables=None, - ssl_ca_cert=None, - ) -> None: - """Constructor""" - self._base_path = "http://localhost" if host is None else host - """Default Base url - """ - self.server_index = 0 if server_index is None and host is None else server_index - self.server_operation_index = server_operation_index or {} - """Default server index - """ - self.server_variables = server_variables or {} - self.server_operation_variables = server_operation_variables or {} - """Default server variables - """ - self.temp_folder_path = None - """Temp file folder for downloading files - """ - # Authentication Settings - self.api_key = {} - if api_key: - self.api_key = api_key - """dict to store API key(s) - """ - self.api_key_prefix = {} - if api_key_prefix: - self.api_key_prefix = api_key_prefix - """dict to store API prefix (e.g. Bearer) - """ - self.refresh_api_key_hook = None - """function hook to refresh API key if expired - """ - self.username = username - """Username for HTTP basic authentication - """ - self.password = password - """Password for HTTP basic authentication - """ - self.access_token = access_token - """Access token - """ - self.logger = {} - """Logging Settings - """ - self.logger["package_logger"] = logging.getLogger("e2b_code_interpreter.client") - self.logger["urllib3_logger"] = logging.getLogger("urllib3") - self.logger_format = "%(asctime)s %(levelname)s %(message)s" - """Log format - """ - self.logger_stream_handler = None - """Log stream handler - """ - self.logger_file_handler = None - """Log file handler - """ - self.logger_file = None - """Debug file location - """ - self.debug = False - """Debug switch - """ - - self.verify_ssl = True - """SSL/TLS verification - Set this to false to skip verifying SSL certificate when calling API - from https server. - """ - self.ssl_ca_cert = ssl_ca_cert - """Set this to customize the certificate file to verify the peer. - """ - self.cert_file = None - """client certificate file - """ - self.key_file = None - """client key file - """ - self.assert_hostname = None - """Set this to True/False to enable/disable SSL hostname verification. - """ - self.tls_server_name = None - """SSL/TLS Server Name Indication (SNI) - Set this to the SNI value expected by the server. - """ - - self.proxy = None - """Proxy URL - """ - self.proxy_headers = None - """Proxy headers - """ - self.safe_chars_for_path_param = "" - """Safe chars for path_param - """ - self.retries = None - """Adding retries to override urllib3 default value 3 - """ - # Enable client side validation - self.client_side_validation = True - - self.socket_options = None - """Options to pass down to the underlying urllib3 socket - """ - - self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" - """datetime format - """ - - self.date_format = "%Y-%m-%d" - """date format - """ - - def __deepcopy__(self, memo): - cls = self.__class__ - result = cls.__new__(cls) - memo[id(self)] = result - for k, v in self.__dict__.items(): - if k not in ("logger", "logger_file_handler"): - setattr(result, k, copy.deepcopy(v, memo)) - # shallow copy of loggers - result.logger = copy.copy(self.logger) - # use setters to configure loggers - result.logger_file = self.logger_file - result.debug = self.debug - return result - - def __setattr__(self, name, value): - object.__setattr__(self, name, value) - - @classmethod - def set_default(cls, default): - """Set default instance of configuration. - - It stores default configuration, which can be - returned by get_default_copy method. - - :param default: object of Configuration - """ - cls._default = default - - @classmethod - def get_default_copy(cls): - """Deprecated. Please use `get_default` instead. - - Deprecated. Please use `get_default` instead. - - :return: The configuration object. - """ - return cls.get_default() - - @classmethod - def get_default(cls): - """Return the default configuration. - - This method returns newly created, based on default constructor, - object of Configuration class or returns a copy of default - configuration. - - :return: The configuration object. - """ - if cls._default is None: - cls._default = Configuration() - return cls._default - - @property - def logger_file(self): - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - return self.__logger_file - - @logger_file.setter - def logger_file(self, value): - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - self.__logger_file = value - if self.__logger_file: - # If set logging file, - # then add file handler and remove stream handler. - self.logger_file_handler = logging.FileHandler(self.__logger_file) - self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in self.logger.items(): - logger.addHandler(self.logger_file_handler) - - @property - def debug(self): - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - return self.__debug - - @debug.setter - def debug(self, value): - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - self.__debug = value - if self.__debug: - # if debug status is True, turn on debug logging - for _, logger in self.logger.items(): - logger.setLevel(logging.DEBUG) - # turn on httplib debug - httplib.HTTPConnection.debuglevel = 1 - else: - # if debug status is False, turn off debug logging, - # setting log level to default `logging.WARNING` - for _, logger in self.logger.items(): - logger.setLevel(logging.WARNING) - # turn off httplib debug - httplib.HTTPConnection.debuglevel = 0 - - @property - def logger_format(self): - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - return self.__logger_format - - @logger_format.setter - def logger_format(self, value): - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - self.__logger_format = value - self.logger_formatter = logging.Formatter(self.__logger_format) - - def get_api_key_with_prefix(self, identifier, alias=None): - """Gets API key (with prefix if set). - - :param identifier: The identifier of apiKey. - :param alias: The alternative identifier of apiKey. - :return: The token for api key authentication. - """ - if self.refresh_api_key_hook is not None: - self.refresh_api_key_hook(self) - key = self.api_key.get( - identifier, self.api_key.get(alias) if alias is not None else None - ) - if key: - prefix = self.api_key_prefix.get(identifier) - if prefix: - return "%s %s" % (prefix, key) - else: - return key - - def get_basic_auth_token(self): - """Gets HTTP basic authentication header (string). - - :return: The token for basic HTTP authentication. - """ - username = "" - if self.username is not None: - username = self.username - password = "" - if self.password is not None: - password = self.password - return urllib3.util.make_headers(basic_auth=username + ":" + password).get( - "authorization" - ) - - def auth_settings(self): - """Gets Auth Settings dict for api client. - - :return: The Auth Settings information dict. - """ - auth = {} - return auth - - def to_debug_report(self): - """Gets the essential information for debugging. - - :return: The report for debugging. - """ - return ( - "Python SDK Debug Report:\n" - "OS: {env}\n" - "Python Version: {pyversion}\n" - "Version of the API: 0.1.0\n" - "SDK Package Version: 1.0.0".format(env=sys.platform, pyversion=sys.version) - ) - - def get_host_settings(self): - """Gets an array of host settings - - :return: An array of host settings - """ - return [ - { - "url": "", - "description": "No description provided", - } - ] - - def get_host_from_settings(self, index, variables=None, servers=None): - """Gets host URL based on the index and variables - :param index: array index of the host settings - :param variables: hash of variable and the corresponding value - :param servers: an array of host settings or None - :return: URL based on host settings - """ - if index is None: - return self._base_path - - variables = {} if variables is None else variables - servers = self.get_host_settings() if servers is None else servers - - try: - server = servers[index] - except IndexError: - raise ValueError( - "Invalid index {0} when selecting the host settings. " - "Must be less than {1}".format(index, len(servers)) - ) - - url = server["url"] - - # go through variables and replace placeholders - for variable_name, variable in server.get("variables", {}).items(): - used_value = variables.get(variable_name, variable["default_value"]) - - if "enum_values" in variable and used_value not in variable["enum_values"]: - raise ValueError( - "The variable `{0}` in the host URL has invalid value " - "{1}. Must be {2}.".format( - variable_name, variables[variable_name], variable["enum_values"] - ) - ) - - url = url.replace("{" + variable_name + "}", used_value) - - return url - - @property - def host(self): - """Return generated host.""" - return self.get_host_from_settings( - self.server_index, variables=self.server_variables - ) - - @host.setter - def host(self, value): - """Fix base path.""" - self._base_path = value - self.server_index = None diff --git a/python/e2b_code_interpreter/client/errors.py b/python/e2b_code_interpreter/client/errors.py new file mode 100644 index 00000000..5f92e76a --- /dev/null +++ b/python/e2b_code_interpreter/client/errors.py @@ -0,0 +1,16 @@ +"""Contains shared errors types that can be raised from API functions""" + + +class UnexpectedStatus(Exception): + """Raised by api functions when the response status an undocumented status and Client.raise_on_unexpected_status is True""" + + def __init__(self, status_code: int, content: bytes): + self.status_code = status_code + self.content = content + + super().__init__( + f"Unexpected status code: {status_code}\n\nResponse content:\n{content.decode(errors='ignore')}" + ) + + +__all__ = ["UnexpectedStatus"] diff --git a/python/e2b_code_interpreter/client/exceptions.py b/python/e2b_code_interpreter/client/exceptions.py deleted file mode 100644 index d0a4d0f0..00000000 --- a/python/e2b_code_interpreter/client/exceptions.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -class OpenApiException(Exception): - """The base exception class for all OpenAPIExceptions""" - - -class ApiTypeError(OpenApiException, TypeError): - def __init__( - self, msg, path_to_item=None, valid_classes=None, key_type=None - ) -> None: - """Raises an exception for TypeErrors - - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (list): a list of keys an indices to get to the - current_item - None if unset - valid_classes (tuple): the primitive classes that current item - should be an instance of - None if unset - key_type (bool): False if our value is a value in a dict - True if it is a key in a dict - False if our item is an item in a list - None if unset - """ - self.path_to_item = path_to_item - self.valid_classes = valid_classes - self.key_type = key_type - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiTypeError, self).__init__(full_msg) - - -class ApiValueError(OpenApiException, ValueError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (list) the path to the exception in the - received_data dict. None if unset - """ - - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiValueError, self).__init__(full_msg) - - -class ApiAttributeError(OpenApiException, AttributeError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Raised when an attribute reference or assignment fails. - - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (None/list) the path to the exception in the - received_data dict - """ - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiAttributeError, self).__init__(full_msg) - - -class ApiKeyError(OpenApiException, KeyError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (None/list) the path to the exception in the - received_data dict - """ - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiKeyError, self).__init__(full_msg) - - -class ApiException(OpenApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - if http_resp: - self.status = http_resp.status - self.reason = http_resp.reason - self.body = http_resp.data.decode("utf-8") - self.headers = http_resp.getheaders() - else: - self.status = status - self.reason = reason - self.body = None - self.headers = None - - def __str__(self): - """Custom error messages for exception""" - error_message = "({0})\n" "Reason: {1}\n".format(self.status, self.reason) - if self.headers: - error_message += "HTTP response headers: {0}\n".format(self.headers) - - if self.body: - error_message += "HTTP response body: {0}\n".format(self.body) - - return error_message - - -class BadRequestException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - super(BadRequestException, self).__init__(status, reason, http_resp) - - -class NotFoundException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - super(NotFoundException, self).__init__(status, reason, http_resp) - - -class UnauthorizedException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - super(UnauthorizedException, self).__init__(status, reason, http_resp) - - -class ForbiddenException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - super(ForbiddenException, self).__init__(status, reason, http_resp) - - -class ServiceException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None) -> None: - super(ServiceException, self).__init__(status, reason, http_resp) - - -def render_path(path_to_item): - """Returns a string representation of a path""" - result = "" - for pth in path_to_item: - if isinstance(pth, int): - result += "[{0}]".format(pth) - else: - result += "['{0}']".format(pth) - return result diff --git a/python/e2b_code_interpreter/client/models/__init__.py b/python/e2b_code_interpreter/client/models/__init__.py index 8265128c..c1347e90 100644 --- a/python/e2b_code_interpreter/client/models/__init__.py +++ b/python/e2b_code_interpreter/client/models/__init__.py @@ -1,21 +1,19 @@ -# coding: utf-8 +"""Contains all the data models used in inputs/outputs""" -# flake8: noqa -""" - E2B Code Interpreter +from .error import Error +from .execution import Execution +from .execution_request import ExecutionRequest +from .logs import Logs +from .result import Result +from .result_extra import ResultExtra +from .result_json import ResultJson - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -# import models into model package -from e2b_code_interpreter.client.models.error import Error -from e2b_code_interpreter.client.models.execution import Execution -from e2b_code_interpreter.client.models.execution_request import ExecutionRequest -from e2b_code_interpreter.client.models.logs import Logs -from e2b_code_interpreter.client.models.result import Result +__all__ = ( + "Error", + "Execution", + "ExecutionRequest", + "Logs", + "Result", + "ResultExtra", + "ResultJson", +) diff --git a/python/e2b_code_interpreter/client/models/error.py b/python/e2b_code_interpreter/client/models/error.py index 7f3fa279..ee629c02 100644 --- a/python/e2b_code_interpreter/client/models/error.py +++ b/python/e2b_code_interpreter/client/models/error.py @@ -1,118 +1,96 @@ -# coding: utf-8 +from typing import Any, Dict, List, Type, TypeVar, Union, cast -""" - E2B Code Interpreter +from attrs import define as _attrs_define +from attrs import field as _attrs_field - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) +from ..types import UNSET, Unset - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) +T = TypeVar("T", bound="Error") - Do not edit the class manually. -""" # noqa: E501 +@_attrs_define +class Error: + """ + Attributes: + name (Union[Unset, str]): Name of the exception + value (Union[Unset, str]): Value of the exception + traceback_raw (Union[Unset, List[str]]): List of strings representing the traceback + code (Union[Unset, int]): Error code + message (Union[Unset, str]): Error + """ -from __future__ import annotations -import pprint -import re # noqa: F401 -import json + name: Union[Unset, str] = UNSET + value: Union[Unset, str] = UNSET + traceback_raw: Union[Unset, List[str]] = UNSET + code: Union[Unset, int] = UNSET + message: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) + def to_dict(self) -> Dict[str, Any]: + name = self.name -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictInt, StrictStr -from pydantic import Field + value = self.value -try: - from typing import Self -except ImportError: - from typing_extensions import Self + traceback_raw: Union[Unset, List[str]] = UNSET + if not isinstance(self.traceback_raw, Unset): + traceback_raw = self.traceback_raw + code = self.code -class Error(BaseModel): - """ - Error - """ # noqa: E501 - - name: Optional[StrictStr] = Field(default=None, description="Name of the exception") - value: Optional[StrictStr] = Field( - default=None, description="Value of the exception" - ) - traceback_raw: Optional[List[StrictStr]] = Field( - default=None, description="List of strings representing the traceback" - ) - code: Optional[StrictInt] = Field(default=None, description="Error code") - message: Optional[StrictStr] = Field(default=None, description="Error") - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = [ - "name", - "value", - "traceback_raw", - "code", - "message", - ] - - model_config = {"populate_by_name": True, "validate_assignment": True} - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + message = self.message + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if name is not UNSET: + field_dict["name"] = name + if value is not UNSET: + field_dict["value"] = value + if traceback_raw is not UNSET: + field_dict["traceback_raw"] = traceback_raw + if code is not UNSET: + field_dict["code"] = code + if message is not UNSET: + field_dict["message"] = message + + return field_dict @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Error from a JSON string""" - return cls.from_dict(json.loads(json_str)) + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + name = d.pop("name", UNSET) - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value + value = d.pop("value", UNSET) - return _dict + traceback_raw = cast(List[str], d.pop("traceback_raw", UNSET)) - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Error from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "name": obj.get("name"), - "value": obj.get("value"), - "traceback_raw": obj.get("traceback_raw"), - "code": obj.get("code"), - "message": obj.get("message"), - } + code = d.pop("code", UNSET) + + message = d.pop("message", UNSET) + + error = cls( + name=name, + value=value, + traceback_raw=traceback_raw, + code=code, + message=message, ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - return _obj + error.additional_properties = d + return error + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/execution.py b/python/e2b_code_interpreter/client/models/execution.py index e97cdc50..94295e67 100644 --- a/python/e2b_code_interpreter/client/models/execution.py +++ b/python/e2b_code_interpreter/client/models/execution.py @@ -1,136 +1,119 @@ -# coding: utf-8 +from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union -""" - E2B Code Interpreter +from attrs import define as _attrs_define +from attrs import field as _attrs_field - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) +from ..types import UNSET, Unset - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) +if TYPE_CHECKING: + from ..models.error import Error + from ..models.logs import Logs + from ..models.result import Result - Do not edit the class manually. -""" # noqa: E501 +T = TypeVar("T", bound="Execution") -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictInt -from pydantic import Field -from e2b_code_interpreter.client.models.error import Error -from e2b_code_interpreter.client.models.logs import Logs -from e2b_code_interpreter.client.models.result import Result - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class Execution(BaseModel): +@_attrs_define +class Execution: """ - Execution - """ # noqa: E501 + Attributes: + results (Union[Unset, List['Result']]): + logs (Union[Unset, Logs]): + error (Union[Unset, Error]): + execution_count (Union[Unset, int]): Execution count of the cell. + """ + + results: Union[Unset, List["Result"]] = UNSET + logs: Union[Unset, "Logs"] = UNSET + error: Union[Unset, "Error"] = UNSET + execution_count: Union[Unset, int] = UNSET + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - results: Optional[List[Result]] = None - logs: Optional[Logs] = None - error: Optional[Error] = None - execution_count: Optional[StrictInt] = Field( - default=None, description="Execution count of the cell." - ) - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["results", "logs", "error", "execution_count"] + def to_dict(self) -> Dict[str, Any]: + results: Union[Unset, List[Dict[str, Any]]] = UNSET + if not isinstance(self.results, Unset): + results = [] + for results_item_data in self.results: + results_item = results_item_data.to_dict() + results.append(results_item) + + logs: Union[Unset, Dict[str, Any]] = UNSET + if not isinstance(self.logs, Unset): + logs = self.logs.to_dict() + + error: Union[Unset, Dict[str, Any]] = UNSET + if not isinstance(self.error, Unset): + error = self.error.to_dict() + + execution_count = self.execution_count + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if results is not UNSET: + field_dict["results"] = results + if logs is not UNSET: + field_dict["logs"] = logs + if error is not UNSET: + field_dict["error"] = error + if execution_count is not UNSET: + field_dict["execution_count"] = execution_count + + return field_dict - model_config = {"populate_by_name": True, "validate_assignment": True} + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + from ..models.error import Error + from ..models.logs import Logs + from ..models.result import Result + + d = src_dict.copy() + results = [] + _results = d.pop("results", UNSET) + for results_item_data in _results or []: + results_item = Result.from_dict(results_item_data) + + results.append(results_item) + + _logs = d.pop("logs", UNSET) + logs: Union[Unset, Logs] + if isinstance(_logs, Unset): + logs = UNSET + else: + logs = Logs.from_dict(_logs) + + _error = d.pop("error", UNSET) + error: Union[Unset, Error] + if isinstance(_error, Unset): + error = UNSET + else: + error = Error.from_dict(_error) + + execution_count = d.pop("execution_count", UNSET) + + execution = cls( + results=results, + logs=logs, + error=error, + execution_count=execution_count, + ) - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) + execution.additional_properties = d + return execution - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Execution from a JSON string""" - return cls.from_dict(json.loads(json_str)) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in results (list) - _items = [] - if self.results: - for _item in self.results: - if _item: - _items.append(_item.to_dict()) - _dict["results"] = _items - # override the default output from pydantic by calling `to_dict()` of logs - if self.logs: - _dict["logs"] = self.logs.to_dict() - # override the default output from pydantic by calling `to_dict()` of error - if self.error: - _dict["error"] = self.error.to_dict() - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - - return _dict + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Execution from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "results": ( - [Result.from_dict(_item) for _item in obj.get("results")] - if obj.get("results") is not None - else None - ), - "logs": ( - Logs.from_dict(obj.get("logs")) - if obj.get("logs") is not None - else None - ), - "error": ( - Error.from_dict(obj.get("error")) - if obj.get("error") is not None - else None - ), - "execution_count": obj.get("execution_count"), - } - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - return _obj + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/execution_request.py b/python/e2b_code_interpreter/client/models/execution_request.py index b0ff03e2..b734edde 100644 --- a/python/e2b_code_interpreter/client/models/execution_request.py +++ b/python/e2b_code_interpreter/client/models/execution_request.py @@ -1,101 +1,69 @@ -# coding: utf-8 +from typing import Any, Dict, List, Type, TypeVar, Union -""" - E2B Code Interpreter +from attrs import define as _attrs_define +from attrs import field as _attrs_field - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) +from ..types import UNSET, Unset - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) +T = TypeVar("T", bound="ExecutionRequest") - Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictStr -from pydantic import Field - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class ExecutionRequest(BaseModel): +@_attrs_define +class ExecutionRequest: + """ + Attributes: + code (str): Code to be executed + language (Union[Unset, str]): Language of the code to be executed """ - ExecutionRequest - """ # noqa: E501 - code: StrictStr = Field(description="Code to be executed") - language: Optional[StrictStr] = Field( - default=None, description="Language of the code to be executed" - ) - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["code", "language"] + code: str + language: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - model_config = {"populate_by_name": True, "validate_assignment": True} + def to_dict(self) -> Dict[str, Any]: + code = self.code - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) + language = self.language - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "code": code, + } + ) + if language is not UNSET: + field_dict["language"] = language + + return field_dict @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ExecutionRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + code = d.pop("code") - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, + language = d.pop("language", UNSET) + + execution_request = cls( + code=code, + language=language, ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - return _dict + execution_request.additional_properties = d + return execution_request - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of ExecutionRequest from a dict""" - if obj is None: - return None + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - if not isinstance(obj, dict): - return cls.model_validate(obj) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - _obj = cls.model_validate( - {"code": obj.get("code"), "language": obj.get("language")} - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - return _obj + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/logs.py b/python/e2b_code_interpreter/client/models/logs.py index e91a91b2..c7689a4c 100644 --- a/python/e2b_code_interpreter/client/models/logs.py +++ b/python/e2b_code_interpreter/client/models/logs.py @@ -1,98 +1,67 @@ -# coding: utf-8 +from typing import Any, Dict, List, Type, TypeVar, Union -""" - E2B Code Interpreter +from attrs import define as _attrs_define +from attrs import field as _attrs_field - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) +from ..types import UNSET, Unset - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) +T = TypeVar("T", bound="Logs") - Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictStr - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class Logs(BaseModel): +@_attrs_define +class Logs: + """ + Attributes: + stdout (Union[Unset, str]): + stderr (Union[Unset, str]): """ - Logs - """ # noqa: E501 - stdout: Optional[StrictStr] = None - stderr: Optional[StrictStr] = None - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["stdout", "stderr"] + stdout: Union[Unset, str] = UNSET + stderr: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - model_config = {"populate_by_name": True, "validate_assignment": True} + def to_dict(self) -> Dict[str, Any]: + stdout = self.stdout + + stderr = self.stderr - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if stdout is not UNSET: + field_dict["stdout"] = stdout + if stderr is not UNSET: + field_dict["stderr"] = stderr - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return field_dict @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Logs from a JSON string""" - return cls.from_dict(json.loads(json_str)) + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + stdout = d.pop("stdout", UNSET) - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, + stderr = d.pop("stderr", UNSET) + + logs = cls( + stdout=stdout, + stderr=stderr, ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - return _dict + logs.additional_properties = d + return logs - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Logs from a dict""" - if obj is None: - return None + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) - if not isinstance(obj, dict): - return cls.model_validate(obj) + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] - _obj = cls.model_validate( - {"stdout": obj.get("stdout"), "stderr": obj.get("stderr")} - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] - return _obj + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result.py b/python/e2b_code_interpreter/client/models/result.py index c16651bf..e0ed3315 100644 --- a/python/e2b_code_interpreter/client/models/result.py +++ b/python/e2b_code_interpreter/client/models/result.py @@ -1,159 +1,179 @@ -# coding: utf-8 +from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union -""" - E2B Code Interpreter +from attrs import define as _attrs_define +from attrs import field as _attrs_field - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) +from ..types import UNSET, Unset - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) +if TYPE_CHECKING: + from ..models.result_extra import ResultExtra + from ..models.result_json import ResultJson - Do not edit the class manually. -""" # noqa: E501 +T = TypeVar("T", bound="Result") -from __future__ import annotations -import pprint -import re # noqa: F401 -import json +@_attrs_define +class Result: + """ + Attributes: + text (Union[Unset, str]): Textual representation of the result + html (Union[Unset, str]): HTML representation of the result + markdown (Union[Unset, str]): Markdown representation of the result + svg (Union[Unset, str]): SVG representation of the result + png (Union[Unset, str]): PNG representation of the result + jpeg (Union[Unset, str]): JPEG representation of the result + pdf (Union[Unset, str]): PDF representation of the result + latex (Union[Unset, str]): LaTeX representation of the result + json (Union[Unset, ResultJson]): JSON representation of the result + javascript (Union[Unset, str]): JavaScript representation of the result + extra (Union[Unset, ResultExtra]): Extra representations of the result + is_main_result (Union[Unset, bool]): Whether this is the main result of the cell + """ -from typing import Any, ClassVar, Dict, List, Optional, Union -from pydantic import BaseModel, StrictBool, StrictStr -from pydantic import Field + text: Union[Unset, str] = UNSET + html: Union[Unset, str] = UNSET + markdown: Union[Unset, str] = UNSET + svg: Union[Unset, str] = UNSET + png: Union[Unset, str] = UNSET + jpeg: Union[Unset, str] = UNSET + pdf: Union[Unset, str] = UNSET + latex: Union[Unset, str] = UNSET + json: Union[Unset, "ResultJson"] = UNSET + javascript: Union[Unset, str] = UNSET + extra: Union[Unset, "ResultExtra"] = UNSET + is_main_result: Union[Unset, bool] = UNSET + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) -try: - from typing import Self -except ImportError: - from typing_extensions import Self + def to_dict(self) -> Dict[str, Any]: + text = self.text + html = self.html -class Result(BaseModel): - """ - Result - """ # noqa: E501 - - text: Optional[StrictStr] = Field( - default=None, description="Textual representation of the result" - ) - html: Optional[StrictStr] = Field( - default=None, description="HTML representation of the result" - ) - markdown: Optional[StrictStr] = Field( - default=None, description="Markdown representation of the result" - ) - svg: Optional[StrictStr] = Field( - default=None, description="SVG representation of the result" - ) - png: Optional[StrictStr] = Field( - default=None, description="PNG representation of the result" - ) - jpeg: Optional[StrictStr] = Field( - default=None, description="JPEG representation of the result" - ) - pdf: Optional[StrictStr] = Field( - default=None, description="PDF representation of the result" - ) - latex: Optional[StrictStr] = Field( - default=None, description="LaTeX representation of the result" - ) - var_json: Optional[Union[str, Any]] = Field( - default=None, description="JSON representation of the result", alias="json" - ) - javascript: Optional[StrictStr] = Field( - default=None, description="JavaScript representation of the result" - ) - extra: Optional[Union[str, Any]] = Field( - default=None, description="Extra representations of the result" - ) - is_main_result: Optional[StrictBool] = Field( - default=None, description="Whether this is the main result of the cell" - ) - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = [ - "text", - "html", - "markdown", - "svg", - "png", - "jpeg", - "pdf", - "latex", - "json", - "javascript", - "extra", - "is_main_result", - ] - - model_config = {"populate_by_name": True, "validate_assignment": True} - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + markdown = self.markdown - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Result from a JSON string""" - return cls.from_dict(json.loads(json_str)) + svg = self.svg - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value + png = self.png + + jpeg = self.jpeg + + pdf = self.pdf - return _dict + latex = self.latex + + json: Union[Unset, Dict[str, Any]] = UNSET + if not isinstance(self.json, Unset): + json = self.json.to_dict() + + javascript = self.javascript + + extra: Union[Unset, Dict[str, Any]] = UNSET + if not isinstance(self.extra, Unset): + extra = self.extra.to_dict() + + is_main_result = self.is_main_result + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if text is not UNSET: + field_dict["text"] = text + if html is not UNSET: + field_dict["html"] = html + if markdown is not UNSET: + field_dict["markdown"] = markdown + if svg is not UNSET: + field_dict["svg"] = svg + if png is not UNSET: + field_dict["png"] = png + if jpeg is not UNSET: + field_dict["jpeg"] = jpeg + if pdf is not UNSET: + field_dict["pdf"] = pdf + if latex is not UNSET: + field_dict["latex"] = latex + if json is not UNSET: + field_dict["json"] = json + if javascript is not UNSET: + field_dict["javascript"] = javascript + if extra is not UNSET: + field_dict["extra"] = extra + if is_main_result is not UNSET: + field_dict["is_main_result"] = is_main_result + + return field_dict @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Result from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "text": obj.get("text"), - "html": obj.get("html"), - "markdown": obj.get("markdown"), - "svg": obj.get("svg"), - "png": obj.get("png"), - "jpeg": obj.get("jpeg"), - "pdf": obj.get("pdf"), - "latex": obj.get("latex"), - "json": obj.get("json"), - "javascript": obj.get("javascript"), - "extra": obj.get("extra"), - "is_main_result": obj.get("is_main_result"), - } + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + from ..models.result_extra import ResultExtra + from ..models.result_json import ResultJson + + d = src_dict.copy() + text = d.pop("text", UNSET) + + html = d.pop("html", UNSET) + + markdown = d.pop("markdown", UNSET) + + svg = d.pop("svg", UNSET) + + png = d.pop("png", UNSET) + + jpeg = d.pop("jpeg", UNSET) + + pdf = d.pop("pdf", UNSET) + + latex = d.pop("latex", UNSET) + + _json = d.pop("json", UNSET) + json: Union[Unset, ResultJson] + if isinstance(_json, Unset): + json = UNSET + else: + json = ResultJson.from_dict(_json) + + javascript = d.pop("javascript", UNSET) + + _extra = d.pop("extra", UNSET) + extra: Union[Unset, ResultExtra] + if isinstance(_extra, Unset): + extra = UNSET + else: + extra = ResultExtra.from_dict(_extra) + + is_main_result = d.pop("is_main_result", UNSET) + + result = cls( + text=text, + html=html, + markdown=markdown, + svg=svg, + png=png, + jpeg=jpeg, + pdf=pdf, + latex=latex, + json=json, + javascript=javascript, + extra=extra, + is_main_result=is_main_result, ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - return _obj + result.additional_properties = d + return result + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result_extra.py b/python/e2b_code_interpreter/client/models/result_extra.py new file mode 100644 index 00000000..35fa4ab7 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/result_extra.py @@ -0,0 +1,43 @@ +from typing import Any, Dict, List, Type, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="ResultExtra") + + +@_attrs_define +class ResultExtra: + """Extra representations of the result""" + + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + result_extra = cls() + + result_extra.additional_properties = d + return result_extra + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result_json.py b/python/e2b_code_interpreter/client/models/result_json.py new file mode 100644 index 00000000..4f9d6311 --- /dev/null +++ b/python/e2b_code_interpreter/client/models/result_json.py @@ -0,0 +1,43 @@ +from typing import Any, Dict, List, Type, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="ResultJson") + + +@_attrs_define +class ResultJson: + """JSON representation of the result""" + + additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + result_json = cls() + + result_json.additional_properties = d + return result_json + + @property + def additional_keys(self) -> List[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/rest.py b/python/e2b_code_interpreter/client/rest.py deleted file mode 100644 index bd2bccce..00000000 --- a/python/e2b_code_interpreter/client/rest.py +++ /dev/null @@ -1,214 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import io -import json -import re -import ssl - -import urllib3 - -from e2b_code_interpreter.client.exceptions import ApiException, ApiValueError - -RESTResponseType = urllib3.HTTPResponse - - -class RESTResponse(io.IOBase): - - def __init__(self, resp) -> None: - self.response = resp - self.status = resp.status - self.reason = resp.reason - self.data = None - - def read(self): - if self.data is None: - self.data = self.response.data - return self.data - - def getheaders(self): - """Returns a dictionary of the response headers.""" - return self.response.headers - - def getheader(self, name, default=None): - """Returns a given response header.""" - return self.response.headers.get(name, default) - - -class RESTClientObject: - - def __init__(self, configuration) -> None: - # urllib3.PoolManager will pass all kw parameters to connectionpool - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 - # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 - - # cert_reqs - if configuration.verify_ssl: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - - addition_pool_args = {} - if configuration.assert_hostname is not None: - addition_pool_args["assert_hostname"] = configuration.assert_hostname - - if configuration.retries is not None: - addition_pool_args["retries"] = configuration.retries - - if configuration.tls_server_name: - addition_pool_args["server_hostname"] = configuration.tls_server_name - - if configuration.socket_options is not None: - addition_pool_args["socket_options"] = configuration.socket_options - - # https pool manager - if configuration.proxy: - self.pool_manager = urllib3.ProxyManager( - cert_reqs=cert_reqs, - ca_certs=configuration.ssl_ca_cert, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - proxy_url=configuration.proxy, - proxy_headers=configuration.proxy_headers, - **addition_pool_args - ) - else: - self.pool_manager = urllib3.PoolManager( - cert_reqs=cert_reqs, - ca_certs=configuration.ssl_ca_cert, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - **addition_pool_args - ) - - def request( - self, - method, - url, - headers=None, - body=None, - post_params=None, - _request_timeout=None, - ): - """Perform requests. - - :param method: http request method - :param url: http request url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - """ - method = method.upper() - assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"] - - if post_params and body: - raise ApiValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - timeout = None - if _request_timeout: - if isinstance(_request_timeout, (int, float)): - timeout = urllib3.Timeout(total=_request_timeout) - elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2: - timeout = urllib3.Timeout( - connect=_request_timeout[0], read=_request_timeout[1] - ) - - try: - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: - - # no content type provided or payload is json - content_type = headers.get("Content-Type") - if not content_type or re.search("json", content_type, re.IGNORECASE): - request_body = None - if body is not None: - request_body = json.dumps(body) - r = self.pool_manager.request( - method, - url, - body=request_body, - timeout=timeout, - headers=headers, - preload_content=False, - ) - elif content_type == "application/x-www-form-urlencoded": - r = self.pool_manager.request( - method, - url, - fields=post_params, - encode_multipart=False, - timeout=timeout, - headers=headers, - preload_content=False, - ) - elif content_type == "multipart/form-data": - # must del headers['Content-Type'], or the correct - # Content-Type which generated by urllib3 will be - # overwritten. - del headers["Content-Type"] - r = self.pool_manager.request( - method, - url, - fields=post_params, - encode_multipart=True, - timeout=timeout, - headers=headers, - preload_content=False, - ) - # Pass a `string` parameter directly in the body to support - # other content types than Json when `body` argument is - # provided in serialized form - elif isinstance(body, str) or isinstance(body, bytes): - request_body = body - r = self.pool_manager.request( - method, - url, - body=request_body, - timeout=timeout, - headers=headers, - preload_content=False, - ) - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided - arguments. Please check that your arguments match - declared content type.""" - raise ApiException(status=0, reason=msg) - # For `GET`, `HEAD` - else: - r = self.pool_manager.request( - method, - url, - fields={}, - timeout=timeout, - headers=headers, - preload_content=False, - ) - except urllib3.exceptions.SSLError as e: - msg = "\n".join([type(e).__name__, str(e)]) - raise ApiException(status=0, reason=msg) - - return RESTResponse(r) diff --git a/python/e2b_code_interpreter/client/types.py b/python/e2b_code_interpreter/client/types.py new file mode 100644 index 00000000..21fac106 --- /dev/null +++ b/python/e2b_code_interpreter/client/types.py @@ -0,0 +1,45 @@ +"""Contains some shared types for properties""" + +from http import HTTPStatus +from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar + +from attrs import define + + +class Unset: + def __bool__(self) -> Literal[False]: + return False + + +UNSET: Unset = Unset() + +FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]] + + +@define +class File: + """Contains information for file uploads""" + + payload: BinaryIO + file_name: Optional[str] = None + mime_type: Optional[str] = None + + def to_tuple(self) -> FileJsonType: + """Return a tuple representation that httpx will accept for multipart/form-data""" + return self.file_name, self.payload, self.mime_type + + +T = TypeVar("T") + + +@define +class Response(Generic[T]): + """A response from an endpoint""" + + status_code: HTTPStatus + content: bytes + headers: MutableMapping[str, str] + parsed: Optional[T] + + +__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"] diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d55f10a6..d676e0b3 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -5,15 +5,18 @@ from typing import Optional, Dict from e2b import Sandbox -from e2b_code_interpreter.client import ( - DefaultApi, - ExecutionRequest, - ApiClient, - Configuration, -) + from e2b_code_interpreter.constants import TIMEOUT from e2b_code_interpreter.models import Execution, Result, Logs, Error + +from e2b_code_interpreter.client.client import Client +from e2b_code_interpreter.client.models import ExecutionRequest + +from e2b_code_interpreter.client.api.default.post_execute import ( + sync_detailed as post_execute, +) + logger = logging.getLogger(__name__) @@ -65,33 +68,29 @@ def exec_code( f"Executing code {code} for language {language} (Sandbox: {self.sandbox_id})" ) - configuration = Configuration(host=f"https://{self.get_host(8000)}") - # configuration = Configuration(host=f"http://localhost:8000") - with ApiClient(configuration=configuration) as client: - api_client = DefaultApi(api_client=client) - execution = api_client.execute_post( - ExecutionRequest(code=code, language=language), _request_timeout=timeout - ) + client = Client(base_url=f"https://{self.get_host(8000)}") + with client as client: + execution = post_execute(client=client, body=ExecutionRequest(code=code)) + + execution = execution.parsed + if not execution: + raise Exception("Failed to execute code") logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") return Execution( results=( - [ - Result(**result.model_dump(exclude={"additional_properties"})) - for result in execution.results - ] + [Result(**result.to_dict()) for result in execution.results] if execution.results else None ), logs=( - Logs(stdout=execution.logs.stdout, stderr=execution.logs.stderr) + Logs( + stdout=execution.logs.stdout or None, + stderr=execution.logs.stderr or None, + ) if execution.logs else Logs() ), - error=( - Error(**execution.error.model_dump(exclude={"additional_properties"})) - if execution.error - else None - ), + error=(Error(**execution.error.to_dict()) if execution.error else None), ) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index f137218a..ab6f171d 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -71,24 +71,38 @@ class Result: is_main_result: bool "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." - def __init__(self, **kwargs): - self.text = kwargs.pop("text", None) - self.html = kwargs.pop("html", None) - self.markdown = kwargs.pop("markdown", None) - self.svg = kwargs.pop("svg", None) - self.png = kwargs.pop("png", None) - self.jpeg = kwargs.pop("jpeg", None) - self.pdf = kwargs.pop("pdf", None) - self.latex = kwargs.pop("latex", None) - self.json = kwargs.pop("json", None) - self.javascript = kwargs.pop("javascript", None) - self.is_main_result = kwargs.pop("is_main_result", False) - self.extra = kwargs.pop("extra", None) or {} - - # Allows to iterate over formats() def __getitem__(self, item): return getattr(self, item) + # Allows to iterate over formats() + def __init__( + self, + text: Optional[str] = None, + html: Optional[str] = None, + markdown: Optional[str] = None, + svg: Optional[str] = None, + png: Optional[str] = None, + jpeg: Optional[str] = None, + pdf: Optional[str] = None, + latex: Optional[str] = None, + json: Optional[dict] = None, + javascript: Optional[str] = None, + is_main_result: bool = False, + extra: Optional[dict] = None, + ): + self.text = text + self.html = html + self.markdown = markdown + self.svg = svg + self.png = png + self.jpeg = jpeg + self.pdf = pdf + self.latex = latex + self.json = json + self.javascript = javascript + self.is_main_result = is_main_result + self.extra = extra or {} + def formats(self) -> Iterable[str]: """ Returns all available formats of the result. @@ -209,16 +223,19 @@ class Logs: Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. """ - stdout: List[str] = [] + stdout: Optional[str] = None "List of strings printed to stdout by prints, subprocesses, etc." - stderr: List[str] = [] + stderr: Optional[str] = None "List of strings printed to stderr by prints, subprocesses, etc." def __init__( self, stdout: Optional[List[str]] = None, stderr: Optional[List[str]] = None ): - self.stdout = stdout or [] - self.stderr = stderr or [] + self.stdout = stdout + self.stderr = stderr + + def __repr__(self): + return f"Logs(stdout: {self.stdout}, stderr: {self.stderr})" def to_json(self) -> str: """ @@ -261,6 +278,9 @@ def __init__(self, **kwargs): self.error = kwargs.pop("error", None) self.execution_count = kwargs.pop("execution_count", None) + def __repr__(self): + return f"Execution(Results: {self.results}, Logs: {self.logs}, Error: {self.error})" + @property def text(self) -> Optional[str]: """ diff --git a/python/pyproject.toml b/python/pyproject.toml index 8afaec14..4257583a 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,11 +12,13 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" e2b = "0.17.2a23" requests = "^2.32.3" +httpx = ">=0.20.0,<0.28.0" +attrs = ">=21.3.0" +python-dateutil = "^2.8.0" [tool.poetry.group.dev.dependencies] black = "^24.3.0" diff --git a/template/server/api/models/execution.py b/template/server/api/models/execution.py index 6b093a06..06b34eae 100644 --- a/template/server/api/models/execution.py +++ b/template/server/api/models/execution.py @@ -45,7 +45,11 @@ class Execution(BaseModel): additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = ["results", "logs", "error", "execution_count"] - model_config = {"populate_by_name": True, "validate_assignment": True} + model_config = { + "populate_by_name": True, + "validate_assignment": True, + "arbitrary_types_allowed": True, + } def to_str(self) -> str: """Returns the string representation of the model using alias""" diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index c16651bf..3bf309da 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -1,26 +1,8 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - from __future__ import annotations -import pprint -import re # noqa: F401 -import json -from typing import Any, ClassVar, Dict, List, Optional, Union -from pydantic import BaseModel, StrictBool, StrictStr -from pydantic import Field +from typing import Optional +from pydantic import BaseModel try: from typing import Self @@ -30,130 +12,55 @@ class Result(BaseModel): """ - Result - """ # noqa: E501 - - text: Optional[StrictStr] = Field( - default=None, description="Textual representation of the result" - ) - html: Optional[StrictStr] = Field( - default=None, description="HTML representation of the result" - ) - markdown: Optional[StrictStr] = Field( - default=None, description="Markdown representation of the result" - ) - svg: Optional[StrictStr] = Field( - default=None, description="SVG representation of the result" - ) - png: Optional[StrictStr] = Field( - default=None, description="PNG representation of the result" - ) - jpeg: Optional[StrictStr] = Field( - default=None, description="JPEG representation of the result" - ) - pdf: Optional[StrictStr] = Field( - default=None, description="PDF representation of the result" - ) - latex: Optional[StrictStr] = Field( - default=None, description="LaTeX representation of the result" - ) - var_json: Optional[Union[str, Any]] = Field( - default=None, description="JSON representation of the result", alias="json" - ) - javascript: Optional[StrictStr] = Field( - default=None, description="JavaScript representation of the result" - ) - extra: Optional[Union[str, Any]] = Field( - default=None, description="Extra representations of the result" - ) - is_main_result: Optional[StrictBool] = Field( - default=None, description="Whether this is the main result of the cell" - ) - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = [ - "text", - "html", - "markdown", - "svg", - "png", - "jpeg", - "pdf", - "latex", - "json", - "javascript", - "extra", - "is_main_result", - ] - - model_config = {"populate_by_name": True, "validate_assignment": True} + Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. + The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) + The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented + as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, + for the actual result the representation is always present for the result, the other representations are always optional. - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Result from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: + The class also provides methods to display the data in a Jupyter notebook. + """ - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. + text: Optional[str] = None + html: Optional[str] = None + markdown: Optional[str] = None + svg: Optional[str] = None + png: Optional[str] = None + jpeg: Optional[str] = None + pdf: Optional[str] = None + latex: Optional[str] = None + json: Optional[dict] = None + javascript: Optional[str] = None + extra: Optional[dict] = None + "Extra data that can be included. Not part of the standard types." + + is_main_result: Optional[bool] = None + "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." + + def __init__(self, is_main_result: bool, data: [str, str]): + super().__init__() + self.is_main_result = is_main_result + + self.text = data.pop("text/plain", None) + self.html = data.pop("text/html", None) + self.markdown = data.pop("text/markdown", None) + self.svg = data.pop("image/svg+xml", None) + self.png = data.pop("image/png", None) + self.jpeg = data.pop("image/jpeg", None) + self.pdf = data.pop("application/pdf", None) + self.latex = data.pop("text/latex", None) + self.json = data.pop("application/json", None) + self.javascript = data.pop("application/javascript", None) + self.extra = data + + def __str__(self) -> Optional[str]: """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value + Returns the text representation of the data. - return _dict - - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Result from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "text": obj.get("text"), - "html": obj.get("html"), - "markdown": obj.get("markdown"), - "svg": obj.get("svg"), - "png": obj.get("png"), - "jpeg": obj.get("jpeg"), - "pdf": obj.get("pdf"), - "latex": obj.get("latex"), - "json": obj.get("json"), - "javascript": obj.get("javascript"), - "extra": obj.get("extra"), - "is_main_result": obj.get("is_main_result"), - } - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) + :return: The text representation of the data. + """ + return self.text - return _obj + def __repr__(self) -> str: + return f"Result({self.text})" diff --git a/template/server/main.py b/template/server/main.py index 05acd6c4..4092d89e 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -21,10 +21,12 @@ @asynccontextmanager async def lifespan(app: FastAPI): # Load the ML model - default_ws = JupyterKernelWebSocket(f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id) + default_ws = JupyterKernelWebSocket( + f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id + ) - websockets['default'] = default_ws - websockets['python'] = default_ws + websockets["default"] = default_ws + websockets["python"] = default_ws task = asyncio.create_task(default_ws.connect()) await default_ws.started @@ -43,7 +45,7 @@ def health(): return "Request was successful" -@app.post("/execute") +@app.post("/execute", response_model=Execution, response_model_exclude_none=True) async def execute(request: ExecutionRequest) -> Execution: - ws = websockets['default'] + ws = websockets["default"] return await ws.execute(code=request.code) diff --git a/template/server/messaging.py b/template/server/messaging.py index dceebe92..ce04c970 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -144,7 +144,9 @@ async def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: await self._ws.send(request) - result = await asyncio.wait_for(self._cells[message_id].execution, timeout=timeout) + result = await asyncio.wait_for( + self._cells[message_id].execution, timeout=timeout + ) logger.debug(f"Got result for message: {message_id}") del self._cells[message_id] @@ -201,7 +203,7 @@ def _process_message(self, data: dict): elif data["content"]["name"] == "stderr": execution.logs.stderr.append(data["content"]["text"]) if cell.on_stderr: - cell.on_stderr( data["content"]["text"]) + cell.on_stderr(data["content"]["text"]) elif data["msg_type"] in "display_data": result = Result(is_main_result=False, data=data["content"]["data"]) From b3f23dce54c1f812e45ade7321f7bc694150e36d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 16:19:00 +0200 Subject: [PATCH 080/722] Remove incorrect docstring --- python/e2b_code_interpreter/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index ab6f171d..f01710f6 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -248,7 +248,6 @@ def to_json(self) -> str: def serialize_results(results: List[Result]) -> List[Dict[str, str]]: """ Serializes the results to JSON. - This method is used by the Pydantic JSON encoder. """ serialized = [] for result in results: From 7f621a8334b9b0f400a42eb75e9376c6788d7f34 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 17:28:21 +0200 Subject: [PATCH 081/722] Improve logging --- template/server/main.py | 15 ++++++++++++++- template/start-up.sh | 9 +++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 4092d89e..8b6d0770 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,4 +1,5 @@ import asyncio +import logging import uuid from contextlib import asynccontextmanager from typing import Dict @@ -9,6 +10,9 @@ from api.models.execution import Execution from api.models.execution_request import ExecutionRequest +logger = logging.Logger(__name__) +logger.setLevel(logging.INFO) + session_id = str(uuid.uuid4()) @@ -28,9 +32,11 @@ async def lifespan(app: FastAPI): websockets["default"] = default_ws websockets["python"] = default_ws + logger.info("Connecting to default runtime") task = asyncio.create_task(default_ws.connect()) await default_ws.started + logger.info("Connected to default runtime") yield await default_ws.close() @@ -39,6 +45,8 @@ async def lifespan(app: FastAPI): app = FastAPI(lifespan=lifespan) +logger.info("Starting Code Interpreter server") + @app.get("/health") def health(): @@ -47,5 +55,10 @@ def health(): @app.post("/execute", response_model=Execution, response_model_exclude_none=True) async def execute(request: ExecutionRequest) -> Execution: + logger.info(f"Executing code: {request.code}") + ws = websockets["default"] - return await ws.execute(code=request.code) + execution = await ws.execute(code=request.code) + + logger.info(f"Execution result: {execution}") + return execution diff --git a/template/start-up.sh b/template/start-up.sh index 6f964073..b00b8eba 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -12,7 +12,6 @@ function start_jupyter_server() { response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done - echo "Jupyter Server started" response=$(curl -s -X POST "localhost:8888/api/sessions" -H "Content-Type: application/json" -d '{"path": "/home/user", "kernel": {"name": "python3"}, "type": "notebook", "name": "default"}') status=$(echo "${response}" | jq -r '.kernel.execution_state') @@ -20,17 +19,15 @@ function start_jupyter_server() { echo "Error creating kernel: ${response} ${status}" exit 1 fi - echo "Kernel created" sudo mkdir -p /root/.jupyter kernel_id=$(echo "${response}" | jq -r '.kernel.id') sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null - echo "Jupyter Server started" - fastapi run /root/.server/main.py --port 8000 + fastapi run /root/.server/main.py --port 8000 > /dev/null 2>&1 } -echo "Starting Jupyter Server..." +echo "Starting Code Interpreter server..." start_jupyter_server & -jupyter server --IdentityProvider.token="" +jupyter server --IdentityProvider.token="" > /dev/null 2>&1 From 28d3b41c2e37f4f4b6f93779060427e892253556 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 8 Jul 2024 17:28:49 +0200 Subject: [PATCH 082/722] Change logging to Debug - users can filter it in CLI --- template/server/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index 8b6d0770..898710cc 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -11,7 +11,7 @@ from api.models.execution_request import ExecutionRequest logger = logging.Logger(__name__) -logger.setLevel(logging.INFO) +logger.setLevel(logging.DEBUG) session_id = str(uuid.uuid4()) From 325809d7525e0f1987ea57702d43232015393937 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 9 Jul 2024 12:50:09 +0200 Subject: [PATCH 083/722] Imrpove logging --- template/server/messaging.py | 8 ++++---- template/start-up.sh | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/template/server/messaging.py b/template/server/messaging.py index ce04c970..daa27b1d 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -137,7 +137,7 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: async def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: message_id = str(uuid.uuid4()) - logger.debug(f"Sending execution message: {message_id}") + logger.debug(f"Sending execution for code ({message_id}): {code}") self._cells[message_id] = CellExecution() request = self._get_execute_request(message_id, code) @@ -147,7 +147,7 @@ async def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: result = await asyncio.wait_for( self._cells[message_id].execution, timeout=timeout ) - logger.debug(f"Got result for message: {message_id}") + logger.debug(f"Got result for code ({message_id})") del self._cells[message_id] return result @@ -248,10 +248,10 @@ def _process_message(self, data: dict): else: logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") - def close(self): + async def close(self): logger.debug("Closing WebSocket") self._stopped.set_result(None) - self._ws.close() + await self._ws.close() for handler in self._waiting_for_replies.values(): logger.debug(f"Cancelling waiting for execution result for {handler}") diff --git a/template/start-up.sh b/template/start-up.sh index b00b8eba..e494ac1c 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -25,7 +25,8 @@ function start_jupyter_server() { sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null - fastapi run /root/.server/main.py --port 8000 > /dev/null 2>&1 + cd /root/.server/ + uvicorn main:app --port 8000 --workers 2 --no-access-log --no-use-colors } echo "Starting Code Interpreter server..." From 12aade810c02374bcbc2303c5bb4ecbc8d718dd2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 9 Jul 2024 16:45:00 +0200 Subject: [PATCH 084/722] Refactor for streaming --- openapi.yml | 66 ++-- .../e2b_code_interpreter/client/__init__.py | 8 - .../client/api/__init__.py | 1 - .../client/api/default/__init__.py | 0 .../client/api/default/get_health.py | 83 ----- .../client/api/default/post_execute.py | 166 ---------- python/e2b_code_interpreter/client/client.py | 286 ------------------ python/e2b_code_interpreter/client/errors.py | 16 - .../client/models/__init__.py | 19 -- .../client/models/error.py | 96 ------ .../client/models/execution.py | 119 -------- .../client/models/execution_request.py | 69 ----- .../client/models/logs.py | 67 ---- .../client/models/result.py | 179 ----------- .../client/models/result_extra.py | 43 --- .../client/models/result_json.py | 43 --- python/e2b_code_interpreter/client/types.py | 45 --- python/e2b_code_interpreter/main.py | 78 +++-- python/e2b_code_interpreter/models.py | 4 +- python/example.py | 6 +- template/server/api/models/error.py | 118 -------- template/server/api/models/execution.py | 140 --------- template/server/api/models/logs.py | 98 ------ .../api/models/{result.py => output.py} | 53 +++- template/server/main.py | 11 +- template/server/messaging.py | 130 +++----- template/server/stream.py | 67 ++++ 27 files changed, 218 insertions(+), 1793 deletions(-) delete mode 100644 python/e2b_code_interpreter/client/__init__.py delete mode 100644 python/e2b_code_interpreter/client/api/__init__.py delete mode 100644 python/e2b_code_interpreter/client/api/default/__init__.py delete mode 100644 python/e2b_code_interpreter/client/api/default/get_health.py delete mode 100644 python/e2b_code_interpreter/client/api/default/post_execute.py delete mode 100644 python/e2b_code_interpreter/client/client.py delete mode 100644 python/e2b_code_interpreter/client/errors.py delete mode 100644 python/e2b_code_interpreter/client/models/__init__.py delete mode 100644 python/e2b_code_interpreter/client/models/error.py delete mode 100644 python/e2b_code_interpreter/client/models/execution.py delete mode 100644 python/e2b_code_interpreter/client/models/execution_request.py delete mode 100644 python/e2b_code_interpreter/client/models/logs.py delete mode 100644 python/e2b_code_interpreter/client/models/result.py delete mode 100644 python/e2b_code_interpreter/client/models/result_extra.py delete mode 100644 python/e2b_code_interpreter/client/models/result_json.py delete mode 100644 python/e2b_code_interpreter/client/types.py delete mode 100644 template/server/api/models/error.py delete mode 100644 template/server/api/models/execution.py delete mode 100644 template/server/api/models/logs.py rename template/server/api/models/{result.py => output.py} (53%) create mode 100644 template/server/stream.py diff --git a/openapi.yml b/openapi.yml index e4ff7c67..1d0f1188 100644 --- a/openapi.yml +++ b/openapi.yml @@ -28,26 +28,36 @@ components: "400": description: Bad request content: - application/json: + text/plain: schema: - $ref: "#/components/schemas/Error" + type: string "404": description: Not found content: - application/json: + text/plain: schema: - $ref: "#/components/schemas/Error" + type: string "500": description: Server error content: - application/json: + text/plain: schema: - $ref: "#/components/schemas/Error" + type: string schemas: - Result: + Output: + required: + - type properties: + type: + type: string + enum: + - stdout + - stderr + - result + - error + description: Type of the result text: type: string description: Textual representation of the result @@ -85,49 +95,15 @@ components: type: boolean description: Whether this is the main result of the cell - - Logs: - properties: - stdout: - type: string - stderr: - type: string - - Error: - properties: name: type: string description: Name of the exception value: type: string description: Value of the exception - traceback_raw: - type: array - items: - type: string - description: List of strings representing the traceback - code: - type: integer - format: int32 - description: Error code - message: + traceback: type: string - description: Error - - Execution: - properties: - results: - type: array - items: - $ref: "#/components/schemas/Result" - logs: - $ref: "#/components/schemas/Logs" - error: - $ref: "#/components/schemas/Error" - execution_count: - type: integer - format: int32 - description: "Execution count of the cell." + description: List of strings representing the traceback ExecutionRequest: required: @@ -163,7 +139,9 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Execution" + type: array + items: + $ref: "#/components/schemas/Output" "400": $ref: "#/components/responses/400" "500": diff --git a/python/e2b_code_interpreter/client/__init__.py b/python/e2b_code_interpreter/client/__init__.py deleted file mode 100644 index 6a910c79..00000000 --- a/python/e2b_code_interpreter/client/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -"""A client library for accessing E2B Code Interpreter""" - -from .client import AuthenticatedClient, Client - -__all__ = ( - "AuthenticatedClient", - "Client", -) diff --git a/python/e2b_code_interpreter/client/api/__init__.py b/python/e2b_code_interpreter/client/api/__init__.py deleted file mode 100644 index 81f9fa24..00000000 --- a/python/e2b_code_interpreter/client/api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Contains methods for accessing the API""" diff --git a/python/e2b_code_interpreter/client/api/default/__init__.py b/python/e2b_code_interpreter/client/api/default/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python/e2b_code_interpreter/client/api/default/get_health.py b/python/e2b_code_interpreter/client/api/default/get_health.py deleted file mode 100644 index e474e5fe..00000000 --- a/python/e2b_code_interpreter/client/api/default/get_health.py +++ /dev/null @@ -1,83 +0,0 @@ -from http import HTTPStatus -from typing import Any, Dict, Optional, Union - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...types import Response - - -def _get_kwargs() -> Dict[str, Any]: - _kwargs: Dict[str, Any] = { - "method": "get", - "url": "/health", - } - - return _kwargs - - -def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: - if response.status_code == HTTPStatus.OK: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - *, - client: Union[AuthenticatedClient, Client], -) -> Response[Any]: - """Health check - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any] - """ - - kwargs = _get_kwargs() - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -async def asyncio_detailed( - *, - client: Union[AuthenticatedClient, Client], -) -> Response[Any]: - """Health check - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any] - """ - - kwargs = _get_kwargs() - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) diff --git a/python/e2b_code_interpreter/client/api/default/post_execute.py b/python/e2b_code_interpreter/client/api/default/post_execute.py deleted file mode 100644 index d692177b..00000000 --- a/python/e2b_code_interpreter/client/api/default/post_execute.py +++ /dev/null @@ -1,166 +0,0 @@ -from http import HTTPStatus -from typing import Any, Dict, Optional, Union, cast - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.execution import Execution -from ...models.execution_request import ExecutionRequest -from ...types import Response - - -def _get_kwargs( - *, - body: ExecutionRequest, -) -> Dict[str, Any]: - headers: Dict[str, Any] = {} - - _kwargs: Dict[str, Any] = { - "method": "post", - "url": "/execute", - } - - _body = body.to_dict() - - _kwargs["json"] = _body - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Union[Any, Execution]]: - if response.status_code == HTTPStatus.OK: - response_200 = Execution.from_dict(response.json()) - - return response_200 - if response.status_code == HTTPStatus.BAD_REQUEST: - response_400 = cast(Any, None) - return response_400 - if response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR: - response_500 = cast(Any, None) - return response_500 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Union[Any, Execution]]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - *, - client: Union[AuthenticatedClient, Client], - body: ExecutionRequest, -) -> Response[Union[Any, Execution]]: - """Create a sandbox from the template - - Args: - body (ExecutionRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Union[Any, Execution]] - """ - - kwargs = _get_kwargs( - body=body, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - *, - client: Union[AuthenticatedClient, Client], - body: ExecutionRequest, -) -> Optional[Union[Any, Execution]]: - """Create a sandbox from the template - - Args: - body (ExecutionRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Union[Any, Execution] - """ - - return sync_detailed( - client=client, - body=body, - ).parsed - - -async def asyncio_detailed( - *, - client: Union[AuthenticatedClient, Client], - body: ExecutionRequest, -) -> Response[Union[Any, Execution]]: - """Create a sandbox from the template - - Args: - body (ExecutionRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Union[Any, Execution]] - """ - - kwargs = _get_kwargs( - body=body, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - *, - client: Union[AuthenticatedClient, Client], - body: ExecutionRequest, -) -> Optional[Union[Any, Execution]]: - """Create a sandbox from the template - - Args: - body (ExecutionRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Union[Any, Execution] - """ - - return ( - await asyncio_detailed( - client=client, - body=body, - ) - ).parsed diff --git a/python/e2b_code_interpreter/client/client.py b/python/e2b_code_interpreter/client/client.py deleted file mode 100644 index 38b07d05..00000000 --- a/python/e2b_code_interpreter/client/client.py +++ /dev/null @@ -1,286 +0,0 @@ -import ssl -from typing import Any, Dict, Optional, Union - -import httpx -from attrs import define, evolve, field - - -@define -class Client: - """A class for keeping track of data related to the API - - The following are accepted as keyword arguments and will be used to construct httpx Clients internally: - - ``base_url``: The base URL for the API, all requests are made to a relative path to this URL - - ``cookies``: A dictionary of cookies to be sent with every request - - ``headers``: A dictionary of headers to be sent with every request - - ``timeout``: The maximum amount of a time a request can take. API functions will raise - httpx.TimeoutException if this is exceeded. - - ``verify_ssl``: Whether or not to verify the SSL certificate of the API server. This should be True in production, - but can be set to False for testing purposes. - - ``follow_redirects``: Whether or not to follow redirects. Default value is False. - - ``httpx_args``: A dictionary of additional arguments to be passed to the ``httpx.Client`` and ``httpx.AsyncClient`` constructor. - - - Attributes: - raise_on_unexpected_status: Whether or not to raise an errors.UnexpectedStatus if the API returns a - status code that was not documented in the source OpenAPI document. Can also be provided as a keyword - argument to the constructor. - """ - - raise_on_unexpected_status: bool = field(default=False, kw_only=True) - _base_url: str = field(alias="base_url") - _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") - _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers") - _timeout: Optional[httpx.Timeout] = field( - default=None, kw_only=True, alias="timeout" - ) - _verify_ssl: Union[str, bool, ssl.SSLContext] = field( - default=True, kw_only=True, alias="verify_ssl" - ) - _follow_redirects: bool = field( - default=False, kw_only=True, alias="follow_redirects" - ) - _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") - _client: Optional[httpx.Client] = field(default=None, init=False) - _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) - - def with_headers(self, headers: Dict[str, str]) -> "Client": - """Get a new client matching this one with additional headers""" - if self._client is not None: - self._client.headers.update(headers) - if self._async_client is not None: - self._async_client.headers.update(headers) - return evolve(self, headers={**self._headers, **headers}) - - def with_cookies(self, cookies: Dict[str, str]) -> "Client": - """Get a new client matching this one with additional cookies""" - if self._client is not None: - self._client.cookies.update(cookies) - if self._async_client is not None: - self._async_client.cookies.update(cookies) - return evolve(self, cookies={**self._cookies, **cookies}) - - def with_timeout(self, timeout: httpx.Timeout) -> "Client": - """Get a new client matching this one with a new timeout (in seconds)""" - if self._client is not None: - self._client.timeout = timeout - if self._async_client is not None: - self._async_client.timeout = timeout - return evolve(self, timeout=timeout) - - def set_httpx_client(self, client: httpx.Client) -> "Client": - """Manually the underlying httpx.Client - - **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. - """ - self._client = client - return self - - def get_httpx_client(self) -> httpx.Client: - """Get the underlying httpx.Client, constructing a new one if not previously set""" - if self._client is None: - self._client = httpx.Client( - base_url=self._base_url, - cookies=self._cookies, - headers=self._headers, - timeout=self._timeout, - verify=self._verify_ssl, - follow_redirects=self._follow_redirects, - **self._httpx_args, - ) - return self._client - - def __enter__(self) -> "Client": - """Enter a context manager for self.client—you cannot enter twice (see httpx docs)""" - self.get_httpx_client().__enter__() - return self - - def __exit__(self, *args: Any, **kwargs: Any) -> None: - """Exit a context manager for internal httpx.Client (see httpx docs)""" - self.get_httpx_client().__exit__(*args, **kwargs) - - def set_async_httpx_client(self, async_client: httpx.AsyncClient) -> "Client": - """Manually the underlying httpx.AsyncClient - - **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. - """ - self._async_client = async_client - return self - - def get_async_httpx_client(self) -> httpx.AsyncClient: - """Get the underlying httpx.AsyncClient, constructing a new one if not previously set""" - if self._async_client is None: - self._async_client = httpx.AsyncClient( - base_url=self._base_url, - cookies=self._cookies, - headers=self._headers, - timeout=self._timeout, - verify=self._verify_ssl, - follow_redirects=self._follow_redirects, - **self._httpx_args, - ) - return self._async_client - - async def __aenter__(self) -> "Client": - """Enter a context manager for underlying httpx.AsyncClient—you cannot enter twice (see httpx docs)""" - await self.get_async_httpx_client().__aenter__() - return self - - async def __aexit__(self, *args: Any, **kwargs: Any) -> None: - """Exit a context manager for underlying httpx.AsyncClient (see httpx docs)""" - await self.get_async_httpx_client().__aexit__(*args, **kwargs) - - -@define -class AuthenticatedClient: - """A Client which has been authenticated for use on secured endpoints - - The following are accepted as keyword arguments and will be used to construct httpx Clients internally: - - ``base_url``: The base URL for the API, all requests are made to a relative path to this URL - - ``cookies``: A dictionary of cookies to be sent with every request - - ``headers``: A dictionary of headers to be sent with every request - - ``timeout``: The maximum amount of a time a request can take. API functions will raise - httpx.TimeoutException if this is exceeded. - - ``verify_ssl``: Whether or not to verify the SSL certificate of the API server. This should be True in production, - but can be set to False for testing purposes. - - ``follow_redirects``: Whether or not to follow redirects. Default value is False. - - ``httpx_args``: A dictionary of additional arguments to be passed to the ``httpx.Client`` and ``httpx.AsyncClient`` constructor. - - - Attributes: - raise_on_unexpected_status: Whether or not to raise an errors.UnexpectedStatus if the API returns a - status code that was not documented in the source OpenAPI document. Can also be provided as a keyword - argument to the constructor. - token: The token to use for authentication - prefix: The prefix to use for the Authorization header - auth_header_name: The name of the Authorization header - """ - - raise_on_unexpected_status: bool = field(default=False, kw_only=True) - _base_url: str = field(alias="base_url") - _cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") - _headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers") - _timeout: Optional[httpx.Timeout] = field( - default=None, kw_only=True, alias="timeout" - ) - _verify_ssl: Union[str, bool, ssl.SSLContext] = field( - default=True, kw_only=True, alias="verify_ssl" - ) - _follow_redirects: bool = field( - default=False, kw_only=True, alias="follow_redirects" - ) - _httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") - _client: Optional[httpx.Client] = field(default=None, init=False) - _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) - - token: str - prefix: str = "Bearer" - auth_header_name: str = "Authorization" - - def with_headers(self, headers: Dict[str, str]) -> "AuthenticatedClient": - """Get a new client matching this one with additional headers""" - if self._client is not None: - self._client.headers.update(headers) - if self._async_client is not None: - self._async_client.headers.update(headers) - return evolve(self, headers={**self._headers, **headers}) - - def with_cookies(self, cookies: Dict[str, str]) -> "AuthenticatedClient": - """Get a new client matching this one with additional cookies""" - if self._client is not None: - self._client.cookies.update(cookies) - if self._async_client is not None: - self._async_client.cookies.update(cookies) - return evolve(self, cookies={**self._cookies, **cookies}) - - def with_timeout(self, timeout: httpx.Timeout) -> "AuthenticatedClient": - """Get a new client matching this one with a new timeout (in seconds)""" - if self._client is not None: - self._client.timeout = timeout - if self._async_client is not None: - self._async_client.timeout = timeout - return evolve(self, timeout=timeout) - - def set_httpx_client(self, client: httpx.Client) -> "AuthenticatedClient": - """Manually the underlying httpx.Client - - **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. - """ - self._client = client - return self - - def get_httpx_client(self) -> httpx.Client: - """Get the underlying httpx.Client, constructing a new one if not previously set""" - if self._client is None: - self._headers[self.auth_header_name] = ( - f"{self.prefix} {self.token}" if self.prefix else self.token - ) - self._client = httpx.Client( - base_url=self._base_url, - cookies=self._cookies, - headers=self._headers, - timeout=self._timeout, - verify=self._verify_ssl, - follow_redirects=self._follow_redirects, - **self._httpx_args, - ) - return self._client - - def __enter__(self) -> "AuthenticatedClient": - """Enter a context manager for self.client—you cannot enter twice (see httpx docs)""" - self.get_httpx_client().__enter__() - return self - - def __exit__(self, *args: Any, **kwargs: Any) -> None: - """Exit a context manager for internal httpx.Client (see httpx docs)""" - self.get_httpx_client().__exit__(*args, **kwargs) - - def set_async_httpx_client( - self, async_client: httpx.AsyncClient - ) -> "AuthenticatedClient": - """Manually the underlying httpx.AsyncClient - - **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. - """ - self._async_client = async_client - return self - - def get_async_httpx_client(self) -> httpx.AsyncClient: - """Get the underlying httpx.AsyncClient, constructing a new one if not previously set""" - if self._async_client is None: - self._headers[self.auth_header_name] = ( - f"{self.prefix} {self.token}" if self.prefix else self.token - ) - self._async_client = httpx.AsyncClient( - base_url=self._base_url, - cookies=self._cookies, - headers=self._headers, - timeout=self._timeout, - verify=self._verify_ssl, - follow_redirects=self._follow_redirects, - **self._httpx_args, - ) - return self._async_client - - async def __aenter__(self) -> "AuthenticatedClient": - """Enter a context manager for underlying httpx.AsyncClient—you cannot enter twice (see httpx docs)""" - await self.get_async_httpx_client().__aenter__() - return self - - async def __aexit__(self, *args: Any, **kwargs: Any) -> None: - """Exit a context manager for underlying httpx.AsyncClient (see httpx docs)""" - await self.get_async_httpx_client().__aexit__(*args, **kwargs) diff --git a/python/e2b_code_interpreter/client/errors.py b/python/e2b_code_interpreter/client/errors.py deleted file mode 100644 index 5f92e76a..00000000 --- a/python/e2b_code_interpreter/client/errors.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Contains shared errors types that can be raised from API functions""" - - -class UnexpectedStatus(Exception): - """Raised by api functions when the response status an undocumented status and Client.raise_on_unexpected_status is True""" - - def __init__(self, status_code: int, content: bytes): - self.status_code = status_code - self.content = content - - super().__init__( - f"Unexpected status code: {status_code}\n\nResponse content:\n{content.decode(errors='ignore')}" - ) - - -__all__ = ["UnexpectedStatus"] diff --git a/python/e2b_code_interpreter/client/models/__init__.py b/python/e2b_code_interpreter/client/models/__init__.py deleted file mode 100644 index c1347e90..00000000 --- a/python/e2b_code_interpreter/client/models/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Contains all the data models used in inputs/outputs""" - -from .error import Error -from .execution import Execution -from .execution_request import ExecutionRequest -from .logs import Logs -from .result import Result -from .result_extra import ResultExtra -from .result_json import ResultJson - -__all__ = ( - "Error", - "Execution", - "ExecutionRequest", - "Logs", - "Result", - "ResultExtra", - "ResultJson", -) diff --git a/python/e2b_code_interpreter/client/models/error.py b/python/e2b_code_interpreter/client/models/error.py deleted file mode 100644 index ee629c02..00000000 --- a/python/e2b_code_interpreter/client/models/error.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar, Union, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="Error") - - -@_attrs_define -class Error: - """ - Attributes: - name (Union[Unset, str]): Name of the exception - value (Union[Unset, str]): Value of the exception - traceback_raw (Union[Unset, List[str]]): List of strings representing the traceback - code (Union[Unset, int]): Error code - message (Union[Unset, str]): Error - """ - - name: Union[Unset, str] = UNSET - value: Union[Unset, str] = UNSET - traceback_raw: Union[Unset, List[str]] = UNSET - code: Union[Unset, int] = UNSET - message: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - name = self.name - - value = self.value - - traceback_raw: Union[Unset, List[str]] = UNSET - if not isinstance(self.traceback_raw, Unset): - traceback_raw = self.traceback_raw - - code = self.code - - message = self.message - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if name is not UNSET: - field_dict["name"] = name - if value is not UNSET: - field_dict["value"] = value - if traceback_raw is not UNSET: - field_dict["traceback_raw"] = traceback_raw - if code is not UNSET: - field_dict["code"] = code - if message is not UNSET: - field_dict["message"] = message - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - name = d.pop("name", UNSET) - - value = d.pop("value", UNSET) - - traceback_raw = cast(List[str], d.pop("traceback_raw", UNSET)) - - code = d.pop("code", UNSET) - - message = d.pop("message", UNSET) - - error = cls( - name=name, - value=value, - traceback_raw=traceback_raw, - code=code, - message=message, - ) - - error.additional_properties = d - return error - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/execution.py b/python/e2b_code_interpreter/client/models/execution.py deleted file mode 100644 index 94295e67..00000000 --- a/python/e2b_code_interpreter/client/models/execution.py +++ /dev/null @@ -1,119 +0,0 @@ -from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -if TYPE_CHECKING: - from ..models.error import Error - from ..models.logs import Logs - from ..models.result import Result - - -T = TypeVar("T", bound="Execution") - - -@_attrs_define -class Execution: - """ - Attributes: - results (Union[Unset, List['Result']]): - logs (Union[Unset, Logs]): - error (Union[Unset, Error]): - execution_count (Union[Unset, int]): Execution count of the cell. - """ - - results: Union[Unset, List["Result"]] = UNSET - logs: Union[Unset, "Logs"] = UNSET - error: Union[Unset, "Error"] = UNSET - execution_count: Union[Unset, int] = UNSET - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - results: Union[Unset, List[Dict[str, Any]]] = UNSET - if not isinstance(self.results, Unset): - results = [] - for results_item_data in self.results: - results_item = results_item_data.to_dict() - results.append(results_item) - - logs: Union[Unset, Dict[str, Any]] = UNSET - if not isinstance(self.logs, Unset): - logs = self.logs.to_dict() - - error: Union[Unset, Dict[str, Any]] = UNSET - if not isinstance(self.error, Unset): - error = self.error.to_dict() - - execution_count = self.execution_count - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if results is not UNSET: - field_dict["results"] = results - if logs is not UNSET: - field_dict["logs"] = logs - if error is not UNSET: - field_dict["error"] = error - if execution_count is not UNSET: - field_dict["execution_count"] = execution_count - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - from ..models.error import Error - from ..models.logs import Logs - from ..models.result import Result - - d = src_dict.copy() - results = [] - _results = d.pop("results", UNSET) - for results_item_data in _results or []: - results_item = Result.from_dict(results_item_data) - - results.append(results_item) - - _logs = d.pop("logs", UNSET) - logs: Union[Unset, Logs] - if isinstance(_logs, Unset): - logs = UNSET - else: - logs = Logs.from_dict(_logs) - - _error = d.pop("error", UNSET) - error: Union[Unset, Error] - if isinstance(_error, Unset): - error = UNSET - else: - error = Error.from_dict(_error) - - execution_count = d.pop("execution_count", UNSET) - - execution = cls( - results=results, - logs=logs, - error=error, - execution_count=execution_count, - ) - - execution.additional_properties = d - return execution - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/execution_request.py b/python/e2b_code_interpreter/client/models/execution_request.py deleted file mode 100644 index b734edde..00000000 --- a/python/e2b_code_interpreter/client/models/execution_request.py +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar, Union - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="ExecutionRequest") - - -@_attrs_define -class ExecutionRequest: - """ - Attributes: - code (str): Code to be executed - language (Union[Unset, str]): Language of the code to be executed - """ - - code: str - language: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - code = self.code - - language = self.language - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "code": code, - } - ) - if language is not UNSET: - field_dict["language"] = language - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - code = d.pop("code") - - language = d.pop("language", UNSET) - - execution_request = cls( - code=code, - language=language, - ) - - execution_request.additional_properties = d - return execution_request - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/logs.py b/python/e2b_code_interpreter/client/models/logs.py deleted file mode 100644 index c7689a4c..00000000 --- a/python/e2b_code_interpreter/client/models/logs.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar, Union - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="Logs") - - -@_attrs_define -class Logs: - """ - Attributes: - stdout (Union[Unset, str]): - stderr (Union[Unset, str]): - """ - - stdout: Union[Unset, str] = UNSET - stderr: Union[Unset, str] = UNSET - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - stdout = self.stdout - - stderr = self.stderr - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if stdout is not UNSET: - field_dict["stdout"] = stdout - if stderr is not UNSET: - field_dict["stderr"] = stderr - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - stdout = d.pop("stdout", UNSET) - - stderr = d.pop("stderr", UNSET) - - logs = cls( - stdout=stdout, - stderr=stderr, - ) - - logs.additional_properties = d - return logs - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result.py b/python/e2b_code_interpreter/client/models/result.py deleted file mode 100644 index e0ed3315..00000000 --- a/python/e2b_code_interpreter/client/models/result.py +++ /dev/null @@ -1,179 +0,0 @@ -from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar, Union - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -if TYPE_CHECKING: - from ..models.result_extra import ResultExtra - from ..models.result_json import ResultJson - - -T = TypeVar("T", bound="Result") - - -@_attrs_define -class Result: - """ - Attributes: - text (Union[Unset, str]): Textual representation of the result - html (Union[Unset, str]): HTML representation of the result - markdown (Union[Unset, str]): Markdown representation of the result - svg (Union[Unset, str]): SVG representation of the result - png (Union[Unset, str]): PNG representation of the result - jpeg (Union[Unset, str]): JPEG representation of the result - pdf (Union[Unset, str]): PDF representation of the result - latex (Union[Unset, str]): LaTeX representation of the result - json (Union[Unset, ResultJson]): JSON representation of the result - javascript (Union[Unset, str]): JavaScript representation of the result - extra (Union[Unset, ResultExtra]): Extra representations of the result - is_main_result (Union[Unset, bool]): Whether this is the main result of the cell - """ - - text: Union[Unset, str] = UNSET - html: Union[Unset, str] = UNSET - markdown: Union[Unset, str] = UNSET - svg: Union[Unset, str] = UNSET - png: Union[Unset, str] = UNSET - jpeg: Union[Unset, str] = UNSET - pdf: Union[Unset, str] = UNSET - latex: Union[Unset, str] = UNSET - json: Union[Unset, "ResultJson"] = UNSET - javascript: Union[Unset, str] = UNSET - extra: Union[Unset, "ResultExtra"] = UNSET - is_main_result: Union[Unset, bool] = UNSET - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - text = self.text - - html = self.html - - markdown = self.markdown - - svg = self.svg - - png = self.png - - jpeg = self.jpeg - - pdf = self.pdf - - latex = self.latex - - json: Union[Unset, Dict[str, Any]] = UNSET - if not isinstance(self.json, Unset): - json = self.json.to_dict() - - javascript = self.javascript - - extra: Union[Unset, Dict[str, Any]] = UNSET - if not isinstance(self.extra, Unset): - extra = self.extra.to_dict() - - is_main_result = self.is_main_result - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if text is not UNSET: - field_dict["text"] = text - if html is not UNSET: - field_dict["html"] = html - if markdown is not UNSET: - field_dict["markdown"] = markdown - if svg is not UNSET: - field_dict["svg"] = svg - if png is not UNSET: - field_dict["png"] = png - if jpeg is not UNSET: - field_dict["jpeg"] = jpeg - if pdf is not UNSET: - field_dict["pdf"] = pdf - if latex is not UNSET: - field_dict["latex"] = latex - if json is not UNSET: - field_dict["json"] = json - if javascript is not UNSET: - field_dict["javascript"] = javascript - if extra is not UNSET: - field_dict["extra"] = extra - if is_main_result is not UNSET: - field_dict["is_main_result"] = is_main_result - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - from ..models.result_extra import ResultExtra - from ..models.result_json import ResultJson - - d = src_dict.copy() - text = d.pop("text", UNSET) - - html = d.pop("html", UNSET) - - markdown = d.pop("markdown", UNSET) - - svg = d.pop("svg", UNSET) - - png = d.pop("png", UNSET) - - jpeg = d.pop("jpeg", UNSET) - - pdf = d.pop("pdf", UNSET) - - latex = d.pop("latex", UNSET) - - _json = d.pop("json", UNSET) - json: Union[Unset, ResultJson] - if isinstance(_json, Unset): - json = UNSET - else: - json = ResultJson.from_dict(_json) - - javascript = d.pop("javascript", UNSET) - - _extra = d.pop("extra", UNSET) - extra: Union[Unset, ResultExtra] - if isinstance(_extra, Unset): - extra = UNSET - else: - extra = ResultExtra.from_dict(_extra) - - is_main_result = d.pop("is_main_result", UNSET) - - result = cls( - text=text, - html=html, - markdown=markdown, - svg=svg, - png=png, - jpeg=jpeg, - pdf=pdf, - latex=latex, - json=json, - javascript=javascript, - extra=extra, - is_main_result=is_main_result, - ) - - result.additional_properties = d - return result - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result_extra.py b/python/e2b_code_interpreter/client/models/result_extra.py deleted file mode 100644 index 35fa4ab7..00000000 --- a/python/e2b_code_interpreter/client/models/result_extra.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="ResultExtra") - - -@_attrs_define -class ResultExtra: - """Extra representations of the result""" - - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - result_extra = cls() - - result_extra.additional_properties = d - return result_extra - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/models/result_json.py b/python/e2b_code_interpreter/client/models/result_json.py deleted file mode 100644 index 4f9d6311..00000000 --- a/python/e2b_code_interpreter/client/models/result_json.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Any, Dict, List, Type, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="ResultJson") - - -@_attrs_define -class ResultJson: - """JSON representation of the result""" - - additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - - return field_dict - - @classmethod - def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: - d = src_dict.copy() - result_json = cls() - - result_json.additional_properties = d - return result_json - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/python/e2b_code_interpreter/client/types.py b/python/e2b_code_interpreter/client/types.py deleted file mode 100644 index 21fac106..00000000 --- a/python/e2b_code_interpreter/client/types.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Contains some shared types for properties""" - -from http import HTTPStatus -from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar - -from attrs import define - - -class Unset: - def __bool__(self) -> Literal[False]: - return False - - -UNSET: Unset = Unset() - -FileJsonType = Tuple[Optional[str], BinaryIO, Optional[str]] - - -@define -class File: - """Contains information for file uploads""" - - payload: BinaryIO - file_name: Optional[str] = None - mime_type: Optional[str] = None - - def to_tuple(self) -> FileJsonType: - """Return a tuple representation that httpx will accept for multipart/form-data""" - return self.file_name, self.payload, self.mime_type - - -T = TypeVar("T") - - -@define -class Response(Generic[T]): - """A response from an endpoint""" - - status_code: HTTPStatus - content: bytes - headers: MutableMapping[str, str] - parsed: Optional[T] - - -__all__ = ["File", "Response", "FileJsonType", "Unset", "UNSET"] diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index d676e0b3..36fa1ad9 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -1,8 +1,11 @@ from __future__ import annotations +import json import logging from typing import Optional, Dict + +import requests from e2b import Sandbox @@ -10,13 +13,6 @@ from e2b_code_interpreter.models import Execution, Result, Logs, Error -from e2b_code_interpreter.client.client import Client -from e2b_code_interpreter.client.models import ExecutionRequest - -from e2b_code_interpreter.client.api.default.post_execute import ( - sync_detailed as post_execute, -) - logger = logging.getLogger(__name__) @@ -68,29 +64,45 @@ def exec_code( f"Executing code {code} for language {language} (Sandbox: {self.sandbox_id})" ) - client = Client(base_url=f"https://{self.get_host(8000)}") - with client as client: - execution = post_execute(client=client, body=ExecutionRequest(code=code)) - - execution = execution.parsed - if not execution: - raise Exception("Failed to execute code") - - logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") - - return Execution( - results=( - [Result(**result.to_dict()) for result in execution.results] - if execution.results - else None - ), - logs=( - Logs( - stdout=execution.logs.stdout or None, - stderr=execution.logs.stderr or None, - ) - if execution.logs - else Logs() - ), - error=(Error(**execution.error.to_dict()) if execution.error else None), - ) + execution = Execution() + # with requests.get(f"https://{self.get_host(8000)}/execution", stream=True) as r: + with requests.get(f"http://localhost:8000/execution", stream=True) as r: + print(r) + for line in r.iter_lines(): + data = json.loads(line.decode("utf-8")) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + elif data_type == "stdout": + execution.logs.stdout += data["value"] + elif data_type == "stderr": + execution.logs.stderr += data["value"] + elif data_type == "error": + execution.error = Error(**data) + + print("Done") + return execution + + # if not execution: + # raise Exception("Failed to execute code") + # + # logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") + # + # return Execution( + # results=( + # [Result(**result.to_dict()) for result in execution.results] + # if execution.results + # else None + # ), + # logs=( + # Logs( + # stdout=execution.logs.stdout or None, + # stderr=execution.logs.stderr or None, + # ) + # if execution.logs + # else Logs() + # ), + # error=(Error(**execution.error.to_dict()) if execution.error else None), + # ) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index f01710f6..7aa0c992 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -231,8 +231,8 @@ class Logs: def __init__( self, stdout: Optional[List[str]] = None, stderr: Optional[List[str]] = None ): - self.stdout = stdout - self.stderr = stderr + self.stdout = stdout or [] + self.stderr = stderr or [] def __repr__(self): return f"Logs(stdout: {self.stdout}, stderr: {self.stderr})" diff --git a/python/example.py b/python/example.py index 28ccf43f..59da4a3d 100644 --- a/python/example.py +++ b/python/example.py @@ -23,9 +23,9 @@ pandas.DataFrame({"a": [1, 2, 3]}) """ -with CodeInterpreter() as sandbox: - print(sandbox.sandbox_id) - execution = sandbox.exec_code(code) +sandbox = CodeInterpreter() +print(sandbox.sandbox_id) +execution = sandbox.exec_code(code) print(execution.results[0].formats()) print(len(execution.results)) diff --git a/template/server/api/models/error.py b/template/server/api/models/error.py deleted file mode 100644 index 7f3fa279..00000000 --- a/template/server/api/models/error.py +++ /dev/null @@ -1,118 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictInt, StrictStr -from pydantic import Field - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class Error(BaseModel): - """ - Error - """ # noqa: E501 - - name: Optional[StrictStr] = Field(default=None, description="Name of the exception") - value: Optional[StrictStr] = Field( - default=None, description="Value of the exception" - ) - traceback_raw: Optional[List[StrictStr]] = Field( - default=None, description="List of strings representing the traceback" - ) - code: Optional[StrictInt] = Field(default=None, description="Error code") - message: Optional[StrictStr] = Field(default=None, description="Error") - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = [ - "name", - "value", - "traceback_raw", - "code", - "message", - ] - - model_config = {"populate_by_name": True, "validate_assignment": True} - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Error from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - - return _dict - - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Error from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "name": obj.get("name"), - "value": obj.get("value"), - "traceback_raw": obj.get("traceback_raw"), - "code": obj.get("code"), - "message": obj.get("message"), - } - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - - return _obj diff --git a/template/server/api/models/execution.py b/template/server/api/models/execution.py deleted file mode 100644 index 06b34eae..00000000 --- a/template/server/api/models/execution.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictInt -from pydantic import Field -from api.models.error import Error -from api.models.logs import Logs -from api.models.result import Result - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class Execution(BaseModel): - """ - Execution - """ # noqa: E501 - - results: Optional[List[Result]] = None - logs: Optional[Logs] = None - error: Optional[Error] = None - execution_count: Optional[StrictInt] = Field( - default=None, description="Execution count of the cell." - ) - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["results", "logs", "error", "execution_count"] - - model_config = { - "populate_by_name": True, - "validate_assignment": True, - "arbitrary_types_allowed": True, - } - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Execution from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in results (list) - _items = [] - if self.results: - for _item in self.results: - if _item: - _items.append(_item.to_dict()) - _dict["results"] = _items - # override the default output from pydantic by calling `to_dict()` of logs - if self.logs: - _dict["logs"] = self.logs.to_dict() - # override the default output from pydantic by calling `to_dict()` of error - if self.error: - _dict["error"] = self.error.to_dict() - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - - return _dict - - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Execution from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - { - "results": ( - [Result.from_dict(_item) for _item in obj.get("results")] - if obj.get("results") is not None - else None - ), - "logs": ( - Logs.from_dict(obj.get("logs")) - if obj.get("logs") is not None - else None - ), - "error": ( - Error.from_dict(obj.get("error")) - if obj.get("error") is not None - else None - ), - "execution_count": obj.get("execution_count"), - } - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - - return _obj diff --git a/template/server/api/models/logs.py b/template/server/api/models/logs.py deleted file mode 100644 index e91a91b2..00000000 --- a/template/server/api/models/logs.py +++ /dev/null @@ -1,98 +0,0 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional -from pydantic import BaseModel, StrictStr - -try: - from typing import Self -except ImportError: - from typing_extensions import Self - - -class Logs(BaseModel): - """ - Logs - """ # noqa: E501 - - stdout: Optional[StrictStr] = None - stderr: Optional[StrictStr] = None - additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["stdout", "stderr"] - - model_config = {"populate_by_name": True, "validate_assignment": True} - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of Logs from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - - return _dict - - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of Logs from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - {"stdout": obj.get("stdout"), "stderr": obj.get("stderr")} - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - - return _obj diff --git a/template/server/api/models/result.py b/template/server/api/models/output.py similarity index 53% rename from template/server/api/models/result.py rename to template/server/api/models/output.py index 3bf309da..c0b81796 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/output.py @@ -1,7 +1,7 @@ from __future__ import annotations - -from typing import Optional +from enum import Enum +from typing import Optional, Dict from pydantic import BaseModel try: @@ -10,17 +10,20 @@ from typing_extensions import Self -class Result(BaseModel): +class OutputType(Enum): + """ + Represents the type of the data to send to the client. """ - Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. - The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented - as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, - for the actual result the representation is always present for the result, the other representations are always optional. + STDOUT = "stdout" + STDERR = "stderr" + RESULT = "result" + ERROR = "error" + END_OF_EXECUTION = "end_of_execution" - The class also provides methods to display the data in a Jupyter notebook. - """ + +class Output(BaseModel): + type: OutputType text: Optional[str] = None html: Optional[str] = None @@ -33,13 +36,19 @@ class Result(BaseModel): json: Optional[dict] = None javascript: Optional[str] = None extra: Optional[dict] = None - "Extra data that can be included. Not part of the standard types." - is_main_result: Optional[bool] = None - "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." - def __init__(self, is_main_result: bool, data: [str, str]): + stdout: Optional[str] = None + stderr: Optional[str] = None + + name: Optional[str] = None + value: Optional[str] = None + traceback: Optional[str] = None + + def __init__(self, type: OutputType, data: Dict[str, str] = None, is_main_result:Optional[bool] = None): super().__init__() + self.type = type + self.is_main_result = is_main_result self.text = data.pop("text/plain", None) @@ -52,6 +61,13 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.latex = data.pop("text/latex", None) self.json = data.pop("application/json", None) self.javascript = data.pop("application/javascript", None) + + self.name = data.pop("ename", None) + self.value = data.pop("evalue", None) or data.pop("text", None) + self.traceback = data.pop("traceback", None) + if self.traceback: + self.traceback = "\n".join(self.traceback) + self.extra = data def __str__(self) -> Optional[str]: @@ -63,4 +79,11 @@ def __str__(self) -> Optional[str]: return self.text def __repr__(self) -> str: - return f"Result({self.text})" + if self.type == OutputType.RESULT: + return f"Result({self.text})" + elif self.type == OutputType.ERROR: + return f"Error({self.name}, {self.value}, {self.traceback})" + elif self.type == OutputType.STDOUT: + return f"Stdout({self.stdout})" + elif self.type == OutputType.STDERR: + return f"Stderr({self.stderr})" diff --git a/template/server/main.py b/template/server/main.py index 898710cc..2d642510 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -7,8 +7,9 @@ from fastapi import FastAPI from messaging import JupyterKernelWebSocket -from api.models.execution import Execution +from api.models.output import Output from api.models.execution_request import ExecutionRequest +from stream import StreamingJsonListResponse logger = logging.Logger(__name__) logger.setLevel(logging.DEBUG) @@ -53,12 +54,10 @@ def health(): return "Request was successful" -@app.post("/execute", response_model=Execution, response_model_exclude_none=True) -async def execute(request: ExecutionRequest) -> Execution: +@app.post("/execute", response_model=Output, response_model_exclude_none=True) +async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") ws = websockets["default"] - execution = await ws.execute(code=request.code) - logger.info(f"Execution result: {execution}") - return execution + return StreamingJsonListResponse(ws.execute(code=request.code)) diff --git a/template/server/messaging.py b/template/server/messaging.py index daa27b1d..ab05a0dd 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -1,17 +1,14 @@ import json import logging -import threading import uuid import asyncio import random -from asyncio import Future +from asyncio import Future, Queue -from typing import Callable, Dict, Any, Optional, AsyncIterator, List +from typing import Callable, Dict, Any, AsyncIterator, List, AsyncIterable -from api.models.error import Error -from api.models.execution import Execution -from api.models.result import Result +from api.models.output import Output, OutputType from websockets.legacy.client import WebSocketClientProtocol, Connect from websockets.exceptions import ConnectionClosed @@ -21,45 +18,10 @@ logger = logging.getLogger(__name__) -class CellMessage: - """ - A message from a process. - """ - - line: str - error: bool = False - timestamp: int - """ - Unix epoch in nanoseconds - """ - - def __str__(self): - return self.line - - -class CellExecution: - """ - Represents the execution of a cell in the Jupyter kernel. - It's an internal class used by JupyterKernelWebSocket. - """ - - input_accepted: bool = False - - on_stdout: Optional[Callable[[str], Any]] = None - on_stderr: Optional[Callable[[str], Any]] = None - on_result: Optional[Callable[[Result], Any]] = None - - def __init__( - self, - on_stdout: Optional[Callable[[str], Any]] = None, - on_stderr: Optional[Callable[[str], Any]] = None, - on_result: Optional[Callable[[Result], Any]] = None, - ): - self.partial_result = Execution(results=[]) - self.execution = Future() - self.on_stdout = on_stdout - self.on_stderr = on_stderr - self.on_result = on_result +class Execution: + def __init__(self): + self.queue = Queue() + self.input_accepted = False class JupyterKernelWebSocket: @@ -68,7 +30,7 @@ class JupyterKernelWebSocket: def __init__(self, url: str, session_id: str): self.url = url self.session_id = session_id - self._cells: Dict[str, CellExecution] = {} + self._executions: Dict[str, Execution] = {} self._process_cleanup: List[Callable[[], Any]] = [] self._waiting_for_replies: Dict[str, Future] = {} self._stopped = Future() @@ -135,22 +97,25 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: } ) - async def execute(self, code: str, timeout: int = TIMEOUT) -> Execution: + async def execute(self, code: str) -> AsyncIterable[Output]: message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") - self._cells[message_id] = CellExecution() + self._executions[message_id] = Execution() request = self._get_execute_request(message_id, code) await self._ws.send(request) - result = await asyncio.wait_for( - self._cells[message_id].execution, timeout=timeout - ) - logger.debug(f"Got result for code ({message_id})") + queue = self._executions[message_id].queue + while True: + output = await queue.get() + if output.type == "end_of_execution": + break + + logger.debug(f"Got result for code ({message_id}): {output}") + yield output - del self._cells[message_id] - return result + del self._executions[message_id] async def _receive_message(self): try: @@ -159,11 +124,11 @@ async def _receive_message(self): return async for message in self._ws: logger.debug(f"WebSocket received message: {message}".strip()) - self._process_message(json.loads(message)) + await self._process_message(json.loads(message)) except Exception as e: logger.error(f"WebSocket received error while receiving messages: {e}") - def _process_message(self, data: dict): + async def _process_message(self, data: dict): """ Process messages from the WebSocket @@ -180,71 +145,48 @@ def _process_message(self, data: dict): logger.debug(f"Received message {data['msg_type']} for {parent_msg_ig}") - cell = self._cells.get(parent_msg_ig) - if not cell: + execution = self._executions.get(parent_msg_ig) + if not execution: return - execution = cell.partial_result - + queue = execution.queue if data["msg_type"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - execution.error = Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback_raw=data["content"]["traceback"], - ) + await queue.put(Output(data=data["content"], type=OutputType.ERROR)) elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": - execution.logs.stdout.append(data["content"]["text"]) - if cell.on_stdout: - cell.on_stdout(data["content"]["text"]) + await queue.put(Output(data=data['content'], type=OutputType.STDOUT)) elif data["content"]["name"] == "stderr": - execution.logs.stderr.append(data["content"]["text"]) - if cell.on_stderr: - cell.on_stderr(data["content"]["text"]) + await queue.put(Output(data=data['content'], type=OutputType.STDERR)) elif data["msg_type"] in "display_data": - result = Result(is_main_result=False, data=data["content"]["data"]) - execution.results.append(result) - if cell.on_result: - cell.on_result(result) + await queue.put(Output(is_main_result=False, data=data["content"]["data"], type=OutputType.RESULT)) elif data["msg_type"] == "execute_result": - result = Result(is_main_result=True, data=data["content"]["data"]) - execution.results.append(result) - if cell.on_result: - cell.on_result(result) + await queue.put(Output(is_main_result=True, data=data["content"]["data"], type=OutputType.RESULT)) elif data["msg_type"] == "status": if data["content"]["execution_state"] == "idle": - if cell.input_accepted: + if execution.input_accepted: logger.debug(f"Cell {parent_msg_ig} finished execution") - cell.execution.set_result(execution) + await queue.put(Output(type=OutputType.END_OF_EXECUTION)) elif data["content"]["execution_state"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - execution.error = Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback_raw=data["content"]["traceback"], - ) - cell.execution.set_result(execution) + await queue.put(Output(data=data["content"], type=OutputType.ERROR)) + await queue.put(Output(type=OutputType.END_OF_EXECUTION)) elif data["msg_type"] == "execute_reply": if data["content"]["status"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - execution.error = Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback_raw=data["content"]["traceback"], - ) + await queue.put(Output(data=data["content"], type=OutputType.ERROR)) elif data["content"]["status"] == "ok": pass elif data["msg_type"] == "execute_input": logger.debug(f"Input accepted for {parent_msg_ig}") - cell.partial_result.execution_count = data["content"]["execution_count"] - cell.input_accepted = True + # execution.partial_result.execution_count = data["content"]["execution_count"] + execution.input_accepted = True else: logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") diff --git a/template/server/stream.py b/template/server/stream.py new file mode 100644 index 00000000..2287a1d6 --- /dev/null +++ b/template/server/stream.py @@ -0,0 +1,67 @@ +import json +from typing import Iterable, Mapping, Optional, AsyncIterable, Union + +from fastapi.encoders import jsonable_encoder +from starlette.background import BackgroundTask +from fastapi.responses import StreamingResponse + + +async def async_enumerate(async_sequence: AsyncIterable, start=0): + """Asynchronously enumerate an async iterator from a given start value. + + See https://stackoverflow.com/a/55930068/9639441 + """ + idx = start + async for element in async_sequence: + yield idx, element + idx += 1 + + +class StreamingJsonListResponse(StreamingResponse): + """Converts a pydantic model generator into a streaming HTTP Response + that streams a JSON list, one element at a time. + + See https://github.com/tiangolo/fastapi/issues/1978 + """ + + def __init__( + self, + content_generator: Union[Iterable, AsyncIterable], + status_code: int = 200, + headers: Optional[Mapping[str, str]] = None, + media_type: Optional[str] = None, + background: Optional[BackgroundTask] = None, + ) -> None: + if isinstance(content_generator, AsyncIterable): + body_iterator = self._encoded_async_generator(content_generator) + else: + body_iterator = self._encoded_generator(content_generator) + super().__init__( + content=body_iterator, + status_code=status_code, + headers=headers, + media_type=media_type, + background=background, + ) + + async def _encoded_async_generator(self, async_generator: AsyncIterable): + """Converts an asynchronous pydantic model generator + into a streaming JSON list + """ + yield "[" + async for idx, item in async_enumerate(async_generator): + if idx > 0: + yield "," + yield json.dumps(jsonable_encoder(item.dict())) + yield "]" + + async def _encoded_generator(self, generator): + """Converts a synchronous pydantic model generator + into a streaming JSON list + """ + yield "[" + for idx, item in enumerate(generator): + if idx > 0: + yield "," + yield json.dumps(jsonable_encoder(item.dict())) + yield "]" From 9fbbe7af1133d06c8577a436f66611053af31cbf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 9 Jul 2024 22:09:55 +0200 Subject: [PATCH 085/722] Fix requests --- python/e2b_code_interpreter/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py index 36fa1ad9..3373536d 100644 --- a/python/e2b_code_interpreter/main.py +++ b/python/e2b_code_interpreter/main.py @@ -65,9 +65,9 @@ def exec_code( ) execution = Execution() - # with requests.get(f"https://{self.get_host(8000)}/execution", stream=True) as r: - with requests.get(f"http://localhost:8000/execution", stream=True) as r: - print(r) + with requests.post(f"http://localhost:8000/execute", stream=True) as r: + # with requests.post(f"https://{self.get_host(8000)}/execute", stream=True) as r: + print(r.text) for line in r.iter_lines(): data = json.loads(line.decode("utf-8")) data_type = data.pop("type") From 0a4628ca05ec8ea07a37ccd343a6da03ce35275b Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 16:34:55 -0700 Subject: [PATCH 086/722] Update core SDK --- python/poetry.lock | 332 ++++++++++++++++++++++-------------------- python/pyproject.toml | 2 +- 2 files changed, 176 insertions(+), 158 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 8d9b31b1..173b9992 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,26 +1,14 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. -[[package]] -name = "aenum" -version = "3.1.15" -description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" -optional = false -python-versions = "*" -files = [ - {file = "aenum-3.1.15-py2-none-any.whl", hash = "sha256:27b1710b9d084de6e2e695dab78fe9f269de924b51ae2850170ee7e1ca6288a5"}, - {file = "aenum-3.1.15-py3-none-any.whl", hash = "sha256:e0dfaeea4c2bd362144b87377e2c61d91958c5ed0b4daf89cb6f45ae23af6288"}, - {file = "aenum-3.1.15.tar.gz", hash = "sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"}, -] - [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [package.dependencies] @@ -48,35 +36,54 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + [[package]] name = "black" -version = "24.3.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, - {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, - {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, - {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, - {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, - {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, - {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, - {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, - {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, - {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, - {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, - {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, - {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, - {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, - {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, - {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, - {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, - {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, - {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, - {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, - {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, - {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -96,13 +103,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -231,34 +238,31 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a23" +version = "0.17.2a24" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a23-py3-none-any.whl", hash = "sha256:12e65f4f2c18c750c076f7bd22c24ed0b13ad0b59ecc9b99655990e7aeb7c93d"}, - {file = "e2b-0.17.2a23.tar.gz", hash = "sha256:948542564255d913da97a754765ea3ec1bf1482a897599ace9421e6857910cdd"}, + {file = "e2b-0.17.2a24-py3-none-any.whl", hash = "sha256:21fb9a34464bbd6c5c8eda0a7c4c402b4192095a53dec2ea6ef94bd76606f6d3"}, + {file = "e2b-0.17.2a24.tar.gz", hash = "sha256:79f38474b35c24e0eba6500b8c69c8ac265412725a2c8ec3417ffe9dcb95aa93"}, ] [package.dependencies] -aenum = ">=3.1.11" +attrs = ">=23.2.0,<24.0.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<0.28.0" -protobuf = ">=5.26.1,<6.0.0" -pydantic = "*" +protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" -typing-extensions = ">=4.8.0" -urllib3 = ">=1.25.3" [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -355,13 +359,13 @@ files = [ [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -377,28 +381,29 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -427,109 +432,122 @@ files = [ [[package]] name = "pydantic" -version = "2.6.4" +version = "2.8.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, - {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.16.3" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.3" -description = "" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, - {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, - {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, - {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, - {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, - {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, - {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, - {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, - {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, - {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, - {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, - {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, - {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, - {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -656,13 +674,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -684,17 +702,17 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "websocket-client" -version = "1.7.0" +version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" files = [ - {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, - {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -782,4 +800,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "ff4c6f3e9666ec83df741787901a2ea856e1dce0f046a3f011e7feb9e2cff46c" +content-hash = "e58facf825573af65bb75a1165e4534e4b2cd7bc6b5b4acaec9f92e44c71fa32" diff --git a/python/pyproject.toml b/python/pyproject.toml index 2416210e..9aef5d24 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a23" +e2b = "0.17.2a24" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From d8112ceeeedc124b6e322c8829541ceca11ef1b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 9 Jul 2024 23:35:43 +0000 Subject: [PATCH 087/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 66b38fc3..35f56e21 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.2", + "version": "0.0.9-beta.3", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9aef5d24..0504f63b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a2" +version = "0.0.11a3" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 38bf6c249dfbe087af8528b0d18b720f4007259c Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 19:19:00 -0700 Subject: [PATCH 088/722] Update core --- js/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 35f56e21..1fb6021d 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.15", + "e2b": "0.16.2-beta.17", "isomorphic-ws": "^5.0.0", "ws": "^8.17.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d315a7c8..2ddc608a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.15 - version: 0.16.2-beta.15 + specifier: 0.16.2-beta.17 + version: 0.16.2-beta.17 isomorphic-ws: specifier: ^5.0.0 version: 5.0.0(ws@8.17.1) @@ -2015,8 +2015,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.15: - resolution: {integrity: sha512-b4ZNnNvQI8HGJ6N3Yr90FaSiRN5hae9yY6LIDMAIRpjj2hRcaQ4iaAK1DqXOWwhiZphcPrlTWmoU/17cXxNztw==} + /e2b@0.16.2-beta.17: + resolution: {integrity: sha512-8CiHIC4OBPDXnIqTezpEIOpUX56rryx0MDyQSto0MpL3ywBI3Lva4UH6GcSWIB5sCg6bNaNAuvNfOOfz+TjP3g==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 diff --git a/python/poetry.lock b/python/poetry.lock index 173b9992..79bca894 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -238,13 +238,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a24" +version = "0.17.2a25" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a24-py3-none-any.whl", hash = "sha256:21fb9a34464bbd6c5c8eda0a7c4c402b4192095a53dec2ea6ef94bd76606f6d3"}, - {file = "e2b-0.17.2a24.tar.gz", hash = "sha256:79f38474b35c24e0eba6500b8c69c8ac265412725a2c8ec3417ffe9dcb95aa93"}, + {file = "e2b-0.17.2a25-py3-none-any.whl", hash = "sha256:7721782f785d899c94357cd2c9bea1585fe97860e632ca506a67d50371f8761a"}, + {file = "e2b-0.17.2a25.tar.gz", hash = "sha256:8ca8828285cb9d1e497b90f89435f24c124eee9d84479723606d909bad8d606b"}, ] [package.dependencies] @@ -800,4 +800,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e58facf825573af65bb75a1165e4534e4b2cd7bc6b5b4acaec9f92e44c71fa32" +content-hash = "7a3b60ff1bd87d4b468d98104cd0863a15451dedd16e3a0023f9d55d0645a395" diff --git a/python/pyproject.toml b/python/pyproject.toml index 0504f63b..461f391d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,7 +15,7 @@ python = "^3.8" pydantic = "*" websocket-client = "^1.7.0" websockets = "^12.0" -e2b = "0.17.2a24" +e2b = "0.17.2a25" requests = "^2.32.3" [tool.poetry.group.dev.dependencies] From e84824cea900dccbc0ebf62d93d566b84ae83060 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 22:41:28 -0700 Subject: [PATCH 089/722] Fix local docker port mapping --- template/start-up.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/template/start-up.sh b/template/start-up.sh index e494ac1c..139818af 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -4,11 +4,11 @@ function start_jupyter_server() { counter=0 response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") while [[ ${response} -ne 200 ]]; do - let counter++ - if (( counter % 20 == 0 )); then - echo "Waiting for Jupyter Server to start..." - sleep 0.1 - fi + let counter++ + if ((counter % 20 == 0)); then + echo "Waiting for Jupyter Server to start..." + sleep 0.1 + fi response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done @@ -21,14 +21,14 @@ function start_jupyter_server() { fi sudo mkdir -p /root/.jupyter - kernel_id=$(echo "${response}" | jq -r '.kernel.id') + kernel_id=$(echo "${response}" | jq -r '.kernel.id') sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null cd /root/.server/ - uvicorn main:app --port 8000 --workers 2 --no-access-log --no-use-colors + uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 --no-access-log --no-use-colors } echo "Starting Code Interpreter server..." start_jupyter_server & -jupyter server --IdentityProvider.token="" > /dev/null 2>&1 +jupyter server --IdentityProvider.token="" >/dev/null 2>&1 From 76cd9d8d37d5c7f8d5e44912144bf22e3bb0ea26 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 22:50:36 -0700 Subject: [PATCH 090/722] [WIP] Add async CI; Update interfaces; Handle timeout --- js/example.mts | 38 ++ js/package.json | 16 +- js/src/codeInterpreter.ts | 361 ++++--------- js/src/messaging.ts | 245 --------- js/src/utils.ts | 27 - js/vitest.config.ts | 2 +- pnpm-lock.yaml | 498 ++++-------------- python/e2b_code_interpreter/__init__.py | 4 +- .../code_interpreter_async.py | 106 ++++ .../code_interpreter_sync.py | 119 +++++ python/e2b_code_interpreter/constants.py | 3 +- python/e2b_code_interpreter/main.py | 108 ---- python/example.py | 10 +- python/poetry.lock | 236 +-------- python/pyproject.toml | 4 - python/tests/benchmarking.py | 2 +- python/tests/test_bash.py | 2 +- python/tests/test_basic.py | 2 +- python/tests/test_display_data.py | 2 +- python/tests/test_execution_count.py | 2 +- python/tests/test_kernels.py | 2 +- python/tests/test_reconnect.py | 2 +- python/tests/test_statefulness.py | 2 +- python/tests/test_streaming.py | 2 +- 24 files changed, 517 insertions(+), 1278 deletions(-) delete mode 100644 js/src/utils.ts create mode 100644 python/e2b_code_interpreter/code_interpreter_async.py create mode 100644 python/e2b_code_interpreter/code_interpreter_sync.py delete mode 100644 python/e2b_code_interpreter/main.py diff --git a/js/example.mts b/js/example.mts index e69de29b..c82fc0eb 100644 --- a/js/example.mts +++ b/js/example.mts @@ -0,0 +1,38 @@ +import dotenv from 'dotenv' + +import { CodeInterpreter } from './dist' + +dotenv.config() + +const code = ` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(0, 20, 100) +y = np.sin(x) + +plt.plot(x, y) +plt.show() + +x = np.linspace(0, 10, 100) + +plt.plot(x, y) +plt.show() + +import pandas +pandas.DataFrame({"a": [1, 2, 3]}) +` + +const sandbox = await CodeInterpreter.connect("", { debug: true }) +console.log(sandbox.sandboxID) + +const execution = await sandbox.notebook.execCell(code, { + onStdout(msg) { + console.log('stdout', msg) + }, + onStderr(msg) { + console.log('stderr', msg) + }, +}) +console.log(execution.results[0].formats()) +console.log(execution.results.length) diff --git a/js/package.json b/js/package.json index 1fb6021d..5a9afd80 100644 --- a/js/package.json +++ b/js/package.json @@ -36,11 +36,11 @@ "@types/node": "^18.18.6", "@types/ws": "^8.5.10", "dotenv": "^16.4.5", - "knip": "^5.23.2", + "knip": "^5.25.1", "npm-check-updates": "^16.14.20", "tsup": "^8.1.0", - "typescript": "^5.5.2", - "vitest": "^1.6.0" + "typescript": "^5.5.3", + "vitest": "^2.0.1" }, "files": [ "dist", @@ -61,13 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.17", - "isomorphic-ws": "^5.0.0", - "ws": "^8.17.1" - }, - "optionalDependencies": { - "bufferutil": "^4.0.8", - "utf-8-validate": "^6.0.4" + "e2b": "0.16.2-beta.17" }, "engines": { "node": ">=18" @@ -75,4 +69,4 @@ "browserslist": [ "defaults" ] -} +} \ No newline at end of file diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 00470815..165c450f 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,275 +1,140 @@ -import { Sandbox } from 'e2b' +import { ConnectionConfig, Sandbox } from 'e2b' -import { Result, JupyterKernelWebSocket, Execution, CellMessage } from './messaging' -import { createDeferredPromise, id } from './utils' +import { Result, Execution, ExecutionError } from './messaging' -interface Kernels { - [kernelID: string]: JupyterKernelWebSocket -} - -/** - * E2B code interpreter sandbox extension. - */ -export class CodeInterpreter extends Sandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-stateful' +async function* readLines(stream: ReadableStream) { + const reader = stream.getReader(); + let buffer = '' - readonly notebook = new JupyterExtension(this) - - protected override async onInit(opts: { requestTimeoutMs?: number }) { - await this.notebook.connect(opts?.requestTimeoutMs) - } + try { + while (true) { + const { done, value } = await reader.read(); - async close() { - await this.notebook.close() - } + if (done) { + yield buffer + break + } - getProtocol(baseProtocol: string = 'http') { - return this.connectionConfig.debug ? baseProtocol : `${baseProtocol}s` + buffer += new TextDecoder().decode(value) + const newlineIdx = buffer.indexOf('\n') + if (newlineIdx !== -1) { + yield buffer.slice(0, newlineIdx) + buffer = buffer.slice(newlineIdx + 1) + } + } + } finally { + reader.releaseLock() } } export class JupyterExtension { - private readonly connectedKernels: Kernels = {} + private static readonly defaultTimeoutMs = 300_000 - private readonly kernelIDPromise = createDeferredPromise() - private readonly setDefaultKernelID = this.kernelIDPromise.resolve + constructor(private readonly url: string, private readonly connectionConfig: ConnectionConfig) { } - private get defaultKernelID() { - return this.kernelIDPromise.promise - } - - constructor(private sandbox: CodeInterpreter) { } - - async connect(requestTimeoutMs?: number) { - return this.startConnectingToDefaultKernel(this.setDefaultKernelID, { - requestTimeoutMs, - }) - } - - /** - * Executes a code cell in a notebool cell. - * - * This method sends the provided code to a specified kernel in a remote notebook for execution. - - * @param code The code to be executed in the notebook cell. - * @param kernelID The ID of the kernel to execute the code on. If not provided, the default kernel is used. - * @param onStdout A callback function to handle standard output messages from the code execution. - * @param onStderr A callback function to handle standard error messages from the code execution. - * @param onResult A callback function to handle display data messages from the code execution. - * @param timeoutMs The maximum time to wait for the code execution to complete, in milliseconds. - * @returns A promise that resolves with the result of the code execution. - */ async execCell( code: string, - { - kernelID, - onStdout, - onStderr, - onResult, - timeoutMs: timeout - }: { - kernelID?: string - onStdout?: (msg: CellMessage) => any - onStderr?: (msg: CellMessage) => any - onResult?: (data: Result) => any - timeoutMs?: number + opts: { + kernelID?: string, + language?: string, + onStdout?: (output: string) => (Promise | void), + onStderr?: (output: string) => (Promise | void), + onResult?: (data: Result) => (Promise | void), + timeoutMs?: number, + requestTimeoutMs?: number, } = {} ): Promise { - kernelID = kernelID || (await this.defaultKernelID) - const ws = - this.connectedKernels[kernelID] || - (await this.connectToKernelWS(kernelID)) - - return await ws.sendExecutionMessage( - code, - onStdout, - onStderr, - onResult, - timeout - ) - } - - private async startConnectingToDefaultKernel( - resolve: (value: string) => void, - opts?: { requestTimeoutMs?: number } - ) { - const kernelID = ( - await this.sandbox.files.read('/root/.jupyter/kernel_id', opts) - ).trim() - await this.connectToKernelWS(kernelID) - resolve(kernelID) - } - - /** - * Connects to a kernel's WebSocket. - * - * This method establishes a WebSocket connection to the specified kernel. It is used internally - * to facilitate real-time communication with the kernel, enabling operations such as executing - * code and receiving output. The connection details are managed within the method, including - * the retrieval of the necessary WebSocket URL from the kernel's information. - * - * @param kernelID The unique identifier of the kernel to connect to. - * @param sessionID The unique identifier of the session to connect to. - * @throws {Error} Throws an error if the connection to the kernel's WebSocket cannot be established. - */ - private async connectToKernelWS(kernelID: string, sessionID?: string) { - const url = `${this.sandbox.getProtocol('ws')}://${this.sandbox.getHost( - 8888 - )}/api/kernels/${kernelID}/channels` - - sessionID = sessionID || id(16) - const ws = new JupyterKernelWebSocket(url, sessionID) - await ws.connect() - this.connectedKernels[kernelID] = ws - - return ws - } - - /** - * Creates a new Jupyter kernel. It can be useful if you want to have multiple independent code execution environments. - * - * The kernel can be optionally configured to start in a specific working directory and/or - * with a specific kernel name. If no kernel name is provided, the default kernel will be used. - * Once the kernel is created, this method establishes a WebSocket connection to the new kernel for - * real-time communication. - * - * @param cwd Sets the current working directory where the kernel should start. Defaults to "/home/user". - * @param kernelName The name of the kernel to create, useful if you have multiple kernel types. If not provided, the default kernel will be used. - * @returns A promise that resolves with the ID of the newly created kernel. - * @throws {Error} Throws an error if the kernel creation fails. - */ - async createKernel( - cwd: string = '/home/user', - kernelName?: string - ): Promise { - kernelName = kernelName || 'python3' - - - const data = { path: id(16), kernel: { name: kernelName }, type: "notebook", name: id(16) } - - const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHost( - 8888 - )}/api/sessions`, - { - method: 'POST', - body: JSON.stringify(data) - } - ) - - if (!response.ok) { - throw new Error(`Failed to create kernel: ${response.statusText}`) - } - - - const sessionInfo = await response.json() - const kernelID = sessionInfo.kernel.id - const sessionID = sessionInfo.id - - const patchResponse = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHost( - 8888 - )}/api/sessions/${sessionID}`, - { - method: 'PATCH', - body: JSON.stringify({ path: cwd }) - } - ) + const controller = new AbortController() + + const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs + + const reqTimer = requestTimeout ? setTimeout(() => { + controller.abort() + }, requestTimeout) + : undefined + + const res = await fetch(`${this.url}/execute`, { + method: 'POST', + body: JSON.stringify({ + code, + // language: opts.language, + // kernel_id: opts.kernelID, + }), + keepalive: true, + }) - if (!patchResponse.ok) { - throw new Error(`Failed to create kernel: ${response.statusText}`) + if (!res.ok || !res.body) { + throw new Error(`Failed to execute code: ${res.statusText}`) } - - await this.connectToKernelWS(kernelID, sessionID) - - return kernelID - } - - /** - * Restarts an existing Jupyter kernel. This can be useful to reset the kernel's state or to recover from errors. - * - * @param kernelID The unique identifier of the kernel to restart. If not provided, the default kernel is restarted. - * @throws {Error} Throws an error if the kernel restart fails or if the operation times out. - */ - async restartKernel(kernelID?: string) { - kernelID = kernelID || (await this.defaultKernelID) - this.connectedKernels[kernelID].close() - delete this.connectedKernels[kernelID] - - const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHost( - 8888 - )}/api/kernels/${kernelID}/restart`, - { - method: 'POST' + clearTimeout(reqTimer) + + const bodyTimeout = opts.timeoutMs ?? JupyterExtension.defaultTimeoutMs + + const bodyTimer = bodyTimeout + ? setTimeout(() => { + controller.abort() + }, bodyTimeout) + : undefined + + const results: Result[] = [] + let stdout: string[] = [] + let stderr: string[] = [] + let error: ExecutionError | undefined = undefined + + try { + + for await (const chunk of readLines(res.body)) { + const msg = JSON.parse(chunk) + + switch (msg.type) { + case 'result': + const result = new Result(msg.data, true) + results.push(result) + if (opts.onResult) { + await opts.onResult(result) + } + break + case 'stdout': + stdout.push(msg.value) + if (opts.onStdout) { + await opts.onStdout(msg.value) + } + break + case 'stderr': + stderr.push(msg.value) + if (opts.onStderr) { + await opts.onStderr(msg.value) + } + break + case 'error': + error = new ExecutionError(msg.name, msg.value, msg.traceback) + break + default: + console.warn(`Unhandled message type: ${msg.type}`) + } } - ) - - if (!response.ok) { - throw new Error(`Failed to restart kernel ${kernelID}`) + } finally { + clearTimeout(bodyTimer) } - await this.connectToKernelWS(kernelID) - } - - /** - * Shuts down an existing Jupyter kernel. This method is used to gracefully terminate a kernel's process. - - * @param kernelID The unique identifier of the kernel to shutdown. If not provided, the default kernel is shutdown. - * @throws {Error} Throws an error if the kernel shutdown fails or if the operation times out. - */ - async shutdownKernel(kernelID?: string) { - kernelID = kernelID || (await this.defaultKernelID) - this.connectedKernels[kernelID].close() - delete this.connectedKernels[kernelID] - - const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHost( - 8888 - )}/api/kernels/${kernelID}`, + return new Execution( + results, { - method: 'DELETE' - } + stdout, + stderr, + }, + error, ) - - if (!response.ok) { - throw new Error(`Failed to shutdown kernel ${kernelID}`) - } } +} - /** - * Lists all available Jupyter kernels. - * - * This method fetches a list of all currently available Jupyter kernels from the server. It can be used - * to retrieve the IDs of all kernels that are currently running or available for connection. - * - * @returns A promise that resolves to an array of kernel IDs. - * @throws {Error} Throws an error if the request to list kernels fails. - */ - async listKernels(): Promise { - const response = await fetch( - `${this.sandbox.getProtocol()}://${this.sandbox.getHost( - 8888 - )}/api/kernels`, - { - method: 'GET' - } - ) - - if (!response.ok) { - throw new Error(`Failed to list kernels: ${response.statusText}`) - } - - return (await response.json()).map((kernel: { id: string }) => kernel.id) - } +export class CodeInterpreter extends Sandbox { + protected static override readonly defaultTemplate: string = 'ci-no-ws' + protected static readonly jupyterPort = 8000 - /** - * Close all the websocket connections to the kernels. It doesn't shutdown the kernels. - */ - async close() { - for (const kernelID of Object.keys(this.connectedKernels)) { - this.connectedKernels[kernelID].close() - } - } + readonly notebook = new JupyterExtension( + `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(CodeInterpreter.jupyterPort)}`, + this.connectionConfig, + ) } diff --git a/js/src/messaging.ts b/js/src/messaging.ts index ddce36f5..40397d83 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,6 +1,3 @@ -import IWebSocket from 'isomorphic-ws' -import { id } from './utils' - /** * A message from a process. */ @@ -301,245 +298,3 @@ class CellExecution { interface Cells { [id: string]: CellExecution } - -export class JupyterKernelWebSocket { - // native websocket - private _ws?: IWebSocket - - private set ws(ws: IWebSocket) { - this._ws = ws - } - - private get ws() { - if (!this._ws) { - throw new Error('WebSocket is not connected.') - } - return this._ws - } - - private idAwaiter: { - [id: string]: (data?: any) => void - } = {} - - private cells: Cells = {} - - // constructor - /** - * Does not start WebSocket connection! - * You need to call connect() method first. - */ - constructor(private readonly url: string, private readonly sessionID: string) { } - - // public - /** - * Starts WebSocket connection. - */ - connect() { - this._ws = new IWebSocket(this.url) - return this.listen() - } - - // events - /** - * Listens for messages from WebSocket server. - * - * Message types: - * https://jupyter-client.readthedocs.io/en/stable/messaging.html - * - */ - public listenMessages() { - this.ws.onmessage = (e: IWebSocket.MessageEvent) => { - const message = JSON.parse(e.data.toString()) - - const parentMsgId = message.parent_header.msg_id - if (parentMsgId == undefined) { - console.warn(`Parent message ID not found.\n Message: ${message}`) - return - } - - const cell = this.cells[parentMsgId] - if (!cell) { - return - } - - const execution = cell.execution - if (message.msg_type == 'error') { - execution.error = new ExecutionError( - message.content.ename, - message.content.evalue, - message.content.traceback - ) - } else if (message.msg_type == 'stream') { - if (message.content.name == 'stdout') { - execution.logs.stdout.push(message.content.text) - if (cell?.onStdout) { - cell.onStdout( - new CellMessage( - message.content.text, - new Date().getTime() * 1_000_000, - false - ) - ) - } - } else if (message.content.name == 'stderr') { - execution.logs.stderr.push(message.content.text) - if (cell?.onStderr) { - cell.onStderr( - new CellMessage( - message.content.text, - new Date().getTime() * 1_000_000, - true - ) - ) - } - } - } else if (message.msg_type == 'display_data') { - const result = new Result(message.content.data, false) - execution.results.push(result) - if (cell.onResult) { - cell.onResult(result) - } - } else if (message.msg_type == 'execute_result') { - const result = new Result(message.content.data, true) - execution.results.push(result) - if (cell.onResult) { - cell.onResult(result) - } - } else if (message.msg_type == 'status') { - if (message.content.execution_state == 'idle') { - if (cell.inputAccepted) { - this.idAwaiter[parentMsgId](execution) - } - } else if (message.content.execution_state == 'error') { - execution.error = new ExecutionError( - message.content.ename, - message.content.evalue, - message.content.traceback - ) - this.idAwaiter[parentMsgId](execution) - } - } else if (message.msg_type == 'execute_reply') { - if (message.content.status == 'error') { - execution.error = new ExecutionError( - message.content.ename, - message.content.evalue, - message.content.traceback - ) - } else if (message.content.status == 'ok') { - return - } - } else if (message.msg_type == 'execute_input') { - cell.inputAccepted = true - cell.execution.executionCount = message.content.execution_count - } else { - console.warn('[UNHANDLED MESSAGE TYPE]:', message.msg_type) - } - } - } - - // communication - /** - * Sends code to be executed by Jupyter kernel. - * @param code Code to be executed. - * @param onStdout Callback for stdout messages. - * @param onStderr Callback for stderr messages. - * @param onResult Callback function to handle the result and display calls of the code execution. - * @param timeoutMs Time in milliseconds to wait for response. - * @returns Promise with execution result. - */ - public sendExecutionMessage( - code: string, - onStdout?: (out: CellMessage) => any, - onStderr?: (out: CellMessage) => any, - onResult?: (data: Result) => any, - timeoutMs?: number - ) { - return new Promise((resolve, reject) => { - const msgID = id(16) - const data = this.sendExecuteRequest(msgID, code) - - // give limited time for response - let timeoutSet: number | NodeJS.Timeout - if (timeoutMs) { - timeoutSet = setTimeout(() => { - // stop waiting for response - delete this.idAwaiter[msgID] - reject( - new Error( - `Awaiting response to "${code}" with id: ${msgID} timed out.` - ) - ) - }, timeoutMs) - } - - // expect response - this.cells[msgID] = new CellExecution(onStdout, onStderr, onResult) - this.idAwaiter[msgID] = (responseData: Execution) => { - // stop timeout - clearInterval(timeoutSet as number) - // stop waiting for response - delete this.idAwaiter[msgID] - - resolve(responseData) - } - - const json = JSON.stringify(data) - this.ws.send(json) - }) - } - - /** - * Listens for messages from WebSocket server. - */ - private listen() { - return new Promise((resolve, reject) => { - this.ws.onopen = (e: unknown) => { - resolve(e) - } - - // listen for messages - this.listenMessages() - - this.ws.onclose = (e: IWebSocket.CloseEvent) => { - reject( - new Error( - `WebSocket closed with code: ${e.code} and reason: ${e.reason}` - ) - ) - } - }) - } - - /** - * Creates a websocket message for code execution. - * @param msg_id Unique message id. - * @param code Code to be executed. - */ - private sendExecuteRequest(msg_id: string, code: string) { - return { - header: { - msg_id: msg_id, - username: 'e2b', - session: this.sessionID, - msg_type: 'execute_request', - version: '5.3' - }, - parent_header: {}, - metadata: {}, - content: { - code: code, - silent: false, - store_history: true, - user_expressions: {}, - allow_stdin: false - } - } - } - - /** - * Closes WebSocket connection. - */ - close() { - this.ws.close() - } -} diff --git a/js/src/utils.ts b/js/src/utils.ts deleted file mode 100644 index 33a7982d..00000000 --- a/js/src/utils.ts +++ /dev/null @@ -1,27 +0,0 @@ -export function createDeferredPromise() { - let resolve: (value: T) => void - let reject: (reason?: unknown) => void - const promise = new Promise((res, rej) => { - resolve = res - reject = rej - }) - - return { - promise, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - reject: reject!, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - resolve: resolve! - } -} - -export function id(length: number) { - let result = '' - const characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' - const charactersLength = characters.length - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)) - } - return result -} diff --git a/js/vitest.config.ts b/js/vitest.config.ts index f5661934..d70ac6b0 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -25,4 +25,4 @@ export default defineConfig({ ...env.parsed, }, }, -}) +}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ddc608a..c80d52c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,19 +23,6 @@ importers: e2b: specifier: 0.16.2-beta.17 version: 0.16.2-beta.17 - isomorphic-ws: - specifier: ^5.0.0 - version: 5.0.0(ws@8.17.1) - ws: - specifier: ^8.17.1 - version: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) - optionalDependencies: - bufferutil: - specifier: ^4.0.8 - version: 4.0.8 - utf-8-validate: - specifier: ^6.0.4 - version: 6.0.4 devDependencies: '@types/node': specifier: ^18.18.6 @@ -47,25 +34,33 @@ importers: specifier: ^16.4.5 version: 16.4.5 knip: - specifier: ^5.23.2 - version: 5.23.2(@types/node@18.18.6)(typescript@5.5.2) + specifier: ^5.25.1 + version: 5.25.1(@types/node@18.18.6)(typescript@5.5.3) npm-check-updates: specifier: ^16.14.20 version: 16.14.20 tsup: specifier: ^8.1.0 - version: 8.1.0(typescript@5.5.2) + version: 8.1.0(typescript@5.5.3) typescript: - specifier: ^5.5.2 - version: 5.5.2 + specifier: ^5.5.3 + version: 5.5.3 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@18.18.6) + specifier: ^2.0.1 + version: 2.0.1(@types/node@18.18.6) python: {} packages: + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -356,29 +351,6 @@ packages: '@bufbuild/protobuf': 1.10.0 dev: false - /@ericcornelissen/bash-parser@0.5.3: - resolution: {integrity: sha512-9Z0sGuXqf6En19qmwB0Syi1Mc8TYl756dNuuaYal9mrypKa0Jq/IX6aJfh6Rk2S3z66KBisWTqloDo7weYj4zg==} - engines: {node: '>=4'} - dependencies: - array-last: 1.3.0 - babylon: 6.18.0 - compose-function: 3.0.3 - filter-obj: 1.1.0 - has-own-property: 0.1.0 - identity-function: 1.0.0 - is-iterable: 1.1.1 - iterable-lookahead: 1.0.0 - lodash.curry: 4.1.1 - magic-string: 0.16.0 - map-obj: 2.0.0 - object-pairs: 0.1.0 - object-values: 1.0.0 - reverse-arguments: 1.0.0 - shell-quote-word: 1.0.1 - to-pascal-case: 1.0.0 - unescape-js: 1.1.4 - dev: true - /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -874,24 +846,11 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.scandir@3.0.0: - resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} - engines: {node: '>=16.14.0'} - dependencies: - '@nodelib/fs.stat': 3.0.0 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.stat@3.0.0: - resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} - engines: {node: '>=16.14.0'} - dev: true - /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} @@ -900,14 +859,6 @@ packages: fastq: 1.17.1 dev: true - /@nodelib/fs.walk@2.0.0: - resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} - engines: {node: '>=16.14.0'} - dependencies: - '@nodelib/fs.scandir': 3.0.0 - fastq: 1.17.1 - dev: true - /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -1212,8 +1163,8 @@ packages: resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} dev: true - /@types/node@20.14.9: - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + /@types/node@20.14.10: + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} dependencies: undici-types: 5.26.5 dev: true @@ -1233,45 +1184,44 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 dev: true - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + /@vitest/expect@2.0.1: + resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 2.0.1 + '@vitest/utils': 2.0.1 + chai: 5.1.1 dev: true - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + /@vitest/runner@2.0.1: + resolution: {integrity: sha512-XfcSXOGGxgR2dQ466ZYqf0ZtDLLDx9mZeQcKjQDLQ9y6Cmk2Wl7wxMuhiYK4Fo1VxCtLcFEGW2XpcfMuiD1Maw==} dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + '@vitest/utils': 2.0.1 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + /@vitest/snapshot@2.0.1: + resolution: {integrity: sha512-rst79a4Q+J5vrvHRapdfK4BdqpMH0eF58jVY1vYeBo/1be+nkyenGI5SCSohmjf6MkCkI20/yo5oG+0R8qrAnA==} dependencies: - magic-string: 0.30.8 + magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + /@vitest/spy@2.0.1: + resolution: {integrity: sha512-NLkdxbSefAtJN56GtCNcB4GiHFb5i9q1uh4V229lrlTZt2fnwsTyjLuWIli1xwK2fQspJJmHXHyWx0Of3KTXWA==} dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 dev: true - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + /@vitest/utils@2.0.1: + resolution: {integrity: sha512-STH+2fHZxlveh1mpU4tKzNgRk7RZJyr6kFGJYCI5vocdfqfPsQrgVC6k7dBWHfin5QNB4TLvRS0Ckly3Dt1uWw==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 - loupe: 2.3.7 + loupe: 3.1.1 pretty-format: 29.7.0 dev: true @@ -1279,17 +1229,6 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1394,10 +1333,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /arity-n@1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - dev: true - /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1406,13 +1341,6 @@ packages: is-array-buffer: 3.0.4 dev: true - /array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 4.0.0 - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1447,8 +1375,9 @@ packages: engines: {node: '>=0.10.0'} dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /available-typed-arrays@1.0.7: @@ -1458,11 +1387,6 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1523,14 +1447,6 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.1 - dev: false - /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -1644,17 +1560,15 @@ packages: engines: {node: '>=14.16'} dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + /chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 dev: true /chalk@2.4.2: @@ -1690,10 +1604,9 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} dev: true /chokidar@3.6.0: @@ -1803,12 +1716,6 @@ packages: resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} dev: false - /compose-function@3.0.3: - resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} - dependencies: - arity-n: 1.0.4 - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1920,6 +1827,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -1940,11 +1859,9 @@ packages: mimic-response: 3.1.0 dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-extend@0.6.0: @@ -2337,11 +2254,6 @@ packages: to-regex-range: 5.0.1 dev: true - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true - /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2633,10 +2545,6 @@ packages: engines: {node: '>=8'} dev: true - /has-own-property@0.1.0: - resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} - dev: true - /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: @@ -2763,10 +2671,6 @@ packages: dev: true optional: true - /identity-function@1.0.0: - resolution: {integrity: sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==} - dev: true - /ignore-walk@6.0.4: resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2931,11 +2835,6 @@ packages: is-path-inside: 3.0.3 dev: true - /is-iterable@1.1.1: - resolution: {integrity: sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==} - engines: {node: '>= 4'} - dev: true - /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true @@ -2957,11 +2856,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3063,19 +2957,6 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isomorphic-ws@5.0.0(ws@8.17.1): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - dependencies: - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) - dev: false - - /iterable-lookahead@1.0.0: - resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} - engines: {node: '>=4'} - dev: true - /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -3085,8 +2966,8 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true dev: true @@ -3103,10 +2984,6 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true - /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3151,10 +3028,6 @@ packages: hasBin: true dev: true - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -3186,21 +3059,20 @@ packages: engines: {node: '>=6'} dev: true - /knip@5.23.2(@types/node@18.18.6)(typescript@5.5.2): - resolution: {integrity: sha512-3IbIzu2K6mB4aLBLkhYWYLVL5kbyjgDW3LPW4wFN9fl4I8F7VK5gF/m9C0HZmTBmoW9OkCzQapBv6H7E1+NI1g==} + /knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): + resolution: {integrity: sha512-vUopqkh/gOovZ05qYgTghZpmkM3b2eKYdLTsu11ZTYnYEcsdfQeZs6l4U7Rap4b+1KEDd/yydJsuWl+4NyEA9g==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: '@types/node': '>=18' typescript: '>=5.0.4' dependencies: - '@ericcornelissen/bash-parser': 0.5.3 - '@nodelib/fs.walk': 2.0.0 + '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 '@types/node': 18.18.6 easy-table: 1.2.0 fast-glob: 3.3.2 - jiti: 1.21.0 + jiti: 1.21.6 js-yaml: 4.1.0 minimist: 1.2.8 picocolors: 1.0.0 @@ -3211,7 +3083,7 @@ packages: strip-json-comments: 5.0.1 summary: 2.1.0 tsconfig-paths: 4.2.0 - typescript: 5.5.2 + typescript: 5.5.3 zod: 3.22.4 zod-validation-error: 3.3.0(zod@3.22.4) dev: true @@ -3247,14 +3119,6 @@ packages: strip-bom: 3.0.0 dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true - /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3269,10 +3133,6 @@ packages: p-locate: 5.0.0 dev: true - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: true - /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true @@ -3285,8 +3145,8 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + /loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} dependencies: get-func-name: 2.0.2 dev: true @@ -3320,15 +3180,8 @@ packages: engines: {node: '>=12'} dev: true - /magic-string@0.16.0: - resolution: {integrity: sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==} - dependencies: - vlq: 0.2.3 - dev: true - - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -3386,11 +3239,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /map-obj@2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} - dev: true - /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} @@ -3581,15 +3429,6 @@ packages: hasBin: true dev: true - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -3617,12 +3456,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - requiresBuild: true - dev: false - /node-gyp@9.4.1: resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} engines: {node: ^12.13 || ^14.13 || >=16} @@ -3824,15 +3657,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /object-pairs@0.1.0: - resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} - dev: true - - /object-values@1.0.0: - resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} - engines: {node: '>=0.10.0'} - dev: true - /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -3908,13 +3732,6 @@ packages: yocto-queue: 0.1.0 dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4046,14 +3863,19 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4081,14 +3903,6 @@ packages: find-up: 4.1.0 dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true - /platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} dev: false @@ -4119,7 +3933,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 dev: true @@ -4403,10 +4217,6 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /reverse-arguments@1.0.0: - resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} - dev: true - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -4554,10 +4364,6 @@ packages: engines: {node: '>=8'} dev: true - /shell-quote-word@1.0.1: - resolution: {integrity: sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==} - dev: true - /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -4760,10 +4566,6 @@ packages: strip-ansi: 7.1.0 dev: true - /string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - dev: true - /string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -4843,12 +4645,6 @@ packages: engines: {node: '>=14.16'} dev: true - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - dependencies: - js-tokens: 9.0.0 - dev: true - /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4916,17 +4712,17 @@ packages: any-promise: 1.3.0 dev: true - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} dev: true - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + /tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} dev: true - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + /tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} dev: true @@ -4937,16 +4733,6 @@ packages: os-tmpdir: 1.0.2 dev: true - /to-no-case@1.0.2: - resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} - dev: true - - /to-pascal-case@1.0.0: - resolution: {integrity: sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==} - dependencies: - to-space-case: 1.0.0 - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4954,12 +4740,6 @@ packages: is-number: 7.0.0 dev: true - /to-space-case@1.0.0: - resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} - dependencies: - to-no-case: 1.0.2 - dev: true - /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: @@ -4989,7 +4769,7 @@ packages: strip-bom: 3.0.0 dev: true - /tsup@8.1.0(typescript@5.5.2): + /tsup@8.1.0(typescript@5.5.3): resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} engines: {node: '>=18'} hasBin: true @@ -5022,7 +4802,7 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - ts-node @@ -5053,11 +4833,6 @@ packages: - supports-color dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -5133,8 +4908,8 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -5143,10 +4918,6 @@ packages: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} dev: true - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true - /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -5164,12 +4935,6 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /unescape-js@1.1.4: - resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} - dependencies: - string.fromcodepoint: 0.2.1 - dev: true - /unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5235,14 +5000,6 @@ packages: xdg-basedir: 5.1.0 dev: true - /utf-8-validate@6.0.4: - resolution: {integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.1 - dev: false - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -5261,15 +5018,15 @@ packages: builtins: 5.0.1 dev: true - /vite-node@1.6.0(@types/node@18.18.6): - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + /vite-node@2.0.1(@types/node@18.18.6): + resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.3.5 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 vite: 5.2.6(@types/node@18.18.6) transitivePeerDependencies: - '@types/node' @@ -5318,15 +5075,15 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.6.0(@types/node@18.18.6): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + /vitest@2.0.1(@types/node@18.18.6): + resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.1 + '@vitest/ui': 2.0.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5343,26 +5100,24 @@ packages: jsdom: optional: true dependencies: + '@ampproject/remapping': 2.3.0 '@types/node': 18.18.6 - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 + '@vitest/expect': 2.0.1 + '@vitest/runner': 2.0.1 + '@vitest/snapshot': 2.0.1 + '@vitest/spy': 2.0.1 + '@vitest/utils': 2.0.1 + chai: 5.1.1 + debug: 4.3.5 execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.8 + magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.6.0 - tinypool: 0.8.4 + tinybench: 2.8.0 + tinypool: 1.0.0 vite: 5.2.6(@types/node@18.18.6) - vite-node: 1.6.0(@types/node@18.18.6) + vite-node: 2.0.1(@types/node@18.18.6) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -5374,10 +5129,6 @@ packages: - terser dev: true - /vlq@0.2.3: - resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} - dev: true - /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} requiresBuild: true @@ -5515,22 +5266,6 @@ packages: typedarray-to-buffer: 3.1.5 dev: true - /ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.4 - dev: false - /xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -5607,11 +5342,6 @@ packages: engines: {node: '>=10'} dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - /zod-validation-error@3.3.0(zod@3.22.4): resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} engines: {node: '>=18.0.0'} diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index 1f8ceb99..f495bb32 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -1,5 +1,5 @@ from e2b import * -from .main import CodeInterpreter +from .code_interpreter_sync import CodeInterpreter +from .code_interpreter_async import AsyncCodeInterpreter from .models import Execution, Error, Result, KernelException, MIMEType, Logs -from .messaging import CellMessage diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py new file mode 100644 index 00000000..40aeb53e --- /dev/null +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -0,0 +1,106 @@ +import json +import logging +import inspect + +from typing import Optional +from httpx import AsyncHTTPTransport, AsyncClient +from e2b import AsyncSandbox, ConnectionConfig, Stderr, Stdout, OutputHandler + +from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT +from e2b_code_interpreter.models import Execution, Result, Error + + +logger = logging.getLogger(__name__) + + +class JupyterExtension: + _exec_timeout = 300 + + def __init__( + self, + url: str, + transport: AsyncHTTPTransport, + connection_config: ConnectionConfig, + ): + self._url = url + self._transport = transport + self._connection_config = connection_config + + async def exec_code( + self, + code: str, + kernel_id: Optional[str] = None, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[Stdout]] = None, + on_stderr: Optional[OutputHandler[Stderr]] = None, + on_result: Optional[OutputHandler[Result]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ): + logger.debug(f"Executing code {code} for language {language}") + + timeout = None if timeout == 0 else (timeout or self._exec_timeout) + request_timeout = request_timeout or self._connection_config.request_timeout + + async with AsyncClient(transport=self._transport) as client: + response = await client.post( + self._url, + json={ + "code": code, + # "language": language, + # "kernel_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) + + response.raise_for_status() + + execution = Execution() + + async for line in response.aiter_lines(): + data = json.loads(line) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + if on_result: + cb = on_result(result) + if inspect.isawaitable(cb): + await cb + elif data_type == "stdout": + execution.logs.stdout += data["value"] + if on_stdout: + cb = on_stdout(data["value"]) + if inspect.isawaitable(cb): + await cb + elif data_type == "stderr": + execution.logs.stderr += data["value"] + if on_stderr: + cb = on_stderr(data["value"]) + if inspect.isawaitable(cb): + await cb + elif data_type == "error": + execution.error = Error(**data) + + return execution + + +class AsyncCodeInterpreter(AsyncSandbox): + default_template = DEFAULT_TEMPLATE + _jupyter_port = JUPYTER_PORT + + @property + def notebook(self) -> JupyterExtension: + return self._notebook + + def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): + super().__init__(sandbox_id, connection_config) + + jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}/execute" + + self._notebook = JupyterExtension( + jupyter_url, + self._transport, + self.connection_config, + ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py new file mode 100644 index 00000000..6f025844 --- /dev/null +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -0,0 +1,119 @@ +import json +import logging + +from typing import Optional, Dict, Callable, TypeVar +from httpx import HTTPTransport, Client +from e2b import Sandbox, Stderr, Stdout, ConnectionConfig + +from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT +from e2b_code_interpreter.models import Execution, Result, Error + + +logger = logging.getLogger(__name__) + +T = TypeVar("T") + +OutputHandler = Callable[[T], None] + + +class JupyterExtension: + _exec_timeout = 300 + + def __init__( + self, + url: str, + transport: HTTPTransport, + connection_config: ConnectionConfig, + ): + self._url = url + self._transport = transport + self._connection_config = connection_config + + def exec_code( + self, + code: str, + kernel_id: Optional[str] = None, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[Stdout]] = None, + on_stderr: Optional[OutputHandler[Stderr]] = None, + on_result: Optional[OutputHandler[Result]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ): + logger.debug(f"Executing code {code} for language {language}") + + timeout = None if timeout == 0 else (timeout or self._exec_timeout) + request_timeout = request_timeout or self._connection_config.request_timeout + + with Client(transport=self._transport) as client: + response = client.post( + self._url, + json={ + "code": code, + # "language": language, + # "kernel_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) + + response.raise_for_status() + + execution = Execution() + + for line in response.iter_lines(): + data = json.loads(line) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + if on_result: + on_result(result) + elif data_type == "stdout": + execution.logs.stdout += data["value"] + if on_stdout: + on_stdout(data["value"]) + elif data_type == "stderr": + execution.logs.stderr += data["value"] + if on_stderr: + on_stderr(data["value"]) + elif data_type == "error": + execution.error = Error(**data) + + return execution + + +class CodeInterpreter(Sandbox): + default_template = DEFAULT_TEMPLATE + _jupyter_port = JUPYTER_PORT + + @property + def notebook(self) -> JupyterExtension: + return self._notebook + + def __init__( + self, + template: Optional[str] = None, + timeout: Optional[int] = None, + metadata: Optional[Dict[str, str]] = None, + api_key: Optional[str] = None, + domain: Optional[str] = None, + debug: Optional[bool] = None, + sandbox_id: Optional[str] = None, + request_timeout: Optional[float] = None, + ): + super().__init__( + template=template, + timeout=timeout, + metadata=metadata, + api_key=api_key, + domain=domain, + debug=debug, + sandbox_id=sandbox_id, + request_timeout=request_timeout, + ) + + jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}/execute" + self._notebook = JupyterExtension( + jupyter_url, self._transport, self.connection_config + ) diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index 8fd9190d..9ff8c39f 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1 +1,2 @@ -TIMEOUT = 60 +DEFAULT_TEMPLATE = "ci-no-ws" +JUPYTER_PORT = 8000 diff --git a/python/e2b_code_interpreter/main.py b/python/e2b_code_interpreter/main.py deleted file mode 100644 index 3373536d..00000000 --- a/python/e2b_code_interpreter/main.py +++ /dev/null @@ -1,108 +0,0 @@ -from __future__ import annotations - -import json -import logging - -from typing import Optional, Dict - -import requests -from e2b import Sandbox - - -from e2b_code_interpreter.constants import TIMEOUT -from e2b_code_interpreter.models import Execution, Result, Logs, Error - - -logger = logging.getLogger(__name__) - - -class CodeInterpreter(Sandbox): - """ - E2B code interpreter sandbox extension. - """ - - default_template = "ci-no-ws" - - def __init__( - self, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: float = TIMEOUT, - ): - super().__init__( - template=template, - timeout=timeout, - metadata=metadata, - api_key=api_key, - domain=domain, - debug=debug, - sandbox_id=sandbox_id, - request_timeout=request_timeout, - ) - - def exec_code( - self, - code: str, - language: Optional[str] = None, - timeout: float = TIMEOUT, - ) -> Execution: - """ - Execute code in a notebook cell. - - :param code: Code to execute - :param language: Language of the code to be executed - :param timeout: Timeout for the call - - :return: Result of the execution - """ - logger.debug( - f"Executing code {code} for language {language} (Sandbox: {self.sandbox_id})" - ) - - execution = Execution() - with requests.post(f"http://localhost:8000/execute", stream=True) as r: - # with requests.post(f"https://{self.get_host(8000)}/execute", stream=True) as r: - print(r.text) - for line in r.iter_lines(): - data = json.loads(line.decode("utf-8")) - data_type = data.pop("type") - - if data_type == "result": - result = Result(**data) - execution.results.append(result) - elif data_type == "stdout": - execution.logs.stdout += data["value"] - elif data_type == "stderr": - execution.logs.stderr += data["value"] - elif data_type == "error": - execution.error = Error(**data) - - print("Done") - return execution - - # if not execution: - # raise Exception("Failed to execute code") - # - # logger.debug(f"Received result: {execution} (Sandbox: {self.sandbox_id})") - # - # return Execution( - # results=( - # [Result(**result.to_dict()) for result in execution.results] - # if execution.results - # else None - # ), - # logs=( - # Logs( - # stdout=execution.logs.stdout or None, - # stderr=execution.logs.stderr or None, - # ) - # if execution.logs - # else Logs() - # ), - # error=(Error(**execution.error.to_dict()) if execution.error else None), - # ) diff --git a/python/example.py b/python/example.py index 59da4a3d..bc482275 100644 --- a/python/example.py +++ b/python/example.py @@ -1,5 +1,5 @@ -from e2b_code_interpreter.main import CodeInterpreter from dotenv import load_dotenv +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter load_dotenv() @@ -23,9 +23,13 @@ pandas.DataFrame({"a": [1, 2, 3]}) """ -sandbox = CodeInterpreter() +sandbox = CodeInterpreter.connect("", debug=True) print(sandbox.sandbox_id) -execution = sandbox.exec_code(code) +execution = sandbox.notebook.exec_code( + code, + on_stdout=lambda msg: print("stdout", msg), + on_stderr=lambda msg: print("stderr", msg), +) print(execution.results[0].formats()) print(len(execution.results)) diff --git a/python/poetry.lock b/python/poetry.lock index 40f91764..134071a7 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -98,105 +98,6 @@ files = [ {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - [[package]] name = "click" version = "8.1.7" @@ -481,27 +382,6 @@ files = [ [package.extras] cli = ["click (>=5.0)"] -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - [[package]] name = "six" version = "1.16.0" @@ -546,121 +426,7 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "urllib3" -version = "2.2.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "websockets" -version = "12.0" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, - {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, - {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, - {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, - {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, - {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, - {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, - {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, - {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, - {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, - {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, - {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, - {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, - {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, - {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, -] - [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "fbad8c6312656956c815575f542e3656a409dfd8810cd6a5894f12ad2c086a36" +content-hash = "c2f6311a815a1e5e9de43ff05ad6cbd4cce545fe702bfc5fd00f46898b3ee06a" diff --git a/python/pyproject.toml b/python/pyproject.toml index 12bb9bad..c86c705d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,13 +12,9 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -websocket-client = "^1.7.0" -websockets = "^12.0" e2b = "0.17.2a25" -requests = "^2.32.3" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -python-dateutil = "^2.8.0" [tool.poetry.group.dev.dependencies] black = "^24.3.0" diff --git a/python/tests/benchmarking.py b/python/tests/benchmarking.py index 14220fee..3bb65eec 100644 --- a/python/tests/benchmarking.py +++ b/python/tests/benchmarking.py @@ -2,7 +2,7 @@ from dotenv import load_dotenv -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter load_dotenv() diff --git a/python/tests/test_bash.py b/python/tests/test_bash.py index 3ffe6393..622827f0 100644 --- a/python/tests/test_bash.py +++ b/python/tests/test_bash.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_bash(): diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 87f64518..01f70682 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_basic(): diff --git a/python/tests/test_display_data.py b/python/tests/test_display_data.py index 703860be..ad9ec41d 100644 --- a/python/tests/test_display_data.py +++ b/python/tests/test_display_data.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_display_data(): diff --git a/python/tests/test_execution_count.py b/python/tests/test_execution_count.py index 21f86302..107c9355 100644 --- a/python/tests/test_execution_count.py +++ b/python/tests/test_execution_count.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_execution_count(): diff --git a/python/tests/test_kernels.py b/python/tests/test_kernels.py index 73d00671..6b24eefa 100644 --- a/python/tests/test_kernels.py +++ b/python/tests/test_kernels.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_create_new_kernel(): diff --git a/python/tests/test_reconnect.py b/python/tests/test_reconnect.py index f0b891e5..7cde3d88 100644 --- a/python/tests/test_reconnect.py +++ b/python/tests/test_reconnect.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_reconnect(): diff --git a/python/tests/test_statefulness.py b/python/tests/test_statefulness.py index fdc0c8ea..36b85e10 100644 --- a/python/tests/test_statefulness.py +++ b/python/tests/test_statefulness.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_stateful(): diff --git a/python/tests/test_streaming.py b/python/tests/test_streaming.py index 4e1e00cc..fd0053cd 100644 --- a/python/tests/test_streaming.py +++ b/python/tests/test_streaming.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.main import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter def test_streaming_output(): From 970209feec281d43bfa7137c82f830a36b017116 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 23:04:50 -0700 Subject: [PATCH 091/722] Fix vitest config --- js/vitest.config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/vitest.config.ts b/js/vitest.config.ts index d70ac6b0..b2d31c56 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -11,7 +11,6 @@ export default defineConfig({ maxThreads: 4, }, }, - maxWorkers: 5, globals: false, testTimeout: 20000, environment: 'node', @@ -25,4 +24,4 @@ export default defineConfig({ ...env.parsed, }, }, -}) \ No newline at end of file +}) From 8418ce5dd1b893b7db321f89212b191ae998e109 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 9 Jul 2024 23:32:27 -0700 Subject: [PATCH 092/722] [WIP] Update tests --- js/tests/bash.test.ts | 10 ++-- js/tests/basic.test.ts | 10 ++-- js/tests/displayData.test.ts | 9 ++-- js/tests/executionCount.test.ts | 11 ++-- js/tests/kernels.test.ts | 24 ++------- js/tests/reconnect.test.ts | 12 ++--- js/tests/setup.ts | 35 ++++++++++++ js/tests/statefulness.test.ts | 8 +-- js/tests/streaming.test.ts | 18 +++---- .../code_interpreter_async.py | 2 +- .../code_interpreter_sync.py | 2 +- python/poetry.lock | 20 ++++++- python/pyproject.toml | 1 + python/pytest.ini | 6 +++ python/tests/conftest.py | 54 +++++++++++++++++++ python/tests/sync/test_bash.py | 6 +++ python/tests/sync/test_basic.py | 6 +++ python/tests/sync/test_display_data.py | 22 ++++++++ python/tests/sync/test_execution_count.py | 7 +++ python/tests/sync/test_kernels.py | 43 +++++++++++++++ python/tests/{ => sync}/test_reconnect.py | 5 +- python/tests/sync/test_statefulness.py | 8 +++ python/tests/sync/test_streaming.py | 45 ++++++++++++++++ python/tests/test_bash.py | 7 --- python/tests/test_basic.py | 7 --- python/tests/test_display_data.py | 23 -------- python/tests/test_execution_count.py | 8 --- python/tests/test_kernels.py | 48 ----------------- python/tests/test_statefulness.py | 9 ---- python/tests/test_streaming.py | 47 ---------------- 30 files changed, 285 insertions(+), 228 deletions(-) create mode 100644 js/tests/setup.ts create mode 100644 python/pytest.ini create mode 100644 python/tests/conftest.py create mode 100644 python/tests/sync/test_bash.py create mode 100644 python/tests/sync/test_basic.py create mode 100644 python/tests/sync/test_display_data.py create mode 100644 python/tests/sync/test_execution_count.py create mode 100644 python/tests/sync/test_kernels.py rename python/tests/{ => sync}/test_reconnect.py (71%) create mode 100644 python/tests/sync/test_statefulness.py create mode 100644 python/tests/sync/test_streaming.py delete mode 100644 python/tests/test_bash.py delete mode 100644 python/tests/test_basic.py delete mode 100644 python/tests/test_display_data.py delete mode 100644 python/tests/test_execution_count.py delete mode 100644 python/tests/test_kernels.py delete mode 100644 python/tests/test_statefulness.py delete mode 100644 python/tests/test_streaming.py diff --git a/js/tests/bash.test.ts b/js/tests/bash.test.ts index 5a2f07cd..26f2f7d0 100644 --- a/js/tests/bash.test.ts +++ b/js/tests/bash.test.ts @@ -1,13 +1,9 @@ -import { CodeInterpreter } from '../src' +import { expect } from 'vitest' -import { expect, test } from 'vitest' - -test('bash', async () => { - const sandbox = await CodeInterpreter.create() +import { sandboxTest } from './setup' +sandboxTest('bash', async ({ sandbox }) => { const result = await sandbox.notebook.execCell('!pwd') expect(result.logs.stdout.join().trim()).toEqual('/home/user') - - await sandbox.close() }) diff --git a/js/tests/basic.test.ts b/js/tests/basic.test.ts index 90a0110f..eb5a8650 100644 --- a/js/tests/basic.test.ts +++ b/js/tests/basic.test.ts @@ -1,13 +1,9 @@ -import { CodeInterpreter } from '../src' +import { expect } from 'vitest' -import { expect, test } from 'vitest' - -test('basic', async () => { - const sandbox = await CodeInterpreter.create() +import { sandboxTest } from './setup' +sandboxTest('basic', async ({ sandbox }) => { const result = await sandbox.notebook.execCell('x =1; x') expect(result.text).toEqual('1') - - await sandbox.close() }) diff --git a/js/tests/displayData.test.ts b/js/tests/displayData.test.ts index 6a071a97..dfde1a61 100644 --- a/js/tests/displayData.test.ts +++ b/js/tests/displayData.test.ts @@ -1,9 +1,8 @@ -import { CodeInterpreter } from '../src' +import { expect } from 'vitest' -import { expect, test } from 'vitest' +import { sandboxTest } from './setup' -test('display data', async () => { - const sandbox = await CodeInterpreter.create() +sandboxTest('display data', async ({ sandbox }) => { // plot random graph const result = await sandbox.notebook.execCell(` @@ -20,6 +19,4 @@ test('display data', async () => { const image = result.results[0] expect(image.png).toBeDefined() expect(image.text).toBeDefined() - - await sandbox.close() }) diff --git a/js/tests/executionCount.test.ts b/js/tests/executionCount.test.ts index c6c25943..9d1a9794 100644 --- a/js/tests/executionCount.test.ts +++ b/js/tests/executionCount.test.ts @@ -1,15 +1,10 @@ -import { CodeInterpreter } from '../src' +import { expect } from 'vitest' -import { expect, test } from 'vitest' - -test('execution count', async () => { - const sandbox = await CodeInterpreter.create() +import { sandboxTest } from './setup' +sandboxTest('execution count', async ({ sandbox }) => { await sandbox.notebook.execCell('!pwd') const result = await sandbox.notebook.execCell('!pwd') - - await sandbox.close() - expect(result.executionCount).toEqual(2) }) diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 548cede9..387f8f14 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -1,41 +1,29 @@ import { expect, test } from 'vitest' -import { CodeInterpreter } from '../src' -test('create new kernel', async () => { - const sandbox = await CodeInterpreter.create() +import { sandboxTest } from './setup' +sandboxTest('create new kernel', async ({ sandbox }) => { await sandbox.notebook.createKernel() - - await sandbox.close() }) -test('independence of kernels', async () => { - const sandbox = await CodeInterpreter.create() +sandboxTest('independence of kernels', async ({ sandbox }) => { await sandbox.notebook.execCell('x = 1') const kernelID = await sandbox.notebook.createKernel() const output = await sandbox.notebook.execCell('x', { kernelID }) expect(output.error!.value).toEqual("name 'x' is not defined") - - await sandbox.close() }) -test('restart kernel', async () => { - const sandbox = await CodeInterpreter.create() - +sandboxTest('restart kernel', async ({ sandbox }) => { await sandbox.notebook.execCell('x = 1') await sandbox.notebook.restartKernel() const output = await sandbox.notebook.execCell('x') expect(output.error!.value).toEqual("name 'x' is not defined") - - await sandbox.close() }) -test('list kernels', async () => { - const sandbox = await CodeInterpreter.create() - +sandboxTest('list kernels', async ({ sandbox }) => { let kernels = await sandbox.notebook.listKernels() expect(kernels.length).toEqual(1) @@ -43,6 +31,4 @@ test('list kernels', async () => { kernels = await sandbox.notebook.listKernels() expect(kernels).toContain(kernelID) expect(kernels.length).toEqual(2) - - await sandbox.close() }) diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index 3d659ee9..96bae01a 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -1,16 +1,12 @@ -import { CodeInterpreter } from '../src' - -import { expect, test } from 'vitest' +import { expect } from 'vitest' -test('reconnect', async () => { - let sandbox = await CodeInterpreter.create() - await sandbox.close() +import { CodeInterpreter } from '../src' +import { sandboxTest } from './setup' +sandboxTest('reconnect', async ({ sandbox }) => { sandbox = await CodeInterpreter.connect(sandbox.sandboxID) const result = await sandbox.notebook.execCell('x =1; x') expect(result.text).toEqual('1') - - await sandbox.close() }) diff --git a/js/tests/setup.ts b/js/tests/setup.ts new file mode 100644 index 00000000..b10831a8 --- /dev/null +++ b/js/tests/setup.ts @@ -0,0 +1,35 @@ +import { CodeInterpreter } from '../src' +import { test as base } from 'vitest' + +const timeoutMs = 60_000 + +interface SandboxFixture { + sandbox: CodeInterpreter +} + +export const sandboxTest = base.extend({ + sandbox: [ + async ({ }, use) => { + const sandbox = await CodeInterpreter.create({ timeoutMs }) + try { + await use(sandbox) + + } finally { + try { + await sandbox.kill() + } catch (err) { + if (!isDebug) { + console.warn('Failed to kill sandbox — this is expected if the test runs with local envd.') + } + } + } + }, + { auto: true }, + ], +}) + +export const isDebug = process.env.E2B_DEBUG !== undefined + +export async function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/js/tests/statefulness.test.ts b/js/tests/statefulness.test.ts index e763529d..1a4013b4 100644 --- a/js/tests/statefulness.test.ts +++ b/js/tests/statefulness.test.ts @@ -1,15 +1,11 @@ -import { CodeInterpreter } from '../src' - import { expect, test } from 'vitest' -test('statefulness', async () => { - const sandbox = await CodeInterpreter.create() +import { sandboxTest } from './setup' +sandboxTest('statefulness', async ({ sandbox }) => { await sandbox.notebook.execCell('x = 1') const result = await sandbox.notebook.execCell('x += 1; x') expect(result.text).toEqual('2') - - await sandbox.close() }) diff --git a/js/tests/streaming.test.ts b/js/tests/streaming.test.ts index c39545c0..2099d292 100644 --- a/js/tests/streaming.test.ts +++ b/js/tests/streaming.test.ts @@ -1,34 +1,31 @@ -import { CodeInterpreter, Result, CellMessage } from '../src' +import { expect } from 'vitest' -import { expect, test } from 'vitest' +import { Result, CellMessage } from '../src' -test('streaming output', async () => { +import { sandboxTest } from './setup' + +sandboxTest('streaming output', async ({ sandbox }) => { const out: CellMessage[] = [] - const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell('print(1)', { onStdout: (msg) => out.push(msg) }) expect(out.length).toEqual(1) expect(out[0].line).toEqual('1\n') - await sandbox.close() }) -test('streaming error', async () => { +sandboxTest('streaming error', async ({ sandbox }) => { const out: CellMessage[] = [] - const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell('import sys;print(1, file=sys.stderr)', { onStderr: (msg) => out.push(msg) }) expect(out.length).toEqual(1) expect(out[0].line).toEqual('1\n') - await sandbox.close() }) -test('streaming result', async () => { +sandboxTest('streaming result', async ({ sandbox }) => { const out: Result[] = [] - const sandbox = await CodeInterpreter.create() const code = ` import matplotlib.pyplot as plt import numpy as np @@ -46,5 +43,4 @@ test('streaming result', async () => { }) expect(out.length).toEqual(2) - await sandbox.close() }) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 40aeb53e..b2615b0d 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -26,7 +26,7 @@ def __init__( self._transport = transport self._connection_config = connection_config - async def exec_code( + async def exec_cell( self, code: str, kernel_id: Optional[str] = None, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 6f025844..f8c18552 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -29,7 +29,7 @@ def __init__( self._transport = transport self._connection_config = connection_config - def exec_code( + def exec_cell( self, code: str, kernel_id: Optional[str] = None, diff --git a/python/poetry.lock b/python/poetry.lock index 134071a7..7aee8516 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -339,6 +339,24 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-asyncio" +version = "0.23.7" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, +] + +[package.dependencies] +pytest = ">=7.0.0,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + [[package]] name = "pytest-dotenv" version = "0.5.2" @@ -429,4 +447,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "c2f6311a815a1e5e9de43ff05ad6cbd4cce545fe702bfc5fd00f46898b3ee06a" +content-hash = "8861b5cb75f0d131a7d9b517e40595062a512d4d18f7c4441b7d8316909b7f07" diff --git a/python/pyproject.toml b/python/pyproject.toml index c86c705d..6b025d43 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -21,6 +21,7 @@ black = "^24.3.0" pytest = "^7.4.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" +pytest-asyncio = "^0.23.7" [build-system] requires = ["poetry-core"] diff --git a/python/pytest.ini b/python/pytest.ini new file mode 100644 index 00000000..7776d099 --- /dev/null +++ b/python/pytest.ini @@ -0,0 +1,6 @@ +# content of pytest.ini +[pytest] +markers = + skip_debug: skip test if E2B_DEBUG is set. + +addopts = "--import-mode=importlib" diff --git a/python/tests/conftest.py b/python/tests/conftest.py new file mode 100644 index 00000000..66cea34b --- /dev/null +++ b/python/tests/conftest.py @@ -0,0 +1,54 @@ +import pytest +import pytest_asyncio +import os + +from logging import warning + +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + +timeout = 60 + + +@pytest.fixture() +def sandbox(debug): + sandbox = CodeInterpreter(timeout=timeout) + + try: + yield sandbox + finally: + try: + sandbox.kill() + except: + if not debug: + warning( + "Failed to kill sandbox — this is expected if the test runs with local envd." + ) + + +@pytest_asyncio.fixture +async def async_sandbox(debug): + sandbox = await AsyncCodeInterpreter.create(timeout=timeout) + + try: + yield sandbox + finally: + try: + await sandbox.kill() + except: + if not debug: + warning( + "Failed to kill sandbox — this is expected if the test runs with local envd." + ) + + +@pytest.fixture +def debug(): + return os.getenv("E2B_DEBUG") is not None + + +@pytest.fixture(autouse=True) +def skip_by_debug(request, debug): + if request.node.get_closest_marker("skip_debug"): + if debug: + pytest.skip("skipped because E2B_DEBUG is set") diff --git a/python/tests/sync/test_bash.py b/python/tests/sync/test_bash.py new file mode 100644 index 00000000..19c79de0 --- /dev/null +++ b/python/tests/sync/test_bash.py @@ -0,0 +1,6 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_bash(sandbox: CodeInterpreter): + result = sandbox.notebook.exec_cell("!pwd") + assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/sync/test_basic.py b/python/tests/sync/test_basic.py new file mode 100644 index 00000000..b1fba259 --- /dev/null +++ b/python/tests/sync/test_basic.py @@ -0,0 +1,6 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_basic(sandbox: CodeInterpreter): + result = sandbox.notebook.exec_cell("x =1; x") + assert result.text == "1" diff --git a/python/tests/sync/test_display_data.py b/python/tests/sync/test_display_data.py new file mode 100644 index 00000000..1f38bee7 --- /dev/null +++ b/python/tests/sync/test_display_data.py @@ -0,0 +1,22 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_display_data(sandbox: CodeInterpreter): + # plot random graph + result = sandbox.notebook.exec_cell( + """ + import matplotlib.pyplot as plt + import numpy as np + + x = np.linspace(0, 20, 100) + y = np.sin(x) + + plt.plot(x, y) + plt.show() + """ + ) + + # there's your image + data = result.results[0] + assert data.png + assert data.text diff --git a/python/tests/sync/test_execution_count.py b/python/tests/sync/test_execution_count.py new file mode 100644 index 00000000..ede25a56 --- /dev/null +++ b/python/tests/sync/test_execution_count.py @@ -0,0 +1,7 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_execution_count(sandbox: CodeInterpreter): + sandbox.notebook.exec_cell("echo 'E2B is awesome!'") + result = sandbox.notebook.exec_cell("!pwd") + assert result.execution_count == 2 diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py new file mode 100644 index 00000000..11af7199 --- /dev/null +++ b/python/tests/sync/test_kernels.py @@ -0,0 +1,43 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_create_new_kernel(sandbox: CodeInterpreter): + sandbox.notebook.create_kernel() + + +def test_independence_of_kernels(sandbox: CodeInterpreter): + kernel_id = sandbox.notebook.create_kernel() + sandbox.notebook.exec_cell("x = 1") + + r = sandbox.notebook.exec_cell("x", kernel_id=kernel_id) + assert r.error.value == "name 'x' is not defined" + + +def test_restart_kernel(sandbox: CodeInterpreter): + sandbox.notebook.exec_cell("x = 1") + sandbox.notebook.restart_kernel() + + r = sandbox.notebook.exec_cell("x") + assert r.error.value == "name 'x' is not defined" + + +def test_list_kernels(sandbox: CodeInterpreter): + kernels = sandbox.notebook.list_kernels() + assert len(kernels) == 1 + + kernel_id = sandbox.notebook.create_kernel() + kernels = sandbox.notebook.list_kernels() + assert kernel_id in kernels + assert len(kernels) == 2 + + +def test_shutdown(sandbox: CodeInterpreter): + kernel_id = sandbox.notebook.create_kernel() + kernels = sandbox.notebook.list_kernels() + assert kernel_id in kernels + assert len(kernels) == 2 + + sandbox.notebook.shutdown_kernel(kernel_id) + kernels = sandbox.notebook.list_kernels() + assert kernel_id not in kernels + assert len(kernels) == 1 diff --git a/python/tests/test_reconnect.py b/python/tests/sync/test_reconnect.py similarity index 71% rename from python/tests/test_reconnect.py rename to python/tests/sync/test_reconnect.py index 7cde3d88..518af546 100644 --- a/python/tests/test_reconnect.py +++ b/python/tests/sync/test_reconnect.py @@ -1,12 +1,9 @@ from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter -def test_reconnect(): - sandbox = CodeInterpreter() +def test_reconnect(sandbox: CodeInterpreter): sandbox_id = sandbox.sandbox_id - sandbox.close() sandbox2 = CodeInterpreter.connect(sandbox_id) result = sandbox2.notebook.exec_cell("x =1; x") - sandbox2.close() assert result.text == "1" diff --git a/python/tests/sync/test_statefulness.py b/python/tests/sync/test_statefulness.py new file mode 100644 index 00000000..d1242c60 --- /dev/null +++ b/python/tests/sync/test_statefulness.py @@ -0,0 +1,8 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_stateful(sandbox: CodeInterpreter): + sandbox.notebook.exec_cell("x = 1") + + result = sandbox.notebook.exec_cell("x+=1; x") + assert result.text == "2" diff --git a/python/tests/sync/test_streaming.py b/python/tests/sync/test_streaming.py new file mode 100644 index 00000000..f573877b --- /dev/null +++ b/python/tests/sync/test_streaming.py @@ -0,0 +1,45 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_streaming_output(sandbox: CodeInterpreter): + out = [] + + def test(line) -> int: + out.append(line) + return 1 + + sandbox.notebook.exec_cell("print(1)", on_stdout=test) + + assert len(out) == 1 + assert out[0].line == "1\n" + + +def test_streaming_error(sandbox: CodeInterpreter): + out = [] + + sandbox.notebook.exec_cell( + "import sys;print(1, file=sys.stderr)", on_stderr=out.append + ) + + assert len(out) == 1 + assert out[0].line == "1\n" + + +def test_streaming_result(sandbox: CodeInterpreter): + code = """ + import matplotlib.pyplot as plt + import numpy as np + + x = np.linspace(0, 20, 100) + y = np.sin(x) + + plt.plot(x, y) + plt.show() + + x + """ + + out = [] + sandbox.notebook.exec_cell(code, on_result=out.append) + + assert len(out) == 2 diff --git a/python/tests/test_bash.py b/python/tests/test_bash.py deleted file mode 100644 index 622827f0..00000000 --- a/python/tests/test_bash.py +++ /dev/null @@ -1,7 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_bash(): - with CodeInterpreter() as sandbox: - result = sandbox.notebook.exec_cell("!pwd") - assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py deleted file mode 100644 index 01f70682..00000000 --- a/python/tests/test_basic.py +++ /dev/null @@ -1,7 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_basic(): - with CodeInterpreter() as sandbox: - result = sandbox.notebook.exec_cell("x =1; x") - assert result.text == "1" diff --git a/python/tests/test_display_data.py b/python/tests/test_display_data.py deleted file mode 100644 index ad9ec41d..00000000 --- a/python/tests/test_display_data.py +++ /dev/null @@ -1,23 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_display_data(): - with CodeInterpreter() as sandbox: - # plot random graph - result = sandbox.notebook.exec_cell( - """ - import matplotlib.pyplot as plt - import numpy as np - - x = np.linspace(0, 20, 100) - y = np.sin(x) - - plt.plot(x, y) - plt.show() - """ - ) - - # there's your image - data = result.results[0] - assert data.png - assert data.text diff --git a/python/tests/test_execution_count.py b/python/tests/test_execution_count.py deleted file mode 100644 index 107c9355..00000000 --- a/python/tests/test_execution_count.py +++ /dev/null @@ -1,8 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_execution_count(): - with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell("echo 'E2B is awesome!'") - result = sandbox.notebook.exec_cell("!pwd") - assert result.execution_count == 2 diff --git a/python/tests/test_kernels.py b/python/tests/test_kernels.py deleted file mode 100644 index 6b24eefa..00000000 --- a/python/tests/test_kernels.py +++ /dev/null @@ -1,48 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_create_new_kernel(): - with CodeInterpreter() as sandbox: - sandbox.notebook.create_kernel() - - -def test_independence_of_kernels(): - with CodeInterpreter() as sandbox: - kernel_id = sandbox.notebook.create_kernel() - sandbox.notebook.exec_cell("x = 1") - - r = sandbox.notebook.exec_cell("x", kernel_id=kernel_id) - assert r.error.value == "name 'x' is not defined" - - -def test_restart_kernel(): - with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell("x = 1") - sandbox.notebook.restart_kernel() - - r = sandbox.notebook.exec_cell("x") - assert r.error.value == "name 'x' is not defined" - - -def test_list_kernels(): - with CodeInterpreter() as sandbox: - kernels = sandbox.notebook.list_kernels() - assert len(kernels) == 1 - - kernel_id = sandbox.notebook.create_kernel() - kernels = sandbox.notebook.list_kernels() - assert kernel_id in kernels - assert len(kernels) == 2 - - -def test_shutdown(): - with CodeInterpreter() as sandbox: - kernel_id = sandbox.notebook.create_kernel() - kernels = sandbox.notebook.list_kernels() - assert kernel_id in kernels - assert len(kernels) == 2 - - sandbox.notebook.shutdown_kernel(kernel_id) - kernels = sandbox.notebook.list_kernels() - assert kernel_id not in kernels - assert len(kernels) == 1 diff --git a/python/tests/test_statefulness.py b/python/tests/test_statefulness.py deleted file mode 100644 index 36b85e10..00000000 --- a/python/tests/test_statefulness.py +++ /dev/null @@ -1,9 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_stateful(): - with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell("x = 1") - - result = sandbox.notebook.exec_cell("x+=1; x") - assert result.text == "2" diff --git a/python/tests/test_streaming.py b/python/tests/test_streaming.py deleted file mode 100644 index fd0053cd..00000000 --- a/python/tests/test_streaming.py +++ /dev/null @@ -1,47 +0,0 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter - - -def test_streaming_output(): - out = [] - with CodeInterpreter() as sandbox: - - def test(line) -> int: - out.append(line) - return 1 - - sandbox.notebook.exec_cell("print(1)", on_stdout=test) - - assert len(out) == 1 - assert out[0].line == "1\n" - - -def test_streaming_error(): - out = [] - with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell( - "import sys;print(1, file=sys.stderr)", on_stderr=out.append - ) - - assert len(out) == 1 - assert out[0].line == "1\n" - - -def test_streaming_result(): - code = """ - import matplotlib.pyplot as plt - import numpy as np - - x = np.linspace(0, 20, 100) - y = np.sin(x) - - plt.plot(x, y) - plt.show() - - x - """ - - out = [] - with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell(code, on_result=out.append) - - assert len(out) == 2 From e1ae188d3b647e7daaf3f8cda317af41da67515c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 13:54:16 +0200 Subject: [PATCH 093/722] Fix streaming --- python/async_example.py | 37 +++++++++++ .../code_interpreter_async.py | 65 ++++++++++--------- .../code_interpreter_sync.py | 51 +++++++-------- python/example.py | 15 ++--- template/server/api/models/output.py | 13 ++-- template/server/main.py | 11 ++-- template/server/messaging.py | 8 ++- template/server/stream.py | 18 ++--- 8 files changed, 125 insertions(+), 93 deletions(-) create mode 100644 python/async_example.py diff --git a/python/async_example.py b/python/async_example.py new file mode 100644 index 00000000..613bd0cf --- /dev/null +++ b/python/async_example.py @@ -0,0 +1,37 @@ +import asyncio + +from dotenv import load_dotenv + +from e2b_code_interpreter import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + +load_dotenv() + + +code = """ +import matplotlib.pyplot as plt +import numpy as np +import time + +print("1") +time.sleep(10) + +import pandas +pandas.DataFrame({"a": [1, 2, 3]}) +""" + + +async def run(): + sandbox = await AsyncCodeInterpreter.connect("", debug=True) + print(sandbox.sandbox_id) + execution = await sandbox.notebook.exec_cell( + code, + on_stdout=lambda msg: print("stdout", msg), + on_stderr=lambda msg: print("stderr", msg), + ) + + print(execution.results[0].formats()) + print(len(execution.results)) + + +asyncio.run(run()) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index b2615b0d..af8197b6 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -42,8 +42,11 @@ async def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout + execution = Execution() + async with AsyncClient(transport=self._transport) as client: - response = await client.post( + async with client.stream( + "POST", self._url, json={ "code": code, @@ -51,37 +54,35 @@ async def exec_cell( # "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) - - response.raise_for_status() - - execution = Execution() - - async for line in response.aiter_lines(): - data = json.loads(line) - data_type = data.pop("type") - - if data_type == "result": - result = Result(**data) - execution.results.append(result) - if on_result: - cb = on_result(result) - if inspect.isawaitable(cb): - await cb - elif data_type == "stdout": - execution.logs.stdout += data["value"] - if on_stdout: - cb = on_stdout(data["value"]) - if inspect.isawaitable(cb): - await cb - elif data_type == "stderr": - execution.logs.stderr += data["value"] - if on_stderr: - cb = on_stderr(data["value"]) - if inspect.isawaitable(cb): - await cb - elif data_type == "error": - execution.error = Error(**data) + ) as response: + + response.raise_for_status() + + async for line in response.aiter_lines(): + data = json.loads(line) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + if on_result: + cb = on_result(result) + if inspect.isawaitable(cb): + await cb + elif data_type == "stdout": + execution.logs.stdout += data["value"] + if on_stdout: + cb = on_stdout(data["value"]) + if inspect.isawaitable(cb): + await cb + elif data_type == "stderr": + execution.logs.stderr += data["value"] + if on_stderr: + cb = on_stderr(data["value"]) + if inspect.isawaitable(cb): + await cb + elif data_type == "error": + execution.error = Error(**data) return execution diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index f8c18552..f7d01ac7 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -44,9 +44,11 @@ def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout + execution = Execution() with Client(transport=self._transport) as client: - response = client.post( + with client.stream( + "POST", self._url, json={ "code": code, @@ -54,31 +56,28 @@ def exec_cell( # "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) - - response.raise_for_status() - - execution = Execution() - - for line in response.iter_lines(): - data = json.loads(line) - data_type = data.pop("type") - - if data_type == "result": - result = Result(**data) - execution.results.append(result) - if on_result: - on_result(result) - elif data_type == "stdout": - execution.logs.stdout += data["value"] - if on_stdout: - on_stdout(data["value"]) - elif data_type == "stderr": - execution.logs.stderr += data["value"] - if on_stderr: - on_stderr(data["value"]) - elif data_type == "error": - execution.error = Error(**data) + ) as response: + response.raise_for_status() + + for line in response.iter_lines(): + data = json.loads(line) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + if on_result: + on_result(result) + elif data_type == "stdout": + execution.logs.stdout += data["value"] + if on_stdout: + on_stdout(data["value"]) + elif data_type == "stderr": + execution.logs.stderr += data["value"] + if on_stderr: + on_stderr(data["value"]) + elif data_type == "error": + execution.error = Error(**data) return execution diff --git a/python/example.py b/python/example.py index bc482275..a6320b49 100644 --- a/python/example.py +++ b/python/example.py @@ -7,17 +7,10 @@ code = """ import matplotlib.pyplot as plt import numpy as np +import time -x = np.linspace(0, 20, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.show() - -x = np.linspace(0, 10, 100) - -plt.plot(x, y) -plt.show() +print("1") +time.sleep(10) import pandas pandas.DataFrame({"a": [1, 2, 3]}) @@ -25,7 +18,7 @@ sandbox = CodeInterpreter.connect("", debug=True) print(sandbox.sandbox_id) -execution = sandbox.notebook.exec_code( +execution = sandbox.notebook.exec_cell( code, on_stdout=lambda msg: print("stdout", msg), on_stderr=lambda msg: print("stderr", msg), diff --git a/template/server/api/models/output.py b/template/server/api/models/output.py index c0b81796..3d79447e 100644 --- a/template/server/api/models/output.py +++ b/template/server/api/models/output.py @@ -45,11 +45,10 @@ class Output(BaseModel): value: Optional[str] = None traceback: Optional[str] = None - def __init__(self, type: OutputType, data: Dict[str, str] = None, is_main_result:Optional[bool] = None): - super().__init__() - self.type = type + def __init__(self, type: OutputType, data: Dict[str, str] = None, is_main_result: Optional[bool] = None): + super().__init__(type=type, is_main_result=is_main_result) - self.is_main_result = is_main_result + data = data or {} self.text = data.pop("text/plain", None) self.html = data.pop("text/html", None) @@ -70,13 +69,13 @@ def __init__(self, type: OutputType, data: Dict[str, str] = None, is_main_resul self.extra = data - def __str__(self) -> Optional[str]: + def __str__(self) -> str: """ Returns the text representation of the data. :return: The text representation of the data. """ - return self.text + return self.__repr__() def __repr__(self) -> str: if self.type == OutputType.RESULT: @@ -87,3 +86,5 @@ def __repr__(self) -> str: return f"Stdout({self.stdout})" elif self.type == OutputType.STDERR: return f"Stderr({self.stderr})" + elif self.type == OutputType.END_OF_EXECUTION: + return f"END_OF_EXECUTION" diff --git a/template/server/main.py b/template/server/main.py index 2d642510..d2270fc4 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -2,17 +2,18 @@ import logging import uuid from contextlib import asynccontextmanager -from typing import Dict +from typing import Dict, List from fastapi import FastAPI from messaging import JupyterKernelWebSocket from api.models.output import Output from api.models.execution_request import ExecutionRequest -from stream import StreamingJsonListResponse +from stream import StreamingLisJsonResponse + +logging.basicConfig(level=logging.DEBUG) logger = logging.Logger(__name__) -logger.setLevel(logging.DEBUG) session_id = str(uuid.uuid4()) @@ -54,10 +55,10 @@ def health(): return "Request was successful" -@app.post("/execute", response_model=Output, response_model_exclude_none=True) +@app.post("/execute") async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") ws = websockets["default"] - return StreamingJsonListResponse(ws.execute(code=request.code)) + return StreamingLisJsonResponse(ws.execute(request.code)) diff --git a/template/server/messaging.py b/template/server/messaging.py index ab05a0dd..5e218e3a 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -1,5 +1,6 @@ import json import logging +import time import uuid import asyncio import random @@ -98,6 +99,7 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: ) async def execute(self, code: str) -> AsyncIterable[Output]: + x = (time.time()) message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") @@ -109,12 +111,14 @@ async def execute(self, code: str) -> AsyncIterable[Output]: queue = self._executions[message_id].queue while True: output = await queue.get() - if output.type == "end_of_execution": + if output.type == OutputType.END_OF_EXECUTION: break logger.debug(f"Got result for code ({message_id}): {output}") - yield output + yield output.model_dump(exclude_none=True) + print(x - time.time()) + print("FINISH", x - time.time()) del self._executions[message_id] async def _receive_message(self): diff --git a/template/server/stream.py b/template/server/stream.py index 2287a1d6..ded29251 100644 --- a/template/server/stream.py +++ b/template/server/stream.py @@ -17,7 +17,7 @@ async def async_enumerate(async_sequence: AsyncIterable, start=0): idx += 1 -class StreamingJsonListResponse(StreamingResponse): +class StreamingLisJsonResponse(StreamingResponse): """Converts a pydantic model generator into a streaming HTTP Response that streams a JSON list, one element at a time. @@ -48,20 +48,16 @@ async def _encoded_async_generator(self, async_generator: AsyncIterable): """Converts an asynchronous pydantic model generator into a streaming JSON list """ - yield "[" async for idx, item in async_enumerate(async_generator): - if idx > 0: - yield "," - yield json.dumps(jsonable_encoder(item.dict())) - yield "]" + yield json.dumps(jsonable_encoder(item)) + yield "\n" + yield '{"type": "end_of_execution"}' async def _encoded_generator(self, generator): """Converts a synchronous pydantic model generator into a streaming JSON list """ - yield "[" for idx, item in enumerate(generator): - if idx > 0: - yield "," - yield json.dumps(jsonable_encoder(item.dict())) - yield "]" + yield json.dumps(jsonable_encoder(item)) + yield "\n" + yield '{"type": "end_of_execution"}' From 9e19f691baf10b628844b6726da3b9761192ef9c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 15:28:56 +0200 Subject: [PATCH 094/722] Fix streaming --- .../code_interpreter_async.py | 34 +------ .../code_interpreter_sync.py | 29 +----- python/e2b_code_interpreter/models.py | 38 +++++++- python/tests/sync/test_streaming.py | 8 +- template/server/api/models/error.py | 17 ++++ .../server/api/models/execution_request.py | 92 +------------------ template/server/api/models/logs.py | 19 ++++ template/server/api/models/output.py | 70 ++------------ template/server/api/models/result.py | 69 ++++++++++++++ template/server/main.py | 3 +- template/server/messaging.py | 45 +++++---- 11 files changed, 190 insertions(+), 234 deletions(-) create mode 100644 template/server/api/models/error.py create mode 100644 template/server/api/models/logs.py create mode 100644 template/server/api/models/result.py diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index af8197b6..22ba8cc4 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,14 +1,13 @@ -import json import logging -import inspect from typing import Optional + from httpx import AsyncHTTPTransport, AsyncClient -from e2b import AsyncSandbox, ConnectionConfig, Stderr, Stdout, OutputHandler -from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT -from e2b_code_interpreter.models import Execution, Result, Error +from e2b import AsyncSandbox, ConnectionConfig, Stdout, Stderr +from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT +from e2b_code_interpreter.models import Execution, Result, parse_output, OutputHandler logger = logging.getLogger(__name__) @@ -59,30 +58,7 @@ async def exec_cell( response.raise_for_status() async for line in response.aiter_lines(): - data = json.loads(line) - data_type = data.pop("type") - - if data_type == "result": - result = Result(**data) - execution.results.append(result) - if on_result: - cb = on_result(result) - if inspect.isawaitable(cb): - await cb - elif data_type == "stdout": - execution.logs.stdout += data["value"] - if on_stdout: - cb = on_stdout(data["value"]) - if inspect.isawaitable(cb): - await cb - elif data_type == "stderr": - execution.logs.stderr += data["value"] - if on_stderr: - cb = on_stderr(data["value"]) - if inspect.isawaitable(cb): - await cb - elif data_type == "error": - execution.error = Error(**data) + parse_output(execution, line, on_stdout, on_stderr, on_result) return execution diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index f7d01ac7..67ecc684 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,20 +1,14 @@ -import json import logging -from typing import Optional, Dict, Callable, TypeVar +from typing import Optional, Dict from httpx import HTTPTransport, Client from e2b import Sandbox, Stderr, Stdout, ConnectionConfig from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT -from e2b_code_interpreter.models import Execution, Result, Error - +from e2b_code_interpreter.models import Execution, Result, parse_output, OutputHandler logger = logging.getLogger(__name__) -T = TypeVar("T") - -OutputHandler = Callable[[T], None] - class JupyterExtension: _exec_timeout = 300 @@ -60,24 +54,7 @@ def exec_cell( response.raise_for_status() for line in response.iter_lines(): - data = json.loads(line) - data_type = data.pop("type") - - if data_type == "result": - result = Result(**data) - execution.results.append(result) - if on_result: - on_result(result) - elif data_type == "stdout": - execution.logs.stdout += data["value"] - if on_stdout: - on_stdout(data["value"]) - elif data_type == "stderr": - execution.logs.stderr += data["value"] - if on_stderr: - on_stderr(data["value"]) - elif data_type == "error": - execution.error = Error(**data) + parse_output(execution, line, on_stdout=on_stdout, on_stderr=on_stderr, on_result=on_result) return execution diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 7aa0c992..364baf28 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,5 +1,12 @@ import json -from typing import List, Optional, Iterable, Dict +from typing import List, Optional, Iterable, Dict, TypeVar, Callable + +from e2b.sandbox.process.process_handle import Stdout, Stderr + + +T = TypeVar("T") + +OutputHandler = Callable[[T], None] class Error: @@ -309,3 +316,32 @@ class KernelException(Exception): """ pass + + +def parse_output( + execution: Execution, + output: str, + on_stdout: Optional[OutputHandler[Stdout]] = None, + on_stderr: Optional[OutputHandler[Stderr]] = None, + on_result: Optional[OutputHandler[Result]] = None, +) -> None: + data = json.loads(output) + data_type = data.pop("type") + + if data_type == "result": + result = Result(**data) + execution.results.append(result) + if on_result: + on_result(result) + elif data_type == "stdout": + execution.logs.stdout += data['text'] + if on_stdout: + on_stdout(data["text"]) + elif data_type == "stderr": + execution.logs.stderr += data["text"] + if on_stderr: + on_stderr(data["text"]) + elif data_type == "error": + execution.error = Error(**data) + elif data_type == "execution_count": + execution.execution_count = data["execution_count"] diff --git a/python/tests/sync/test_streaming.py b/python/tests/sync/test_streaming.py index f573877b..ea46b78f 100644 --- a/python/tests/sync/test_streaming.py +++ b/python/tests/sync/test_streaming.py @@ -4,14 +4,14 @@ def test_streaming_output(sandbox: CodeInterpreter): out = [] - def test(line) -> int: + def test(line) -> None: out.append(line) - return 1 + return sandbox.notebook.exec_cell("print(1)", on_stdout=test) assert len(out) == 1 - assert out[0].line == "1\n" + assert out[0] == "1\n" def test_streaming_error(sandbox: CodeInterpreter): @@ -22,7 +22,7 @@ def test_streaming_error(sandbox: CodeInterpreter): ) assert len(out) == 1 - assert out[0].line == "1\n" + assert out[0] == "1\n" def test_streaming_result(sandbox: CodeInterpreter): diff --git a/template/server/api/models/error.py b/template/server/api/models/error.py new file mode 100644 index 00000000..b17a6abc --- /dev/null +++ b/template/server/api/models/error.py @@ -0,0 +1,17 @@ +from typing import Optional +from pydantic import BaseModel, StrictStr +from pydantic import Field + +from api.models.output import OutputType + + +class Error(BaseModel): + type: OutputType = OutputType.ERROR + + name: Optional[StrictStr] = Field(default=None, description="Name of the exception") + value: Optional[StrictStr] = Field( + default=None, description="Value of the exception" + ) + traceback: Optional[StrictStr] = Field( + default=None, description="Traceback of the exception" + ) diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index b0ff03e2..ff47e1c2 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -1,101 +1,11 @@ -# coding: utf-8 - -""" - E2B Code Interpreter - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - - -from typing import Any, ClassVar, Dict, List, Optional +from typing import Any, Dict, Optional from pydantic import BaseModel, StrictStr from pydantic import Field -try: - from typing import Self -except ImportError: - from typing_extensions import Self - class ExecutionRequest(BaseModel): - """ - ExecutionRequest - """ # noqa: E501 - code: StrictStr = Field(description="Code to be executed") language: Optional[StrictStr] = Field( default=None, description="Language of the code to be executed" ) additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["code", "language"] - - model_config = {"populate_by_name": True, "validate_assignment": True} - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ExecutionRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * Fields in `self.additional_properties` are added to the output dict. - """ - _dict = self.model_dump( - by_alias=True, - exclude={ - "additional_properties", - }, - exclude_none=True, - ) - # puts key-value pairs in additional_properties in the top level - if self.additional_properties is not None: - for _key, _value in self.additional_properties.items(): - _dict[_key] = _value - - return _dict - - @classmethod - def from_dict(cls, obj: Dict) -> Self: - """Create an instance of ExecutionRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate( - {"code": obj.get("code"), "language": obj.get("language")} - ) - # store additional fields in additional_properties - for _key in obj.keys(): - if _key not in cls.__properties: - _obj.additional_properties[_key] = obj.get(_key) - - return _obj diff --git a/template/server/api/models/logs.py b/template/server/api/models/logs.py new file mode 100644 index 00000000..d9a433fe --- /dev/null +++ b/template/server/api/models/logs.py @@ -0,0 +1,19 @@ +import datetime + + +from typing import Optional +from pydantic import BaseModel, StrictStr + +from api.models.output import OutputType + + +class Stdout(BaseModel): + type: OutputType = OutputType.STDOUT + text: Optional[StrictStr] = None + timestamp: Optional[datetime.datetime] = None + + +class Stderr(BaseModel): + type: OutputType = OutputType.STDERR + text: Optional[StrictStr] = None + timestamp: Optional[datetime.datetime] = None diff --git a/template/server/api/models/output.py b/template/server/api/models/output.py index 3d79447e..5121cc89 100644 --- a/template/server/api/models/output.py +++ b/template/server/api/models/output.py @@ -19,72 +19,14 @@ class OutputType(Enum): STDERR = "stderr" RESULT = "result" ERROR = "error" + NUMBER_OF_EXECUTIONS = "number_of_executions" END_OF_EXECUTION = "end_of_execution" -class Output(BaseModel): - type: OutputType +class EndOfExecution(BaseModel): + type: OutputType = OutputType.END_OF_EXECUTION - text: Optional[str] = None - html: Optional[str] = None - markdown: Optional[str] = None - svg: Optional[str] = None - png: Optional[str] = None - jpeg: Optional[str] = None - pdf: Optional[str] = None - latex: Optional[str] = None - json: Optional[dict] = None - javascript: Optional[str] = None - extra: Optional[dict] = None - is_main_result: Optional[bool] = None - stdout: Optional[str] = None - stderr: Optional[str] = None - - name: Optional[str] = None - value: Optional[str] = None - traceback: Optional[str] = None - - def __init__(self, type: OutputType, data: Dict[str, str] = None, is_main_result: Optional[bool] = None): - super().__init__(type=type, is_main_result=is_main_result) - - data = data or {} - - self.text = data.pop("text/plain", None) - self.html = data.pop("text/html", None) - self.markdown = data.pop("text/markdown", None) - self.svg = data.pop("image/svg+xml", None) - self.png = data.pop("image/png", None) - self.jpeg = data.pop("image/jpeg", None) - self.pdf = data.pop("application/pdf", None) - self.latex = data.pop("text/latex", None) - self.json = data.pop("application/json", None) - self.javascript = data.pop("application/javascript", None) - - self.name = data.pop("ename", None) - self.value = data.pop("evalue", None) or data.pop("text", None) - self.traceback = data.pop("traceback", None) - if self.traceback: - self.traceback = "\n".join(self.traceback) - - self.extra = data - - def __str__(self) -> str: - """ - Returns the text representation of the data. - - :return: The text representation of the data. - """ - return self.__repr__() - - def __repr__(self) -> str: - if self.type == OutputType.RESULT: - return f"Result({self.text})" - elif self.type == OutputType.ERROR: - return f"Error({self.name}, {self.value}, {self.traceback})" - elif self.type == OutputType.STDOUT: - return f"Stdout({self.stdout})" - elif self.type == OutputType.STDERR: - return f"Stderr({self.stderr})" - elif self.type == OutputType.END_OF_EXECUTION: - return f"END_OF_EXECUTION" +class NumberOfExecutions(BaseModel): + type: OutputType = OutputType.NUMBER_OF_EXECUTIONS + execution_count: int diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py new file mode 100644 index 00000000..5465d3cf --- /dev/null +++ b/template/server/api/models/result.py @@ -0,0 +1,69 @@ +from __future__ import annotations + + +from typing import Optional +from pydantic import BaseModel + +from api.models.output import OutputType + +try: + from typing import Self +except ImportError: + from typing_extensions import Self + + +class Result(BaseModel): + """ + Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. + The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + + The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented + as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, + for the actual result the representation is always present for the result, the other representations are always optional. + + The class also provides methods to display the data in a Jupyter notebook. + """ + type: OutputType = OutputType.RESULT + + text: Optional[str] = None + html: Optional[str] = None + markdown: Optional[str] = None + svg: Optional[str] = None + png: Optional[str] = None + jpeg: Optional[str] = None + pdf: Optional[str] = None + latex: Optional[str] = None + json: Optional[dict] = None + javascript: Optional[str] = None + extra: Optional[dict] = None + "Extra data that can be included. Not part of the standard types." + + is_main_result: Optional[bool] = None + "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." + + def __init__(self, is_main_result: bool, data: [str, str]): + super().__init__() + self.is_main_result = is_main_result + + self.text = data.pop("text/plain", None) + self.html = data.pop("text/html", None) + self.markdown = data.pop("text/markdown", None) + self.svg = data.pop("image/svg+xml", None) + self.png = data.pop("image/png", None) + self.jpeg = data.pop("image/jpeg", None) + self.pdf = data.pop("application/pdf", None) + self.latex = data.pop("text/latex", None) + self.json = data.pop("application/json", None) + self.javascript = data.pop("application/javascript", None) + self.extra = data + + def __str__(self) -> Optional[str]: + """ + Returns the text representation of the data. + + :return: The text representation of the data. + """ + return self.text + + def __repr__(self) -> str: + return f"Result({self.text})" diff --git a/template/server/main.py b/template/server/main.py index d2270fc4..fb525a03 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -2,12 +2,11 @@ import logging import uuid from contextlib import asynccontextmanager -from typing import Dict, List +from typing import Dict from fastapi import FastAPI from messaging import JupyterKernelWebSocket -from api.models.output import Output from api.models.execution_request import ExecutionRequest from stream import StreamingLisJsonResponse diff --git a/template/server/messaging.py b/template/server/messaging.py index 5e218e3a..3892e1ea 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -1,6 +1,5 @@ import json import logging -import time import uuid import asyncio import random @@ -8,11 +7,14 @@ from typing import Callable, Dict, Any, AsyncIterator, List, AsyncIterable - -from api.models.output import Output, OutputType +from api.models.error import Error +from api.models.logs import Stdout, Stderr +from api.models.result import Result +from api.models.output import EndOfExecution, NumberOfExecutions, OutputType from websockets.legacy.client import WebSocketClientProtocol, Connect from websockets.exceptions import ConnectionClosed + TIMEOUT = 60 @@ -98,8 +100,7 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: } ) - async def execute(self, code: str) -> AsyncIterable[Output]: - x = (time.time()) + async def execute(self, code: str) -> AsyncIterable: message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") @@ -116,9 +117,7 @@ async def execute(self, code: str) -> AsyncIterable[Output]: logger.debug(f"Got result for code ({message_id}): {output}") yield output.model_dump(exclude_none=True) - print(x - time.time()) - print("FINISH", x - time.time()) del self._executions[message_id] async def _receive_message(self): @@ -156,40 +155,52 @@ async def _process_message(self, data: dict): queue = execution.queue if data["msg_type"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Output(data=data["content"], type=OutputType.ERROR)) + await queue.put(Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback=data["content"]["traceback"], + )) elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": - await queue.put(Output(data=data['content'], type=OutputType.STDOUT)) + await queue.put(Stdout(text=data['content']['text'], timestamp=data['header']['date'])) elif data["content"]["name"] == "stderr": - await queue.put(Output(data=data['content'], type=OutputType.STDERR)) + await queue.put(Stderr(text=data['content']['text'], timestamp=data['header']['date'])) elif data["msg_type"] in "display_data": - await queue.put(Output(is_main_result=False, data=data["content"]["data"], type=OutputType.RESULT)) + await queue.put(Result(is_main_result=False, data=data["content"]["data"])) elif data["msg_type"] == "execute_result": - await queue.put(Output(is_main_result=True, data=data["content"]["data"], type=OutputType.RESULT)) + await queue.put(Result(is_main_result=True, data=data["content"]["data"])) elif data["msg_type"] == "status": if data["content"]["execution_state"] == "idle": if execution.input_accepted: logger.debug(f"Cell {parent_msg_ig} finished execution") - await queue.put(Output(type=OutputType.END_OF_EXECUTION)) + await queue.put(EndOfExecution()) elif data["content"]["execution_state"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Output(data=data["content"], type=OutputType.ERROR)) - await queue.put(Output(type=OutputType.END_OF_EXECUTION)) + await queue.put(Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback=data["content"]["traceback"], + )) + await queue.put(EndOfExecution()) elif data["msg_type"] == "execute_reply": if data["content"]["status"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Output(data=data["content"], type=OutputType.ERROR)) + await queue.put(Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback=data["content"]["traceback"], + )) elif data["content"]["status"] == "ok": pass elif data["msg_type"] == "execute_input": logger.debug(f"Input accepted for {parent_msg_ig}") - # execution.partial_result.execution_count = data["content"]["execution_count"] + await queue.put(NumberOfExecutions(execution_count=data["content"]["execution_count"])) execution.input_accepted = True else: logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") From 08b4f4fa561126aed597731baf3228cae96832d8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 15:58:37 +0200 Subject: [PATCH 095/722] Fix execution count --- python/e2b_code_interpreter/models.py | 2 +- template/server/messaging.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 364baf28..54639982 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -343,5 +343,5 @@ def parse_output( on_stderr(data["text"]) elif data_type == "error": execution.error = Error(**data) - elif data_type == "execution_count": + elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] diff --git a/template/server/messaging.py b/template/server/messaging.py index 3892e1ea..f0973cc2 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -158,7 +158,7 @@ async def _process_message(self, data: dict): await queue.put(Error( name=data["content"]["ename"], value=data["content"]["evalue"], - traceback=data["content"]["traceback"], + traceback="".join(data["content"]["traceback"]), )) elif data["msg_type"] == "stream": @@ -183,7 +183,7 @@ async def _process_message(self, data: dict): await queue.put(Error( name=data["content"]["ename"], value=data["content"]["evalue"], - traceback=data["content"]["traceback"], + traceback="".join(data["content"]["traceback"]), )) await queue.put(EndOfExecution()) @@ -193,7 +193,7 @@ async def _process_message(self, data: dict): await queue.put(Error( name=data["content"]["ename"], value=data["content"]["evalue"], - traceback=data["content"]["traceback"], + traceback=''.join(data["content"]["traceback"]), )) elif data["content"]["status"] == "ok": pass From bb3219164b2ad352dcebd61a2b82f88f7dae5479 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 16:04:41 +0200 Subject: [PATCH 096/722] Add async tests --- python/tests/async/test_bash.py | 6 +++ python/tests/async/test_basic.py | 6 +++ python/tests/async/test_display_data.py | 22 +++++++++++ python/tests/async/test_execution_count.py | 7 ++++ python/tests/async/test_kernels.py | 43 +++++++++++++++++++++ python/tests/async/test_reconnect.py | 9 +++++ python/tests/async/test_statefulness.py | 8 ++++ python/tests/async/test_streaming.py | 45 ++++++++++++++++++++++ 8 files changed, 146 insertions(+) create mode 100644 python/tests/async/test_bash.py create mode 100644 python/tests/async/test_basic.py create mode 100644 python/tests/async/test_display_data.py create mode 100644 python/tests/async/test_execution_count.py create mode 100644 python/tests/async/test_kernels.py create mode 100644 python/tests/async/test_reconnect.py create mode 100644 python/tests/async/test_statefulness.py create mode 100644 python/tests/async/test_streaming.py diff --git a/python/tests/async/test_bash.py b/python/tests/async/test_bash.py new file mode 100644 index 00000000..871e9fb8 --- /dev/null +++ b/python/tests/async/test_bash.py @@ -0,0 +1,6 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_bash(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell("!pwd") + assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/async/test_basic.py b/python/tests/async/test_basic.py new file mode 100644 index 00000000..946b8463 --- /dev/null +++ b/python/tests/async/test_basic.py @@ -0,0 +1,6 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_basic(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell("x =1; x") + assert result.text == "1" diff --git a/python/tests/async/test_display_data.py b/python/tests/async/test_display_data.py new file mode 100644 index 00000000..976f552e --- /dev/null +++ b/python/tests/async/test_display_data.py @@ -0,0 +1,22 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_display_data(async_sandbox: AsyncCodeInterpreter): + # plot random graph + result = await async_sandbox.notebook.exec_cell( + """ + import matplotlib.pyplot as plt + import numpy as np + + x = np.linspace(0, 20, 100) + y = np.sin(x) + + plt.plot(x, y) + plt.show() + """ + ) + + # there's your image + data = result.results[0] + assert data.png + assert data.text diff --git a/python/tests/async/test_execution_count.py b/python/tests/async/test_execution_count.py new file mode 100644 index 00000000..01337f6e --- /dev/null +++ b/python/tests/async/test_execution_count.py @@ -0,0 +1,7 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_execution_count(async_sandbox: AsyncCodeInterpreter): + await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") + result = await async_sandbox.notebook.exec_cell("!pwd") + assert result.execution_count == 2 diff --git a/python/tests/async/test_kernels.py b/python/tests/async/test_kernels.py new file mode 100644 index 00000000..da94c9af --- /dev/null +++ b/python/tests/async/test_kernels.py @@ -0,0 +1,43 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_create_new_kernel(async_sandbox: AsyncCodeInterpreter): + await async_sandbox.notebook.create_kernel() + + +async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): + kernel_id = await async_sandbox.notebook.create_kernel() + await async_sandbox.notebook.exec_cell("x = 1") + + r = await async_sandbox.notebook.exec_cell("x", kernel_id=kernel_id) + assert r.error.value == "name 'x' is not defined" + + +async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): + await async_sandbox.notebook.exec_cell("x = 1") + await async_sandbox.notebook.restart_kernel() + + r = await async_sandbox.notebook.exec_cell("x") + assert r.error.value == "name 'x' is not defined" + + +async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): + kernels = await async_sandbox.notebook.list_kernels() + assert len(kernels) == 1 + + kernel_id = await async_sandbox.notebook.create_kernel() + kernels = await async_sandbox.notebook.list_kernels() + assert kernel_id in kernels + assert len(kernels) == 2 + + +async def test_shutdown(async_sandbox: AsyncCodeInterpreter): + kernel_id = await async_sandbox.notebook.create_kernel() + kernels = await async_sandbox.notebook.list_kernels() + assert kernel_id in kernels + assert len(kernels) == 2 + + await async_sandbox.notebook.shutdown_kernel(kernel_id) + kernels = await async_sandbox.notebook.list_kernels() + assert kernel_id not in kernels + assert len(kernels) == 1 diff --git a/python/tests/async/test_reconnect.py b/python/tests/async/test_reconnect.py new file mode 100644 index 00000000..acccd0b8 --- /dev/null +++ b/python/tests/async/test_reconnect.py @@ -0,0 +1,9 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_reconnect(async_sandbox: AsyncCodeInterpreter): + sandbox_id = async_sandbox.sandbox_id + + sandbox2 = await AsyncCodeInterpreter.connect(sandbox_id) + result = await sandbox2.notebook.exec_cell("x =1; x") + assert result.text == "1" diff --git a/python/tests/async/test_statefulness.py b/python/tests/async/test_statefulness.py new file mode 100644 index 00000000..bae8e301 --- /dev/null +++ b/python/tests/async/test_statefulness.py @@ -0,0 +1,8 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_stateful(async_sandbox: AsyncCodeInterpreter): + await async_sandbox.notebook.exec_cell("x = 1") + + result = await async_sandbox.notebook.exec_cell("x+=1; x") + assert result.text == "2" diff --git a/python/tests/async/test_streaming.py b/python/tests/async/test_streaming.py new file mode 100644 index 00000000..2cc41a58 --- /dev/null +++ b/python/tests/async/test_streaming.py @@ -0,0 +1,45 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_streaming_output(async_sandbox: AsyncCodeInterpreter): + out = [] + + def test(line) -> None: + out.append(line) + return + + await async_sandbox.notebook.exec_cell("print(1)", on_stdout=test) + + assert len(out) == 1 + assert out[0] == "1\n" + + +async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): + out = [] + + await async_sandbox.notebook.exec_cell( + "import sys;print(1, file=sys.stderr)", on_stderr=out.append + ) + + assert len(out) == 1 + assert out[0] == "1\n" + + +async def test_streaming_result(async_sandbox: AsyncCodeInterpreter): + code = """ + import matplotlib.pyplot as plt + import numpy as np + + x = np.linspace(0, 20, 100) + y = np.sin(x) + + plt.plot(x, y) + plt.show() + + x + """ + + out = [] + await async_sandbox.notebook.exec_cell(code, on_result=out.append) + + assert len(out) == 2 From ace76ec6faa9e8aa85f6005cc87dec9a130c9cf8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 17:10:54 +0200 Subject: [PATCH 097/722] Add create kernel method --- .../code_interpreter_sync.py | 15 +++++-- template/server/api/models/create_kernel.py | 11 +++++ .../server/api/models/execution_request.py | 2 +- template/server/main.py | 43 ++++++++++++++++++- 4 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 template/server/api/models/create_kernel.py diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 67ecc684..18c7d489 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -43,11 +43,11 @@ def exec_cell( with Client(transport=self._transport) as client: with client.stream( "POST", - self._url, + f"{self._url}/execute", json={ "code": code, # "language": language, - # "kernel_id": kernel_id, + "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -58,6 +58,15 @@ def exec_cell( return execution + def create_kernel(self, language: Optional[str] = None): + logger.debug(f"Creating new kernel for language: {language}") + + with Client(transport=self._transport) as client: + response = client.post(f"{self._url}/contexts", json={"language": language}) + response.raise_for_status() + + return response.json() + class CodeInterpreter(Sandbox): default_template = DEFAULT_TEMPLATE @@ -89,7 +98,7 @@ def __init__( request_timeout=request_timeout, ) - jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}/execute" + jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" self._notebook = JupyterExtension( jupyter_url, self._transport, self.connection_config ) diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py new file mode 100644 index 00000000..f099e65d --- /dev/null +++ b/template/server/api/models/create_kernel.py @@ -0,0 +1,11 @@ +from typing import Any, Dict, Optional +from pydantic import BaseModel, StrictStr +from pydantic import Field + + +class CreateKernel(BaseModel): + cwd: Optional[StrictStr] = Field(default=None, description="Current working directory") + language: Optional[StrictStr] = Field( + default=None, description="Language of the code to be executed" + ) + kernel_name: Optional[StrictStr] = Field(default=None, description="Name of the kernel") diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index ff47e1c2..46668451 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -8,4 +8,4 @@ class ExecutionRequest(BaseModel): language: Optional[StrictStr] = Field( default=None, description="Language of the code to be executed" ) - additional_properties: Dict[str, Any] = {} + kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/main.py b/template/server/main.py index fb525a03..23f2b93f 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -4,8 +4,10 @@ from contextlib import asynccontextmanager from typing import Dict +import requests from fastapi import FastAPI +from api.models.create_kernel import CreateKernel from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest from stream import StreamingLisJsonResponse @@ -58,6 +60,45 @@ def health(): async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") - ws = websockets["default"] + if request.kernel_id: + ws = websockets.get(request.kernel_id, websockets["default"]) + else: + ws = websockets["default"] return StreamingLisJsonResponse(ws.execute(request.code)) + + +@app.post("/contexts") +async def create_kernel(request: CreateKernel): + logger.info(f"Creating new kernel for language: {request.language}") + + kernel_name = request.kernel_name or "python3" + cwd = request.cwd or "/home/user" + + data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name}, "type": "notebook", "name": str(uuid.uuid4())} + logger.debug(f"Creating kernel with data: {data}") + + response = requests.post("http://localhost:8888/api/sessions",json=data) + if not response.ok: + raise Exception(f"Failed to create kernel: {response.text}") + + session_data = response.json() + sess_id = session_data["id"] + _id = session_data["kernel"]["id"] + + response = requests.patch(f"http://localhost:8888/api/sessions/{sess_id}", json={"path": cwd}, ) + if not response.ok: + raise Exception(f"Failed to create kernel: {response.text}") + + logger.debug(f"Created kernel {kernel_id}") + + ws = JupyterKernelWebSocket( + f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id + ) + task = asyncio.create_task(ws.connect()) + await ws.started + + websockets[_id] = ws + + return kernel_id + From 2ca965b7a332bc7f672b688d3028a799c75d7f90 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 17:13:31 +0200 Subject: [PATCH 098/722] Add listing kernels --- template/server/main.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/template/server/main.py b/template/server/main.py index 23f2b93f..4e9d8f9c 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -102,3 +102,12 @@ async def create_kernel(request: CreateKernel): return kernel_id + +@app.get("/contexts") +async def list_kernels(): + logger.info(f"Listing kernels") + + kernel_ids = list(websockets.keys()) + kernel_ids.remove(kernel_id) + + return kernel_ids From 46afe1864f9cfa43cda400b238b68dbc6d2136e0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 10 Jul 2024 20:25:53 +0200 Subject: [PATCH 099/722] Add restart method --- .../code_interpreter_sync.py | 27 +++++++- python/example.py | 12 ++-- template/server/api/models/create_kernel.py | 4 ++ template/server/main.py | 62 +++++++++++++------ template/server/messaging.py | 7 ++- 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 18c7d489..0d33bcb1 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,6 +1,6 @@ import logging -from typing import Optional, Dict +from typing import Optional, Dict, List from httpx import HTTPTransport, Client from e2b import Sandbox, Stderr, Stdout, ConnectionConfig @@ -67,6 +67,31 @@ def create_kernel(self, language: Optional[str] = None): return response.json() + def restart_kernel(self, kernel_id: Optional[str] = None): + logger.debug(f"Creating new kernel for language: {kernel_id}") + + with Client(transport=self._transport) as client: + response = client.post(f"{self._url}/contexts/restart", json={"kernel_id": kernel_id}) + response.raise_for_status() + + return response.json() + + def list_kernels(self) -> List[str]: + """ + Lists all available Jupyter kernels. + + This method fetches a list of all currently available Jupyter kernels from the server. It can be used + to retrieve the IDs of all kernels that are currently running or available for connection. + + :param timeout: The timeout for the kernel list request. + :return: List of kernel ids + """ + with Client(transport=self._transport) as client: + response = client.get(f"{self._url}/contexts") + response.raise_for_status() + + return response.json() + class CodeInterpreter(Sandbox): default_template = DEFAULT_TEMPLATE diff --git a/python/example.py b/python/example.py index a6320b49..bd297350 100644 --- a/python/example.py +++ b/python/example.py @@ -17,12 +17,8 @@ """ sandbox = CodeInterpreter.connect("", debug=True) -print(sandbox.sandbox_id) -execution = sandbox.notebook.exec_cell( - code, - on_stdout=lambda msg: print("stdout", msg), - on_stderr=lambda msg: print("stderr", msg), -) +sandbox.notebook.exec_cell("x = 1") +sandbox.notebook.restart_kernel() -print(execution.results[0].formats()) -print(len(execution.results)) +r = sandbox.notebook.exec_cell("x") +assert r.error.value == "name 'x' is not defined" diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py index f099e65d..259eb83e 100644 --- a/template/server/api/models/create_kernel.py +++ b/template/server/api/models/create_kernel.py @@ -9,3 +9,7 @@ class CreateKernel(BaseModel): default=None, description="Language of the code to be executed" ) kernel_name: Optional[StrictStr] = Field(default=None, description="Name of the kernel") + + +class RestartKernel(BaseModel): + kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/main.py b/template/server/main.py index 4e9d8f9c..43e7cb38 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -7,7 +7,7 @@ import requests from fastapi import FastAPI -from api.models.create_kernel import CreateKernel +from api.models.create_kernel import CreateKernel, RestartKernel from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest from stream import StreamingLisJsonResponse @@ -16,21 +16,20 @@ logging.basicConfig(level=logging.DEBUG) logger = logging.Logger(__name__) - -session_id = str(uuid.uuid4()) - websockets: Dict[str, JupyterKernelWebSocket] = {} - -with open("/root/.jupyter/kernel_id") as file: - kernel_id = file.read().strip() +global default_kernel_id @asynccontextmanager async def lifespan(app: FastAPI): - # Load the ML model - default_ws = JupyterKernelWebSocket( - f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id - ) + # Load the default kernel + session_id = str(uuid.uuid4()) + + global default_kernel_id + with open("/root/.jupyter/kernel_id") as file: + default_kernel_id = file.read().strip() + + default_ws = JupyterKernelWebSocket(default_kernel_id, session_id) websockets["default"] = default_ws websockets["python"] = default_ws @@ -83,22 +82,20 @@ async def create_kernel(request: CreateKernel): raise Exception(f"Failed to create kernel: {response.text}") session_data = response.json() - sess_id = session_data["id"] - _id = session_data["kernel"]["id"] + session_id = session_data["id"] + kernel_id = session_data["kernel"]["id"] - response = requests.patch(f"http://localhost:8888/api/sessions/{sess_id}", json={"path": cwd}, ) + response = requests.patch(f"http://localhost:8888/api/sessions/{session_id}", json={"path": cwd}) if not response.ok: raise Exception(f"Failed to create kernel: {response.text}") logger.debug(f"Created kernel {kernel_id}") - ws = JupyterKernelWebSocket( - f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id - ) + ws = JupyterKernelWebSocket(kernel_id, session_id) task = asyncio.create_task(ws.connect()) await ws.started - websockets[_id] = ws + websockets[kernel_id] = ws return kernel_id @@ -108,6 +105,33 @@ async def list_kernels(): logger.info(f"Listing kernels") kernel_ids = list(websockets.keys()) - kernel_ids.remove(kernel_id) + kernel_ids.remove(default_kernel_id) return kernel_ids + + +@app.post("/contexts/restart") +async def restart_kernel(request: RestartKernel): + logger.info(f"Restarting kernel") + + kernel_id = request.kernel_id or "default" + + ws = websockets.get(kernel_id, None) + if not ws: + raise Exception(f"Kernel {kernel_id} not found") + + kernel_id = ws.kernel_id + session_id = ws.session_id + + await ws.close() + + response = requests.post(f"http://localhost:8888/api/kernels/{kernel_id}/restart") + if not response.ok: + raise Exception(f"Failed to restart kernel {kernel_id}") + + ws = JupyterKernelWebSocket(kernel_id, session_id) + + task = asyncio.create_task(ws.connect()) + await ws.started + + websockets[kernel_id] = ws diff --git a/template/server/messaging.py b/template/server/messaging.py index f0973cc2..a0641ac3 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -30,8 +30,9 @@ def __init__(self): class JupyterKernelWebSocket: _ws: WebSocketClientProtocol = None - def __init__(self, url: str, session_id: str): - self.url = url + def __init__(self, kernel_id: str, session_id: str): + self.kernel_id = kernel_id + self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" self.session_id = session_id self._executions: Dict[str, Execution] = {} self._process_cleanup: List[Callable[[], Any]] = [] @@ -39,7 +40,7 @@ def __init__(self, url: str, session_id: str): self._stopped = Future() self.started = Future() - async def connect(self, timeout: float = TIMEOUT): + async def connect(self): logger.debug(f"WebSocket connecting to {self.url}") ws_logger = logger.getChild("websockets.client") From 9b5c834370e8b82bd4a0886ddd95594d0cda3cec Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 11:44:31 -0700 Subject: [PATCH 100/722] Use async http lib; Add deps to requirements file; Improve types --- template/server/main.py | 36 ++++++++++----- template/server/messaging.py | 78 ++++++++++++++++++++++---------- template/server/requirements.txt | 2 + 3 files changed, 80 insertions(+), 36 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 23f2b93f..feb69188 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,29 +1,33 @@ import asyncio import logging import uuid -from contextlib import asynccontextmanager -from typing import Dict +import httpx -import requests +from typing import Dict, Union +from pydantic import StrictStr +from contextlib import asynccontextmanager from fastapi import FastAPI from api.models.create_kernel import CreateKernel -from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest +from messaging import JupyterKernelWebSocket from stream import StreamingLisJsonResponse -logging.basicConfig(level=logging.DEBUG) logger = logging.Logger(__name__) +logging.basicConfig(level=logging.DEBUG) + session_id = str(uuid.uuid4()) -websockets: Dict[str, JupyterKernelWebSocket] = {} +websockets: Dict[Union[str, StrictStr], JupyterKernelWebSocket] = {} with open("/root/.jupyter/kernel_id") as file: kernel_id = file.read().strip() +client = httpx.AsyncClient() + @asynccontextmanager async def lifespan(app: FastAPI): @@ -75,19 +79,28 @@ async def create_kernel(request: CreateKernel): kernel_name = request.kernel_name or "python3" cwd = request.cwd or "/home/user" - data = {"path": str(uuid.uuid4()), "kernel": {"name": kernel_name}, "type": "notebook", "name": str(uuid.uuid4())} + data = { + "path": str(uuid.uuid4()), + "kernel": {"name": kernel_name}, + "type": "notebook", + "name": str(uuid.uuid4()), + } logger.debug(f"Creating kernel with data: {data}") - response = requests.post("http://localhost:8888/api/sessions",json=data) - if not response.ok: + response = await client.post("http://localhost:8888/api/sessions", json=data) + + if not response.is_success: raise Exception(f"Failed to create kernel: {response.text}") session_data = response.json() sess_id = session_data["id"] _id = session_data["kernel"]["id"] - response = requests.patch(f"http://localhost:8888/api/sessions/{sess_id}", json={"path": cwd}, ) - if not response.ok: + response = await client.patch( + f"http://localhost:8888/api/sessions/{sess_id}", + json={"path": cwd}, + ) + if not response.is_success: raise Exception(f"Failed to create kernel: {response.text}") logger.debug(f"Created kernel {kernel_id}") @@ -101,4 +114,3 @@ async def create_kernel(request: CreateKernel): websockets[_id] = ws return kernel_id - diff --git a/template/server/messaging.py b/template/server/messaging.py index f0973cc2..cc413001 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -3,9 +3,19 @@ import uuid import asyncio import random -from asyncio import Future, Queue -from typing import Callable, Dict, Any, AsyncIterator, List, AsyncIterable +from asyncio import Future, Queue +from typing import ( + Callable, + Dict, + Any, + AsyncIterator, + List, + AsyncIterable, + Optional, + Union, +) +from pydantic import StrictStr from api.models.error import Error from api.models.logs import Stdout, Stderr @@ -28,7 +38,7 @@ def __init__(self): class JupyterKernelWebSocket: - _ws: WebSocketClientProtocol = None + _ws: Optional[WebSocketClientProtocol] = None def __init__(self, url: str, session_id: str): self.url = url @@ -78,7 +88,7 @@ async def connect(self, timeout: float = TIMEOUT): if self._stopped.done(): break - def _get_execute_request(self, msg_id: str, code: str) -> str: + def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: return json.dumps( { "header": { @@ -100,13 +110,16 @@ def _get_execute_request(self, msg_id: str, code: str) -> str: } ) - async def execute(self, code: str) -> AsyncIterable: + async def execute(self, code: Union[str, StrictStr]) -> AsyncIterable: message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") self._executions[message_id] = Execution() request = self._get_execute_request(message_id, code) + if self._ws is None: + raise Exception("WebSocket not connected") + await self._ws.send(request) queue = self._executions[message_id].queue @@ -155,18 +168,28 @@ async def _process_message(self, data: dict): queue = execution.queue if data["msg_type"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback="".join(data["content"]["traceback"]), - )) + await queue.put( + Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback="".join(data["content"]["traceback"]), + ) + ) elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": - await queue.put(Stdout(text=data['content']['text'], timestamp=data['header']['date'])) + await queue.put( + Stdout( + text=data["content"]["text"], timestamp=data["header"]["date"] + ) + ) elif data["content"]["name"] == "stderr": - await queue.put(Stderr(text=data['content']['text'], timestamp=data['header']['date'])) + await queue.put( + Stderr( + text=data["content"]["text"], timestamp=data["header"]["date"] + ) + ) elif data["msg_type"] in "display_data": await queue.put(Result(is_main_result=False, data=data["content"]["data"])) @@ -180,27 +203,33 @@ async def _process_message(self, data: dict): elif data["content"]["execution_state"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback="".join(data["content"]["traceback"]), - )) + await queue.put( + Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback="".join(data["content"]["traceback"]), + ) + ) await queue.put(EndOfExecution()) elif data["msg_type"] == "execute_reply": if data["content"]["status"] == "error": logger.debug(f"Cell {parent_msg_ig} finished execution with error") - await queue.put(Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback=''.join(data["content"]["traceback"]), - )) + await queue.put( + Error( + name=data["content"]["ename"], + value=data["content"]["evalue"], + traceback="".join(data["content"]["traceback"]), + ) + ) elif data["content"]["status"] == "ok": pass elif data["msg_type"] == "execute_input": logger.debug(f"Input accepted for {parent_msg_ig}") - await queue.put(NumberOfExecutions(execution_count=data["content"]["execution_count"])) + await queue.put( + NumberOfExecutions(execution_count=data["content"]["execution_count"]) + ) execution.input_accepted = True else: logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") @@ -208,7 +237,8 @@ async def _process_message(self, data: dict): async def close(self): logger.debug("Closing WebSocket") self._stopped.set_result(None) - await self._ws.close() + if self._ws is not None: + await self._ws.close() for handler in self._waiting_for_replies.values(): logger.debug(f"Cancelling waiting for execution result for {handler}") diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 61ad0d5f..d9ef5fb1 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -1 +1,3 @@ fastapi==0.111.0 +httpx==0.27.0 +websockets==12.0 From 8a48504344baec395f4988eb2159ae41a4d87bf9 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 12:07:31 -0700 Subject: [PATCH 101/722] Add python example command to package.json; Add command to start dockerized server to makefile --- Makefile | 4 ++++ python/package.json | 1 + 2 files changed, 5 insertions(+) diff --git a/Makefile b/Makefile index ee999617..7a1a65ef 100644 --- a/Makefile +++ b/Makefile @@ -9,3 +9,7 @@ generate: rm ./python/e2b_code_interpreter/client/.gitignore ./python/e2b_code_interpreter/client/pyproject.toml ./python/e2b_code_interpreter/client/README.md ./python/e2b_code_interpreter/client/py.typed rm -rf ./python/e2b_code_interpreter/client/e2b_code_interpreter_client black . + + +start-template-server: + docker run --rm -p 8000:8000 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) \ No newline at end of file diff --git a/python/package.json b/python/package.json index d24de01f..a49fb293 100644 --- a/python/package.json +++ b/python/package.json @@ -4,6 +4,7 @@ "version": "0.0.10", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", + "example": "poetry run python3 example.py", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install" From 261aaec032b7e860b674c6a0b254a310c539c8ca Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 12:37:27 -0700 Subject: [PATCH 102/722] Merge --- .../code_interpreter_sync.py | 27 ++++++- python/example.py | 12 +-- template/server/api/models/create_kernel.py | 4 + template/server/main.py | 80 ++++++++++++++----- template/server/messaging.py | 7 +- 5 files changed, 96 insertions(+), 34 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 18c7d489..0d33bcb1 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,6 +1,6 @@ import logging -from typing import Optional, Dict +from typing import Optional, Dict, List from httpx import HTTPTransport, Client from e2b import Sandbox, Stderr, Stdout, ConnectionConfig @@ -67,6 +67,31 @@ def create_kernel(self, language: Optional[str] = None): return response.json() + def restart_kernel(self, kernel_id: Optional[str] = None): + logger.debug(f"Creating new kernel for language: {kernel_id}") + + with Client(transport=self._transport) as client: + response = client.post(f"{self._url}/contexts/restart", json={"kernel_id": kernel_id}) + response.raise_for_status() + + return response.json() + + def list_kernels(self) -> List[str]: + """ + Lists all available Jupyter kernels. + + This method fetches a list of all currently available Jupyter kernels from the server. It can be used + to retrieve the IDs of all kernels that are currently running or available for connection. + + :param timeout: The timeout for the kernel list request. + :return: List of kernel ids + """ + with Client(transport=self._transport) as client: + response = client.get(f"{self._url}/contexts") + response.raise_for_status() + + return response.json() + class CodeInterpreter(Sandbox): default_template = DEFAULT_TEMPLATE diff --git a/python/example.py b/python/example.py index a6320b49..bd297350 100644 --- a/python/example.py +++ b/python/example.py @@ -17,12 +17,8 @@ """ sandbox = CodeInterpreter.connect("", debug=True) -print(sandbox.sandbox_id) -execution = sandbox.notebook.exec_cell( - code, - on_stdout=lambda msg: print("stdout", msg), - on_stderr=lambda msg: print("stderr", msg), -) +sandbox.notebook.exec_cell("x = 1") +sandbox.notebook.restart_kernel() -print(execution.results[0].formats()) -print(len(execution.results)) +r = sandbox.notebook.exec_cell("x") +assert r.error.value == "name 'x' is not defined" diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py index f099e65d..259eb83e 100644 --- a/template/server/api/models/create_kernel.py +++ b/template/server/api/models/create_kernel.py @@ -9,3 +9,7 @@ class CreateKernel(BaseModel): default=None, description="Language of the code to be executed" ) kernel_name: Optional[StrictStr] = Field(default=None, description="Name of the kernel") + + +class RestartKernel(BaseModel): + kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/main.py b/template/server/main.py index feb69188..1cbe7c11 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -3,38 +3,38 @@ import uuid import httpx -from typing import Dict, Union +from typing import Dict, Union, Literal from pydantic import StrictStr from contextlib import asynccontextmanager from fastapi import FastAPI -from api.models.create_kernel import CreateKernel +from api.models.create_kernel import CreateKernel, RestartKernel +from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket from stream import StreamingLisJsonResponse -logger = logging.Logger(__name__) - logging.basicConfig(level=logging.DEBUG) +logger = logging.Logger(__name__) +websockets: Dict[Union[str, StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} +global default_kernel_id -session_id = str(uuid.uuid4()) - -websockets: Dict[Union[str, StrictStr], JupyterKernelWebSocket] = {} - -with open("/root/.jupyter/kernel_id") as file: - kernel_id = file.read().strip() client = httpx.AsyncClient() @asynccontextmanager async def lifespan(app: FastAPI): - # Load the ML model - default_ws = JupyterKernelWebSocket( - f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id - ) + # Load the default kernel + session_id = str(uuid.uuid4()) + + global default_kernel_id + with open("/root/.jupyter/kernel_id") as file: + default_kernel_id = file.read().strip() + + default_ws = JupyterKernelWebSocket(default_kernel_id, session_id) websockets["default"] = default_ws websockets["python"] = default_ws @@ -93,24 +93,60 @@ async def create_kernel(request: CreateKernel): raise Exception(f"Failed to create kernel: {response.text}") session_data = response.json() - sess_id = session_data["id"] - _id = session_data["kernel"]["id"] + session_id = session_data["id"] + kernel_id = session_data["kernel"]["id"] response = await client.patch( - f"http://localhost:8888/api/sessions/{sess_id}", - json={"path": cwd}, + f"http://localhost:8888/api/sessions/{session_id}", json={"path": cwd} ) if not response.is_success: raise Exception(f"Failed to create kernel: {response.text}") logger.debug(f"Created kernel {kernel_id}") - ws = JupyterKernelWebSocket( - f"ws://localhost:8888/api/kernels/{kernel_id}/channels", session_id - ) + ws = JupyterKernelWebSocket(kernel_id, session_id) task = asyncio.create_task(ws.connect()) await ws.started - websockets[_id] = ws + websockets[kernel_id] = ws return kernel_id + + +@app.get("/contexts") +async def list_kernels(): + logger.info(f"Listing kernels") + + kernel_ids = list(websockets.keys()) + kernel_ids.remove(default_kernel_id) + + return kernel_ids + + +@app.post("/contexts/restart") +async def restart_kernel(request: RestartKernel): + logger.info(f"Restarting kernel") + + kernel_id = request.kernel_id or "default" + + ws = websockets.get(kernel_id, None) + if not ws: + raise Exception(f"Kernel {kernel_id} not found") + + kernel_id = ws.kernel_id + session_id = ws.session_id + + await ws.close() + + response = await client.post( + f"http://localhost:8888/api/kernels/{kernel_id}/restart" + ) + if not response.is_success: + raise Exception(f"Failed to restart kernel {kernel_id}") + + ws = JupyterKernelWebSocket(kernel_id, session_id) + + task = asyncio.create_task(ws.connect()) + await ws.started + + websockets[kernel_id] = ws diff --git a/template/server/messaging.py b/template/server/messaging.py index cc413001..79ea03b1 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -40,8 +40,9 @@ def __init__(self): class JupyterKernelWebSocket: _ws: Optional[WebSocketClientProtocol] = None - def __init__(self, url: str, session_id: str): - self.url = url + def __init__(self, kernel_id: str, session_id: str): + self.kernel_id = kernel_id + self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" self.session_id = session_id self._executions: Dict[str, Execution] = {} self._process_cleanup: List[Callable[[], Any]] = [] @@ -49,7 +50,7 @@ def __init__(self, url: str, session_id: str): self._stopped = Future() self.started = Future() - async def connect(self, timeout: float = TIMEOUT): + async def connect(self): logger.debug(f"WebSocket connecting to {self.url}") ws_logger = logger.getChild("websockets.client") From 6f1bf287b15a9944a295cd64a52907056fa5ea0e Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 12:48:45 -0700 Subject: [PATCH 103/722] Update deps; Modify workers count --- template/server/requirements.txt | 1 + template/start-up.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/template/server/requirements.txt b/template/server/requirements.txt index d9ef5fb1..ea4e389d 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -1,3 +1,4 @@ fastapi==0.111.0 httpx==0.27.0 websockets==12.0 +uvicorn[standard]==0.30.1 \ No newline at end of file diff --git a/template/start-up.sh b/template/start-up.sh index 139818af..da6e285b 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -26,7 +26,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null cd /root/.server/ - uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 --no-access-log --no-use-colors + uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 --no-access-log --no-use-colors } echo "Starting Code Interpreter server..." From 08215576ba4b60bf108db1ea7fdc82d2f7b6dc89 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 13:44:17 -0700 Subject: [PATCH 104/722] Add todos; Make requests async --- template/server/api/models/output.py | 1 - template/server/main.py | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/template/server/api/models/output.py b/template/server/api/models/output.py index 5121cc89..1a976aa8 100644 --- a/template/server/api/models/output.py +++ b/template/server/api/models/output.py @@ -1,7 +1,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Dict from pydantic import BaseModel try: diff --git a/template/server/main.py b/template/server/main.py index 1cbe7c11..7491b953 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -24,6 +24,11 @@ client = httpx.AsyncClient() +# TODO: Increase keepalive timeout +# TODO: Increase timeout for requests to allow streaming +# TODO: Handle pings from server so we can keep the connection from idling +# TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx + @asynccontextmanager async def lifespan(app: FastAPI): @@ -56,7 +61,7 @@ async def lifespan(app: FastAPI): @app.get("/health") -def health(): +async def health(): return "Request was successful" From 83706b968e99db512b7d5c3a8a587c41be5a98a3 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 13:53:21 -0700 Subject: [PATCH 105/722] Fix client usage --- .../code_interpreter_sync.py | 68 +++++++++++-------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 0d33bcb1..8e922dc5 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -13,6 +13,10 @@ class JupyterExtension: _exec_timeout = 300 + @property + def client(self) -> Client: + return Client(transport=self._transport) + def __init__( self, url: str, @@ -40,41 +44,48 @@ def exec_cell( request_timeout = request_timeout or self._connection_config.request_timeout execution = Execution() - with Client(transport=self._transport) as client: - with client.stream( - "POST", - f"{self._url}/execute", - json={ - "code": code, - # "language": language, - "kernel_id": kernel_id, - }, - timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) as response: - response.raise_for_status() + with self.client.stream( + "POST", + f"{self._url}/execute", + json={ + "code": code, + # "language": language, + "kernel_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) as response: + response.raise_for_status() - for line in response.iter_lines(): - parse_output(execution, line, on_stdout=on_stdout, on_stderr=on_stderr, on_result=on_result) + for line in response.iter_lines(): + parse_output( + execution, + line, + on_stdout=on_stdout, + on_stderr=on_stderr, + on_result=on_result, + ) - return execution + return execution def create_kernel(self, language: Optional[str] = None): logger.debug(f"Creating new kernel for language: {language}") - with Client(transport=self._transport) as client: - response = client.post(f"{self._url}/contexts", json={"language": language}) - response.raise_for_status() + response = self.client.post( + f"{self._url}/contexts", json={"language": language} + ) + response.raise_for_status() - return response.json() + return response.json() def restart_kernel(self, kernel_id: Optional[str] = None): logger.debug(f"Creating new kernel for language: {kernel_id}") - with Client(transport=self._transport) as client: - response = client.post(f"{self._url}/contexts/restart", json={"kernel_id": kernel_id}) - response.raise_for_status() + response = self.client.post( + f"{self._url}/contexts/restart", json={"kernel_id": kernel_id} + ) + response.raise_for_status() - return response.json() + return response.json() def list_kernels(self) -> List[str]: """ @@ -86,11 +97,10 @@ def list_kernels(self) -> List[str]: :param timeout: The timeout for the kernel list request. :return: List of kernel ids """ - with Client(transport=self._transport) as client: - response = client.get(f"{self._url}/contexts") - response.raise_for_status() + response = self.client.get(f"{self._url}/contexts") + response.raise_for_status() - return response.json() + return response.json() class CodeInterpreter(Sandbox): @@ -125,5 +135,7 @@ def __init__( jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" self._notebook = JupyterExtension( - jupyter_url, self._transport, self.connection_config + jupyter_url, + self._transport, + self.connection_config, ) From ec9bb087d587cfdaa5122dcb60a9e1fa40b55206 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 14:28:38 -0700 Subject: [PATCH 106/722] Add request timeouts; Fix JS requests; Add async kernel requests --- js/src/codeInterpreter.ts | 76 ++++++++++++++-- .../code_interpreter_async.py | 88 +++++++++++++++---- .../code_interpreter_sync.py | 38 +++++--- template/e2b.Dockerfile | 4 +- template/server/main.py | 2 + 5 files changed, 174 insertions(+), 34 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 165c450f..60ca4221 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -28,7 +28,7 @@ async function* readLines(stream: ReadableStream) { } export class JupyterExtension { - private static readonly defaultTimeoutMs = 300_000 + private static readonly execTimeoutMs = 300_000 constructor(private readonly url: string, private readonly connectionConfig: ConnectionConfig) { } @@ -55,21 +55,24 @@ export class JupyterExtension { const res = await fetch(`${this.url}/execute`, { method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, body: JSON.stringify({ code, // language: opts.language, - // kernel_id: opts.kernelID, + kernel_id: opts.kernelID, }), keepalive: true, }) if (!res.ok || !res.body) { - throw new Error(`Failed to execute code: ${res.statusText}`) + throw new Error(`Failed to execute code: ${res.statusText} ${await res?.text()}`) } clearTimeout(reqTimer) - const bodyTimeout = opts.timeoutMs ?? JupyterExtension.defaultTimeoutMs + const bodyTimeout = opts.timeoutMs ?? JupyterExtension.execTimeoutMs const bodyTimer = bodyTimeout ? setTimeout(() => { @@ -83,7 +86,6 @@ export class JupyterExtension { let error: ExecutionError | undefined = undefined try { - for await (const chunk of readLines(res.body)) { const msg = JSON.parse(chunk) @@ -127,6 +129,70 @@ export class JupyterExtension { error, ) } + + async createKernel( + cwd: string = '/home/user', + kernelName?: string, + requestTimeoutMs?: number, + ): Promise { + const res = await fetch(`${this.url}/contexts`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + language: kernelName, + }), + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + if (!res.ok || !res.body) { + throw new Error(`Failed to create kernel: ${res.statusText} ${await res?.text()}`) + } + + return res.json() + } + + async restartKernel( + kernelID?: string, + requestTimeoutMs?: number, + ) { + const res = await fetch(`${this.url}/contexts/restart`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + kernel_id: kernelID, + }), + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + if (!res.ok) { + throw new Error(`Failed to restart kernel: ${res.statusText} ${await res?.text()}`) + } + + return res.json() + } + + // async shutdownKernel(kernelID?: string) { } + + async listKernels( + requestTimeoutMs?: number, + ): Promise { + const res = await fetch(`${this.url}/contexts`, { + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + if (!res.ok) { + throw new Error(`Failed to list kernels: ${res.statusText} ${await res?.text()}`) + } + + return res.json() + } } export class CodeInterpreter extends Sandbox { diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 22ba8cc4..a89453b0 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,6 +1,6 @@ import logging -from typing import Optional +from typing import Optional, List from httpx import AsyncHTTPTransport, AsyncClient @@ -15,6 +15,10 @@ class JupyterExtension: _exec_timeout = 300 + @property + def _client(self) -> AsyncClient: + return AsyncClient(transport=self._transport) + def __init__( self, url: str, @@ -41,27 +45,79 @@ async def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout - execution = Execution() + async with self._client.stream( + "POST", + self._url, + json={ + "code": code, + # "language": language, + "kernel_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) as response: - async with AsyncClient(transport=self._transport) as client: - async with client.stream( - "POST", - self._url, - json={ - "code": code, - # "language": language, - # "kernel_id": kernel_id, - }, - timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) as response: + response.raise_for_status() - response.raise_for_status() + execution = Execution() - async for line in response.aiter_lines(): - parse_output(execution, line, on_stdout, on_stderr, on_result) + async for line in response.aiter_lines(): + parse_output(execution, line, on_stdout, on_stderr, on_result) return execution + async def create_kernel( + self, + language: Optional[str] = None, + request_timeout: Optional[float] = None, + ): + logger.debug(f"Creating new kernel for language: {language}") + + response = await self._client.post( + f"{self._url}/contexts", + json={"language": language}, + timeout=request_timeout or self._connection_config.request_timeout, + ) + response.raise_for_status() + + return response.json() + + async def restart_kernel( + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = None, + ): + logger.debug(f"Creating new kernel for language: {kernel_id}") + + response = await self._client.post( + f"{self._url}/contexts/restart", + json={"kernel_id": kernel_id}, + timeout=request_timeout or self._connection_config.request_timeout, + ) + response.raise_for_status() + + return response.json() + + async def list_kernels( + self, + request_timeout: Optional[float] = None, + ) -> List[str]: + """ + Lists all available Jupyter kernels. + + This method fetches a list of all currently available Jupyter kernels from the server. It can be used + to retrieve the IDs of all kernels that are currently running or available for connection. + + :param timeout: The timeout for the kernel list request. + :return: List of kernel ids + """ + response = await self._client.get( + f"{self._url}/contexts", + timeout=request_timeout or self._connection_config.request_timeout, + ) + response.raise_for_status() + + return response.json() + class AsyncCodeInterpreter(AsyncSandbox): default_template = DEFAULT_TEMPLATE diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 8e922dc5..3f9cb535 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -14,7 +14,7 @@ class JupyterExtension: _exec_timeout = 300 @property - def client(self) -> Client: + def _client(self) -> Client: return Client(transport=self._transport) def __init__( @@ -44,7 +44,7 @@ def exec_cell( request_timeout = request_timeout or self._connection_config.request_timeout execution = Execution() - with self.client.stream( + with self._client.stream( "POST", f"{self._url}/execute", json={ @@ -67,27 +67,42 @@ def exec_cell( return execution - def create_kernel(self, language: Optional[str] = None): + def create_kernel( + self, + language: Optional[str] = None, + request_timeout: Optional[float] = None, + ): logger.debug(f"Creating new kernel for language: {language}") - response = self.client.post( - f"{self._url}/contexts", json={"language": language} + response = self._client.post( + f"{self._url}/contexts", + json={"language": language}, + timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() return response.json() - def restart_kernel(self, kernel_id: Optional[str] = None): + def restart_kernel( + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = None, + ): logger.debug(f"Creating new kernel for language: {kernel_id}") - response = self.client.post( - f"{self._url}/contexts/restart", json={"kernel_id": kernel_id} + response = self._client.post( + f"{self._url}/contexts/restart", + json={"kernel_id": kernel_id}, + timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() return response.json() - def list_kernels(self) -> List[str]: + def list_kernels( + self, + request_timeout: Optional[float] = None, + ) -> List[str]: """ Lists all available Jupyter kernels. @@ -97,7 +112,10 @@ def list_kernels(self) -> List[str]: :param timeout: The timeout for the kernel list request. :return: List of kernel ids """ - response = self.client.get(f"{self._url}/contexts") + response = self._client.get( + f"{self._url}/contexts", + timeout=request_timeout or self._connection_config.request_timeout, + ) response.raise_for_status() return response.json() diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 4d744a10..524e5cb4 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -1,7 +1,7 @@ FROM python:3.10 RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq + build-essential curl git util-linux jq sudo ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -10,7 +10,6 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ IPYTHON_CONFIG_PATH="/root/.ipython" \ SERVER_PATH="/root/.server" - COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user @@ -28,7 +27,6 @@ COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ COPY ./server $SERVER_PATH -RUN apt-get install sudo EXPOSE 8000 ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/server/main.py b/template/server/main.py index 7491b953..83b70c95 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -28,6 +28,8 @@ # TODO: Increase timeout for requests to allow streaming # TODO: Handle pings from server so we can keep the connection from idling # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx +# TODO: Update signatures and types on clients +# TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods @asynccontextmanager From 698043537d5b8263545b9cbb01e64d69992d2566 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 15:49:12 -0700 Subject: [PATCH 107/722] Add kernel shutdown handler --- template/server/api/models/create_kernel.py | 12 ++++- template/server/main.py | 60 ++++++++++++++++++--- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py index 259eb83e..fa6d42f9 100644 --- a/template/server/api/models/create_kernel.py +++ b/template/server/api/models/create_kernel.py @@ -4,12 +4,20 @@ class CreateKernel(BaseModel): - cwd: Optional[StrictStr] = Field(default=None, description="Current working directory") + cwd: Optional[StrictStr] = Field( + default=None, description="Current working directory" + ) language: Optional[StrictStr] = Field( default=None, description="Language of the code to be executed" ) - kernel_name: Optional[StrictStr] = Field(default=None, description="Name of the kernel") + kernel_name: Optional[StrictStr] = Field( + default=None, description="Name of the kernel" + ) class RestartKernel(BaseModel): kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") + + +class ShutdownKernel(BaseModel): + kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/main.py b/template/server/main.py index 83b70c95..99bc144d 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -6,9 +6,9 @@ from typing import Dict, Union, Literal from pydantic import StrictStr from contextlib import asynccontextmanager -from fastapi import FastAPI +from fastapi import FastAPI, HTTPException -from api.models.create_kernel import CreateKernel, RestartKernel +from api.models.create_kernel import CreateKernel, RestartKernel, ShutdownKernel from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket @@ -30,6 +30,8 @@ # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx # TODO: Update signatures and types on clients # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods +# TODO: Return objects not just plain types from api (list kernels) so we can expand it later with more data (kernel language, cwd, etc.) +# TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? @asynccontextmanager @@ -83,7 +85,7 @@ async def execute(request: ExecutionRequest): async def create_kernel(request: CreateKernel): logger.info(f"Creating new kernel for language: {request.language}") - kernel_name = request.kernel_name or "python3" + kernel_name = request.language or "python3" cwd = request.cwd or "/home/user" data = { @@ -97,7 +99,10 @@ async def create_kernel(request: CreateKernel): response = await client.post("http://localhost:8888/api/sessions", json=data) if not response.is_success: - raise Exception(f"Failed to create kernel: {response.text}") + raise HTTPException( + status_code=500, + detail=f"Failed to create kernel: {response.text}", + ) session_data = response.json() session_id = session_data["id"] @@ -107,7 +112,10 @@ async def create_kernel(request: CreateKernel): f"http://localhost:8888/api/sessions/{session_id}", json={"path": cwd} ) if not response.is_success: - raise Exception(f"Failed to create kernel: {response.text}") + raise HTTPException( + status_code=500, + detail=f"Failed to create kernel: {response.text}", + ) logger.debug(f"Created kernel {kernel_id}") @@ -117,7 +125,7 @@ async def create_kernel(request: CreateKernel): websockets[kernel_id] = ws - return kernel_id + return {"kernel_id": kernel_id} @app.get("/contexts") @@ -138,7 +146,10 @@ async def restart_kernel(request: RestartKernel): ws = websockets.get(kernel_id, None) if not ws: - raise Exception(f"Kernel {kernel_id} not found") + raise HTTPException( + status_code=404, + detail=f"Kernel {kernel_id} not found", + ) kernel_id = ws.kernel_id session_id = ws.session_id @@ -149,7 +160,10 @@ async def restart_kernel(request: RestartKernel): f"http://localhost:8888/api/kernels/{kernel_id}/restart" ) if not response.is_success: - raise Exception(f"Failed to restart kernel {kernel_id}") + raise HTTPException( + status_code=500, + detail=f"Failed to restart kernel {kernel_id}", + ) ws = JupyterKernelWebSocket(kernel_id, session_id) @@ -157,3 +171,33 @@ async def restart_kernel(request: RestartKernel): await ws.started websockets[kernel_id] = ws + + +@app.delete("/contexts") +async def shutdown_kernel(request: ShutdownKernel): + logger.info(f"Shutting down kernel") + + kernel_id = request.kernel_id or "default" + + ws = websockets.get(kernel_id, None) + if not ws: + raise HTTPException( + status_code=404, + detail=f"Kernel {kernel_id} not found", + ) + + kernel_id = ws.kernel_id + + try: + await ws.close() + except: + pass + + response = await client.delete(f"http://localhost:8888/api/kernels/{kernel_id}") + if not response.is_success: + raise HTTPException( + status_code=500, + detail=f"Failed to shutdown kernel {kernel_id}", + ) + + del websockets[kernel_id] From 229a596fa0d61fb2975f4ef738d1f636fe437acf Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 17:43:03 -0700 Subject: [PATCH 108/722] Fix Python and Node versions in CI/CD --- .github/workflows/release.yml | 6 +++--- .github/workflows/release_candidates.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 06fa3b7d..418d796d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -109,7 +109,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.8" - name: Install and configure Poetry uses: snok/install-poetry@v1 @@ -121,10 +121,10 @@ jobs: - uses: pnpm/action-setup@v2 - - name: Setup Node.js 20 + - name: Setup Node.js 18 uses: actions/setup-node@v3 with: - node-version: 20 + node-version: '18.x' cache: pnpm - name: Configure pnpm diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 911585e4..c6bc9da6 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -20,11 +20,11 @@ jobs: - uses: pnpm/action-setup@v3 if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} - - name: Setup Node.js 20 + - name: Setup Node.js 18 uses: actions/setup-node@v4 if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} with: - node-version: 20 + node-version: '18.x' registry-url: https://registry.npmjs.org cache: pnpm @@ -51,7 +51,7 @@ jobs: uses: actions/setup-python@v4 if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} with: - python-version: "3.10" + python-version: "3.8" - name: Install and configure Poetry uses: snok/install-poetry@v1 From 42132d015d7e1d1a05727763656602ce798dcc46 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 17:43:28 -0700 Subject: [PATCH 109/722] Update python core SDK --- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 7aee8516..2a7d3286 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a25" +version = "0.17.2a26" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a25-py3-none-any.whl", hash = "sha256:7721782f785d899c94357cd2c9bea1585fe97860e632ca506a67d50371f8761a"}, - {file = "e2b-0.17.2a25.tar.gz", hash = "sha256:8ca8828285cb9d1e497b90f89435f24c124eee9d84479723606d909bad8d606b"}, + {file = "e2b-0.17.2a26-py3-none-any.whl", hash = "sha256:0a628d9800db311a687c3d0b00f51b92e13c6b4e30b568cb61144f1f5ff79390"}, + {file = "e2b-0.17.2a26.tar.gz", hash = "sha256:b9b678d5b71742df64a27c174a6bda23cb6bf3386631a96def72132d48655b18"}, ] [package.dependencies] @@ -447,4 +447,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "8861b5cb75f0d131a7d9b517e40595062a512d4d18f7c4441b7d8316909b7f07" +content-hash = "a9da150e51c050d5f95c9023e5dc4614d89dfcfe5daec9e94d48bbafe95c81d2" diff --git a/python/pyproject.toml b/python/pyproject.toml index 6b025d43..31cdadd7 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,7 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -e2b = "0.17.2a25" +e2b = "0.17.2a26" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" From 0622cb7c3e33de62d14516d0a49bd2c9d4d24d94 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 17:43:46 -0700 Subject: [PATCH 110/722] Add async test command to package json --- python/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/python/package.json b/python/package.json index a49fb293..a263f022 100644 --- a/python/package.json +++ b/python/package.json @@ -5,6 +5,7 @@ "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", + "async-example": "poetry run python3 async_example.py", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install" From 3f76871e53871a5c6919151d1fe643f9a04e3103 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 17:48:02 -0700 Subject: [PATCH 111/722] Change python CI/CD tests number of workers --- .github/workflows/python_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index dd63624a..8ab60a72 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -40,6 +40,6 @@ jobs: run: poetry build - name: Run tests - run: poetry run pytest --verbose -x + run: poetry run pytest -n 4 --verbose -x env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} From 861566a928db9f947bea7e60a7edbc793e961b60 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 18:11:18 -0700 Subject: [PATCH 112/722] Fix parallel test execution --- python/poetry.lock | 36 +++++++++++++++++++++++++++++++++++- python/pyproject.toml | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/python/poetry.lock b/python/poetry.lock index 2a7d3286..e60a9c3c 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -155,6 +155,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + [[package]] name = "h11" version = "0.14.0" @@ -372,6 +386,26 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" +[[package]] +name = "pytest-xdist" +version = "3.6.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -447,4 +481,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "a9da150e51c050d5f95c9023e5dc4614d89dfcfe5daec9e94d48bbafe95c81d2" +content-hash = "cf5d23a754efa39ec7bff0ad5903f98f252dd64eae2ece4f48ef2e0b0736aa58" diff --git a/python/pyproject.toml b/python/pyproject.toml index 31cdadd7..7f05e000 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -22,6 +22,7 @@ pytest = "^7.4.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pytest-asyncio = "^0.23.7" +pytest-xdist = "^3.6.1" [build-system] requires = ["poetry-core"] From 6e59be6fea3dfdab1d14c44e7c03271b171f9fcc Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 18:18:29 -0700 Subject: [PATCH 113/722] Fix async python tests --- python/async_example.py | 1 - python/tests/async/test_bash.py | 4 +++- python/tests/async/test_basic.py | 4 ++++ python/tests/async/test_display_data.py | 3 +++ python/tests/async/test_execution_count.py | 3 +++ python/tests/async/test_kernels.py | 7 +++++++ python/tests/async/test_reconnect.py | 3 +++ python/tests/async/test_statefulness.py | 3 +++ python/tests/async/test_streaming.py | 5 +++++ template/server/main.py | 1 + 10 files changed, 32 insertions(+), 2 deletions(-) diff --git a/python/async_example.py b/python/async_example.py index 613bd0cf..5f038b1e 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -3,7 +3,6 @@ from dotenv import load_dotenv from e2b_code_interpreter import AsyncCodeInterpreter -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter load_dotenv() diff --git a/python/tests/async/test_bash.py b/python/tests/async/test_bash.py index 871e9fb8..5227ce09 100644 --- a/python/tests/async/test_bash.py +++ b/python/tests/async/test_bash.py @@ -1,6 +1,8 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +import pytest_asyncio +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_bash(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/async/test_basic.py b/python/tests/async/test_basic.py index 946b8463..65d8cf63 100644 --- a/python/tests/async/test_basic.py +++ b/python/tests/async/test_basic.py @@ -1,6 +1,10 @@ +import pytest_asyncio + + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_basic(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_display_data.py b/python/tests/async/test_display_data.py index 976f552e..32039993 100644 --- a/python/tests/async/test_display_data.py +++ b/python/tests/async/test_display_data.py @@ -1,6 +1,9 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_display_data(async_sandbox: AsyncCodeInterpreter): # plot random graph result = await async_sandbox.notebook.exec_cell( diff --git a/python/tests/async/test_execution_count.py b/python/tests/async/test_execution_count.py index 01337f6e..383f410b 100644 --- a/python/tests/async/test_execution_count.py +++ b/python/tests/async/test_execution_count.py @@ -1,6 +1,9 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_execution_count(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = await async_sandbox.notebook.exec_cell("!pwd") diff --git a/python/tests/async/test_kernels.py b/python/tests/async/test_kernels.py index da94c9af..39f485ee 100644 --- a/python/tests/async/test_kernels.py +++ b/python/tests/async/test_kernels.py @@ -1,10 +1,14 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_create_new_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.create_kernel() +@pytest_asyncio.fixture async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() await async_sandbox.notebook.exec_cell("x = 1") @@ -13,6 +17,7 @@ async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest_asyncio.fixture async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") await async_sandbox.notebook.restart_kernel() @@ -21,6 +26,7 @@ async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest_asyncio.fixture async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): kernels = await async_sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -31,6 +37,7 @@ async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): assert len(kernels) == 2 +@pytest_asyncio.fixture async def test_shutdown(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() diff --git a/python/tests/async/test_reconnect.py b/python/tests/async/test_reconnect.py index acccd0b8..f23e7010 100644 --- a/python/tests/async/test_reconnect.py +++ b/python/tests/async/test_reconnect.py @@ -1,6 +1,9 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_reconnect(async_sandbox: AsyncCodeInterpreter): sandbox_id = async_sandbox.sandbox_id diff --git a/python/tests/async/test_statefulness.py b/python/tests/async/test_statefulness.py index bae8e301..e181753f 100644 --- a/python/tests/async/test_statefulness.py +++ b/python/tests/async/test_statefulness.py @@ -1,6 +1,9 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_stateful(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") diff --git a/python/tests/async/test_streaming.py b/python/tests/async/test_streaming.py index 2cc41a58..d508a4fa 100644 --- a/python/tests/async/test_streaming.py +++ b/python/tests/async/test_streaming.py @@ -1,6 +1,9 @@ +import pytest_asyncio + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest_asyncio.fixture async def test_streaming_output(async_sandbox: AsyncCodeInterpreter): out = [] @@ -14,6 +17,7 @@ def test(line) -> None: assert out[0] == "1\n" +@pytest_asyncio.fixture async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): out = [] @@ -25,6 +29,7 @@ async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): assert out[0] == "1\n" +@pytest_asyncio.fixture async def test_streaming_result(async_sandbox: AsyncCodeInterpreter): code = """ import matplotlib.pyplot as plt diff --git a/template/server/main.py b/template/server/main.py index 99bc144d..18e77129 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -32,6 +32,7 @@ # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods # TODO: Return objects not just plain types from api (list kernels) so we can expand it later with more data (kernel language, cwd, etc.) # TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? +# TODO: Fix returned values in JS @asynccontextmanager From eb2cea883e7a21d12e4f59381f7f6f60aad201d3 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 18:38:29 -0700 Subject: [PATCH 114/722] Add shutdown to js SDK; Fix JS SDK method signatures --- js/src/codeInterpreter.ts | 48 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 60ca4221..8314e855 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -34,15 +34,14 @@ export class JupyterExtension { async execCell( code: string, - opts: { + opts?: { kernelID?: string, - language?: string, - onStdout?: (output: string) => (Promise | void), - onStderr?: (output: string) => (Promise | void), - onResult?: (data: Result) => (Promise | void), + onStdout?: (output: string) => (Promise | any), + onStderr?: (output: string) => (Promise | any), + onResult?: (data: Result) => (Promise | any), timeoutMs?: number, requestTimeoutMs?: number, - } = {} + }, ): Promise { const controller = new AbortController() @@ -60,8 +59,7 @@ export class JupyterExtension { }, body: JSON.stringify({ code, - // language: opts.language, - kernel_id: opts.kernelID, + kernel_id: opts?.kernelID, }), keepalive: true, }) @@ -72,7 +70,7 @@ export class JupyterExtension { clearTimeout(reqTimer) - const bodyTimeout = opts.timeoutMs ?? JupyterExtension.execTimeoutMs + const bodyTimeout = opts?.timeoutMs ?? JupyterExtension.execTimeoutMs const bodyTimer = bodyTimeout ? setTimeout(() => { @@ -93,19 +91,20 @@ export class JupyterExtension { case 'result': const result = new Result(msg.data, true) results.push(result) - if (opts.onResult) { + if (opts?.onResult) { await opts.onResult(result) } break case 'stdout': stdout.push(msg.value) - if (opts.onStdout) { + console.log(msg) + if (opts?.onStdout) { await opts.onStdout(msg.value) } break case 'stderr': stderr.push(msg.value) - if (opts.onStderr) { + if (opts?.onStderr) { await opts.onStderr(msg.value) } break @@ -142,6 +141,7 @@ export class JupyterExtension { }, body: JSON.stringify({ language: kernelName, + cwd, }), keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), @@ -157,7 +157,7 @@ export class JupyterExtension { async restartKernel( kernelID?: string, requestTimeoutMs?: number, - ) { + ): Promise { const res = await fetch(`${this.url}/contexts/restart`, { method: 'POST', headers: { @@ -173,11 +173,25 @@ export class JupyterExtension { if (!res.ok) { throw new Error(`Failed to restart kernel: ${res.statusText} ${await res?.text()}`) } - - return res.json() } - // async shutdownKernel(kernelID?: string) { } + async shutdownKernel(kernelID?: string, requestTimeoutMs?: number): Promise { + const res = await fetch(`${this.url}/contexts`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + kernel_id: kernelID, + }), + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + if (!res.ok) { + throw new Error(`Failed to shutdown kernel: ${res.statusText} ${await res?.text()}`) + } + } async listKernels( requestTimeoutMs?: number, @@ -191,7 +205,7 @@ export class JupyterExtension { throw new Error(`Failed to list kernels: ${res.statusText} ${await res?.text()}`) } - return res.json() + return (await res.json()).map((kernel: any) => kernel.kernel_id) } } From 005c4a2823fcb4c99d6aedda96dc16dc053e3b45 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 18:49:31 -0700 Subject: [PATCH 115/722] Remove class fields in models; Fix output handler signature --- .../code_interpreter_async.py | 5 +- python/e2b_code_interpreter/models.py | 88 ++++++++----------- 2 files changed, 38 insertions(+), 55 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index a89453b0..6bef1a34 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,6 @@ import logging from typing import Optional, List - from httpx import AsyncHTTPTransport, AsyncClient from e2b import AsyncSandbox, ConnectionConfig, Stdout, Stderr @@ -33,14 +32,13 @@ async def exec_cell( self, code: str, kernel_id: Optional[str] = None, - language: Optional[str] = None, on_stdout: Optional[OutputHandler[Stdout]] = None, on_stderr: Optional[OutputHandler[Stderr]] = None, on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, ): - logger.debug(f"Executing code {code} for language {language}") + logger.debug(f"Executing code {code}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout @@ -50,7 +48,6 @@ async def exec_cell( self._url, json={ "code": code, - # "language": language, "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 54639982..27aef4a4 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,12 +1,25 @@ import json -from typing import List, Optional, Iterable, Dict, TypeVar, Callable + +from typing import ( + List, + Optional, + Iterable, + Dict, + TypeVar, + Callable, + Awaitable, + Any, + Union, +) from e2b.sandbox.process.process_handle import Stdout, Stderr T = TypeVar("T") - -OutputHandler = Callable[[T], None] +OutputHandler = Union[ + Callable[[T], Any], + Callable[[T], Awaitable[Any]], +] class Error: @@ -15,13 +28,6 @@ class Error: The error contains the name of the error, the value of the error, and the traceback. """ - name: str - "Name of the exception." - value: str - "Value of the exception." - traceback_raw: List[str] - "List of strings representing the traceback." - def __init__(self, name: str, value: str, traceback: List[str]): self.name = name self.value = value @@ -62,22 +68,6 @@ class Result: The class also provides methods to display the data in a Jupyter notebook. """ - text: Optional[str] = None - html: Optional[str] = None - markdown: Optional[str] = None - svg: Optional[str] = None - png: Optional[str] = None - jpeg: Optional[str] = None - pdf: Optional[str] = None - latex: Optional[str] = None - json: Optional[dict] = None - javascript: Optional[str] = None - extra: Optional[dict] = None - "Extra data that can be included. Not part of the standard types." - - is_main_result: bool - "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." - def __getitem__(self, item): return getattr(self, item) @@ -108,7 +98,9 @@ def __init__( self.json = json self.javascript = javascript self.is_main_result = is_main_result + """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" self.extra = extra or {} + """Extra data that can be included. Not part of the standard types.""" def formats(self) -> Iterable[str]: """ @@ -230,16 +222,15 @@ class Logs: Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. """ - stdout: Optional[str] = None - "List of strings printed to stdout by prints, subprocesses, etc." - stderr: Optional[str] = None - "List of strings printed to stderr by prints, subprocesses, etc." - def __init__( - self, stdout: Optional[List[str]] = None, stderr: Optional[List[str]] = None + self, + stdout: Optional[List[str]] = None, + stderr: Optional[List[str]] = None, ): self.stdout = stdout or [] + """List of strings printed to stdout by prints, subprocesses, etc.""" self.stderr = stderr or [] + """List of strings printed to stderr by prints, subprocesses, etc.""" def __repr__(self): return f"Logs(stdout: {self.stdout}, stderr: {self.stderr})" @@ -269,20 +260,15 @@ class Execution: Represents the result of a cell execution. """ - results: List[Result] = [] - "List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots)." - logs: Logs = Logs() - "Logs printed to stdout and stderr during execution." - error: Optional[Error] = None - "Error object if an error occurred, None otherwise." - execution_count: Optional[int] = None - "Execution count of the cell." - def __init__(self, **kwargs): - self.results = kwargs.pop("results", []) - self.logs = kwargs.pop("logs", Logs()) - self.error = kwargs.pop("error", None) - self.execution_count = kwargs.pop("execution_count", None) + self.results: List[Result] = kwargs.pop("results", []) + """List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).""" + self.logs: Logs = kwargs.pop("logs", Logs()) + """Logs printed to stdout and stderr during execution.""" + self.error: Optional[Error] = kwargs.pop("error", None) + """Error object if an error occurred, None otherwise.""" + self.execution_count: Optional[int] = kwargs.pop("execution_count", None) + """Execution count of the cell.""" def __repr__(self): return f"Execution(Results: {self.results}, Logs: {self.logs}, Error: {self.error})" @@ -319,11 +305,11 @@ class KernelException(Exception): def parse_output( - execution: Execution, - output: str, - on_stdout: Optional[OutputHandler[Stdout]] = None, - on_stderr: Optional[OutputHandler[Stderr]] = None, - on_result: Optional[OutputHandler[Result]] = None, + execution: Execution, + output: str, + on_stdout: Optional[OutputHandler[Stdout]] = None, + on_stderr: Optional[OutputHandler[Stderr]] = None, + on_result: Optional[OutputHandler[Result]] = None, ) -> None: data = json.loads(output) data_type = data.pop("type") @@ -334,7 +320,7 @@ def parse_output( if on_result: on_result(result) elif data_type == "stdout": - execution.logs.stdout += data['text'] + execution.logs.stdout += data["text"] if on_stdout: on_stdout(data["text"]) elif data_type == "stderr": From 89bf5e2a0617a836009daca9afc6a68646aedc67 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 19:00:27 -0700 Subject: [PATCH 116/722] FIx python method signatures; Add shutdown --- .../code_interpreter_async.py | 37 ++++++++++++++----- .../code_interpreter_sync.py | 37 ++++++++++++++----- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 6bef1a34..1b77cc49 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -37,7 +37,7 @@ async def exec_cell( on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ): + ) -> Execution: logger.debug(f"Executing code {code}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) @@ -64,26 +64,30 @@ async def exec_cell( async def create_kernel( self, - language: Optional[str] = None, + cwd: Optional[str] = "/home/user", + kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, - ): - logger.debug(f"Creating new kernel for language: {language}") + ) -> str: + logger.debug(f"Creating new kernel: {kernel_name}") response = await self._client.post( f"{self._url}/contexts", - json={"language": language}, + json={ + "language": kernel_name, + "cwd": cwd, + }, timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() - return response.json() + return response.json().kernel_id async def restart_kernel( self, kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, - ): - logger.debug(f"Creating new kernel for language: {kernel_id}") + ) -> None: + logger.debug(f"Restarting kernel: {kernel_id}") response = await self._client.post( f"{self._url}/contexts/restart", @@ -92,7 +96,20 @@ async def restart_kernel( ) response.raise_for_status() - return response.json() + async def shutdown_kernel( + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = None, + ) -> None: + logger.debug(f"Creating new kernel for language: {kernel_id}") + + response = await self._client.request( + method="DELETE", + url=f"{self._url}/contexts", + json={"kernel_id": kernel_id}, + timeout=request_timeout or self._connection_config.request_timeout, + ) + response.raise_for_status() async def list_kernels( self, @@ -113,7 +130,7 @@ async def list_kernels( ) response.raise_for_status() - return response.json() + return [k.kernel_id for k in response.json()] class AsyncCodeInterpreter(AsyncSandbox): diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 3f9cb535..72a68374 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -37,7 +37,7 @@ def exec_cell( on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ): + ) -> Execution: logger.debug(f"Executing code {code} for language {language}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) @@ -69,25 +69,44 @@ def exec_cell( def create_kernel( self, - language: Optional[str] = None, + cwd: Optional[str] = "/home/user", + kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, - ): - logger.debug(f"Creating new kernel for language: {language}") + ) -> str: + logger.debug(f"Creating new kernel: {kernel_name}") response = self._client.post( f"{self._url}/contexts", - json={"language": language}, + json={ + "language": kernel_name, + "cwd": cwd, + }, timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() - return response.json() + return response.json().kernel_id + + def shutdown_kernel( + self, + kernel_id: Optional[str] = None, + request_timeout: Optional[float] = None, + ) -> None: + logger.debug(f"Creating new kernel for language: {kernel_id}") + + response = self._client.request( + method="DELETE", + url=f"{self._url}/contexts", + json={"kernel_id": kernel_id}, + timeout=request_timeout or self._connection_config.request_timeout, + ) + response.raise_for_status() def restart_kernel( self, kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, - ): + ) -> None: logger.debug(f"Creating new kernel for language: {kernel_id}") response = self._client.post( @@ -97,8 +116,6 @@ def restart_kernel( ) response.raise_for_status() - return response.json() - def list_kernels( self, request_timeout: Optional[float] = None, @@ -118,7 +135,7 @@ def list_kernels( ) response.raise_for_status() - return response.json() + return [k.kernel_id for k in response.json()] class CodeInterpreter(Sandbox): From 1083c5440a82f256dd88b9dd77ddbdbc2872bce3 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 19:03:52 -0700 Subject: [PATCH 117/722] Fix kernel list return --- template/server/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 18e77129..ae3259b8 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -28,11 +28,12 @@ # TODO: Increase timeout for requests to allow streaming # TODO: Handle pings from server so we can keep the connection from idling # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx -# TODO: Update signatures and types on clients +# TODO: Fix on_* handler types on clients for them to be the same as in current prod CI # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods # TODO: Return objects not just plain types from api (list kernels) so we can expand it later with more data (kernel language, cwd, etc.) # TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? # TODO: Fix returned values in JS +# TODO: Handle all types of messages in JS @asynccontextmanager @@ -136,7 +137,7 @@ async def list_kernels(): kernel_ids = list(websockets.keys()) kernel_ids.remove(default_kernel_id) - return kernel_ids + return [{"kernel_id": kernel_id} for kernel_id in kernel_ids] @app.post("/contexts/restart") From 93b47c92a575d464f002a39e7d08878fccd22267 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 19:04:41 -0700 Subject: [PATCH 118/722] Add todo --- template/server/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/template/server/main.py b/template/server/main.py index ae3259b8..34a7f70e 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -34,6 +34,7 @@ # TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? # TODO: Fix returned values in JS # TODO: Handle all types of messages in JS +# TODO: Change port so it is outside of the well known range @asynccontextmanager From ecc61872af780c0d0ed4246156e59366d0fbcf3c Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 20:22:05 -0700 Subject: [PATCH 119/722] Add http client to context manager --- template/server/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index 34a7f70e..aa1b865b 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -22,7 +22,7 @@ global default_kernel_id -client = httpx.AsyncClient() +global client # TODO: Increase keepalive timeout # TODO: Increase timeout for requests to allow streaming @@ -39,6 +39,9 @@ @asynccontextmanager async def lifespan(app: FastAPI): + global client + client = httpx.AsyncClient() + # Load the default kernel session_id = str(uuid.uuid4()) @@ -61,6 +64,8 @@ async def lifespan(app: FastAPI): await default_ws.close() task.cancel() + await client.aclose() + app = FastAPI(lifespan=lifespan) From fe5a473dc68398e6dd5d05d152c2d137383c6c6b Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 10 Jul 2024 21:20:25 -0700 Subject: [PATCH 120/722] Include kernel's name when listing kernel --- js/src/codeInterpreter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 00470815..5d75106f 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -244,10 +244,10 @@ export class JupyterExtension { * This method fetches a list of all currently available Jupyter kernels from the server. It can be used * to retrieve the IDs of all kernels that are currently running or available for connection. * - * @returns A promise that resolves to an array of kernel IDs. + * @returns A promise that resolves to an array of objects containing a kernel ID and kernel name. * @throws {Error} Throws an error if the request to list kernels fails. */ - async listKernels(): Promise { + async listKernels(): Promise<{ id: string, name: string }[]> { const response = await fetch( `${this.sandbox.getProtocol()}://${this.sandbox.getHost( 8888 @@ -261,7 +261,7 @@ export class JupyterExtension { throw new Error(`Failed to list kernels: ${response.statusText}`) } - return (await response.json()).map((kernel: { id: string }) => kernel.id) + return (await response.json()).map((kernel: { id: string, name: string }) => ({ id: kernel.id, name: kernel.name })) } /** From b8155b14ff646ec51bdeac2287af354d52a6ffa3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 11 Jul 2024 04:21:14 +0000 Subject: [PATCH 121/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 35f56e21..29f87dd9 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.3", + "version": "0.0.9-beta.4", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 0504f63b..5c2c3bf4 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a3" +version = "0.0.11a4" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 4f795035461417e2edb47a34fcb7333d304b728f Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 21:25:36 -0700 Subject: [PATCH 122/722] Update todos --- template/server/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index aa1b865b..03c6ad82 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -24,8 +24,7 @@ global client -# TODO: Increase keepalive timeout -# TODO: Increase timeout for requests to allow streaming +# TODO: Increase timeout for requests to allow streaming, increase max request/response sizes to acommodate larger results, Increase keepalive timeout # TODO: Handle pings from server so we can keep the connection from idling # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx # TODO: Fix on_* handler types on clients for them to be the same as in current prod CI From 5647b22f4d149b74801823454a73d6fca016c05b Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 21:36:40 -0700 Subject: [PATCH 123/722] Fix JS methods params DX --- js/src/codeInterpreter.ts | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 8314e855..66bf91c4 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -129,11 +129,15 @@ export class JupyterExtension { ) } - async createKernel( - cwd: string = '/home/user', + async createKernel({ + cwd, + kernelName, + requestTimeoutMs, + }: { + cwd?: string, kernelName?: string, requestTimeoutMs?: number, - ): Promise { + }): Promise { const res = await fetch(`${this.url}/contexts`, { method: 'POST', headers: { @@ -141,7 +145,7 @@ export class JupyterExtension { }, body: JSON.stringify({ language: kernelName, - cwd, + cwd: cwd || '/home/user' }), keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), @@ -154,10 +158,13 @@ export class JupyterExtension { return res.json() } - async restartKernel( + async restartKernel({ + kernelID, + requestTimeoutMs, + }: { kernelID?: string, requestTimeoutMs?: number, - ): Promise { + }): Promise { const res = await fetch(`${this.url}/contexts/restart`, { method: 'POST', headers: { @@ -175,7 +182,13 @@ export class JupyterExtension { } } - async shutdownKernel(kernelID?: string, requestTimeoutMs?: number): Promise { + async shutdownKernel({ + kernelID, + requestTimeoutMs, + }: { + kernelID?: string, + requestTimeoutMs?: number, + }): Promise { const res = await fetch(`${this.url}/contexts`, { method: 'DELETE', headers: { @@ -193,9 +206,11 @@ export class JupyterExtension { } } - async listKernels( + async listKernels({ + requestTimeoutMs, + }: { requestTimeoutMs?: number, - ): Promise { + }): Promise { const res = await fetch(`${this.url}/contexts`, { keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), From b53a0cfda2603a8855ccf99d89cb36858d9ad902 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 21:45:20 -0700 Subject: [PATCH 124/722] Return kernel name when listing --- js/src/codeInterpreter.ts | 4 ++-- .../e2b_code_interpreter/code_interpreter_async.py | 12 +++++++++--- .../e2b_code_interpreter/code_interpreter_sync.py | 12 +++++++++--- python/e2b_code_interpreter/models.py | 7 +++++++ template/server/main.py | 14 ++++++++++---- template/server/messaging.py | 3 ++- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 66bf91c4..34ebaef4 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -210,7 +210,7 @@ export class JupyterExtension { requestTimeoutMs, }: { requestTimeoutMs?: number, - }): Promise { + }): Promise<{ kernelID: string, name: string }[]> { const res = await fetch(`${this.url}/contexts`, { keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), @@ -220,7 +220,7 @@ export class JupyterExtension { throw new Error(`Failed to list kernels: ${res.statusText} ${await res?.text()}`) } - return (await res.json()).map((kernel: any) => kernel.kernel_id) + return (await res.json()).map((kernel: any) => ({ kernelID: kernel.kernel_id, name: kernel.name })) } } diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 1b77cc49..00fbc474 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -6,7 +6,13 @@ from e2b import AsyncSandbox, ConnectionConfig, Stdout, Stderr from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT -from e2b_code_interpreter.models import Execution, Result, parse_output, OutputHandler +from e2b_code_interpreter.models import ( + Execution, + Kernel, + Result, + parse_output, + OutputHandler, +) logger = logging.getLogger(__name__) @@ -114,7 +120,7 @@ async def shutdown_kernel( async def list_kernels( self, request_timeout: Optional[float] = None, - ) -> List[str]: + ) -> List[Kernel]: """ Lists all available Jupyter kernels. @@ -130,7 +136,7 @@ async def list_kernels( ) response.raise_for_status() - return [k.kernel_id for k in response.json()] + return [Kernel(k.kernel_id, k.name) for k in response.json()] class AsyncCodeInterpreter(AsyncSandbox): diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 72a68374..d710344a 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -5,7 +5,13 @@ from e2b import Sandbox, Stderr, Stdout, ConnectionConfig from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT -from e2b_code_interpreter.models import Execution, Result, parse_output, OutputHandler +from e2b_code_interpreter.models import ( + Execution, + Kernel, + Result, + parse_output, + OutputHandler, +) logger = logging.getLogger(__name__) @@ -119,7 +125,7 @@ def restart_kernel( def list_kernels( self, request_timeout: Optional[float] = None, - ) -> List[str]: + ) -> List[Kernel]: """ Lists all available Jupyter kernels. @@ -135,7 +141,7 @@ def list_kernels( ) response.raise_for_status() - return [k.kernel_id for k in response.json()] + return [Kernel(k.kernel_id, k.name) for k in response.json()] class CodeInterpreter(Sandbox): diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 27aef4a4..e8088137 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,5 +1,6 @@ import json +from dataclasses import dataclass from typing import ( List, Optional, @@ -331,3 +332,9 @@ def parse_output( execution.error = Error(**data) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] + + +@dataclass +class Kernel: + kernel_id: str + name: str diff --git a/template/server/main.py b/template/server/main.py index 03c6ad82..24b91a48 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -48,7 +48,7 @@ async def lifespan(app: FastAPI): with open("/root/.jupyter/kernel_id") as file: default_kernel_id = file.read().strip() - default_ws = JupyterKernelWebSocket(default_kernel_id, session_id) + default_ws = JupyterKernelWebSocket(default_kernel_id, session_id, "python") websockets["default"] = default_ws websockets["python"] = default_ws @@ -126,7 +126,7 @@ async def create_kernel(request: CreateKernel): logger.debug(f"Created kernel {kernel_id}") - ws = JupyterKernelWebSocket(kernel_id, session_id) + ws = JupyterKernelWebSocket(kernel_id, session_id, kernel_name) task = asyncio.create_task(ws.connect()) await ws.started @@ -142,7 +142,13 @@ async def list_kernels(): kernel_ids = list(websockets.keys()) kernel_ids.remove(default_kernel_id) - return [{"kernel_id": kernel_id} for kernel_id in kernel_ids] + return [ + { + "kernel_id": websockets[kernel_id].kernel_id, + "name": websockets[kernel_id].name, + } + for kernel_id in kernel_ids + ] @app.post("/contexts/restart") @@ -172,7 +178,7 @@ async def restart_kernel(request: RestartKernel): detail=f"Failed to restart kernel {kernel_id}", ) - ws = JupyterKernelWebSocket(kernel_id, session_id) + ws = JupyterKernelWebSocket(kernel_id, session_id, ws.name) task = asyncio.create_task(ws.connect()) await ws.started diff --git a/template/server/messaging.py b/template/server/messaging.py index 79ea03b1..a4c485c6 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -40,8 +40,9 @@ def __init__(self): class JupyterKernelWebSocket: _ws: Optional[WebSocketClientProtocol] = None - def __init__(self, kernel_id: str, session_id: str): + def __init__(self, kernel_id: str, session_id: str, name: str): self.kernel_id = kernel_id + self.name = name self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" self.session_id = session_id self._executions: Dict[str, Execution] = {} From 28bb811d3ede849d8f80ffd06cc1f8a1b8901a29 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 22:03:16 -0700 Subject: [PATCH 125/722] Fix default params for JS methods --- js/src/codeInterpreter.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 34ebaef4..c625fd36 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -137,7 +137,7 @@ export class JupyterExtension { cwd?: string, kernelName?: string, requestTimeoutMs?: number, - }): Promise { + } = {}): Promise { const res = await fetch(`${this.url}/contexts`, { method: 'POST', headers: { @@ -164,7 +164,7 @@ export class JupyterExtension { }: { kernelID?: string, requestTimeoutMs?: number, - }): Promise { + } = {}): Promise { const res = await fetch(`${this.url}/contexts/restart`, { method: 'POST', headers: { @@ -188,7 +188,7 @@ export class JupyterExtension { }: { kernelID?: string, requestTimeoutMs?: number, - }): Promise { + } = {}): Promise { const res = await fetch(`${this.url}/contexts`, { method: 'DELETE', headers: { @@ -210,7 +210,7 @@ export class JupyterExtension { requestTimeoutMs, }: { requestTimeoutMs?: number, - }): Promise<{ kernelID: string, name: string }[]> { + } = {}): Promise<{ kernelID: string, name: string }[]> { const res = await fetch(`${this.url}/contexts`, { keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), From ba6c406c9476238157060ac19429270b8917f6ef Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 22:03:28 -0700 Subject: [PATCH 126/722] [WIP] Update tests --- js/tests/kernels.test.ts | 2 +- js/tests/statefulness.test.ts | 2 +- python/tests/async/test_kernels.py | 2 ++ python/tests/sync/test_kernels.py | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 387f8f14..300b1ff3 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -1,4 +1,4 @@ -import { expect, test } from 'vitest' +import { expect } from 'vitest' import { sandboxTest } from './setup' diff --git a/js/tests/statefulness.test.ts b/js/tests/statefulness.test.ts index 1a4013b4..59e4e302 100644 --- a/js/tests/statefulness.test.ts +++ b/js/tests/statefulness.test.ts @@ -1,4 +1,4 @@ -import { expect, test } from 'vitest' +import { expect } from 'vitest' import { sandboxTest } from './setup' diff --git a/python/tests/async/test_kernels.py b/python/tests/async/test_kernels.py index 39f485ee..a1dd7542 100644 --- a/python/tests/async/test_kernels.py +++ b/python/tests/async/test_kernels.py @@ -14,6 +14,7 @@ async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") r = await async_sandbox.notebook.exec_cell("x", kernel_id=kernel_id) + assert r.error is not None assert r.error.value == "name 'x' is not defined" @@ -23,6 +24,7 @@ async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.restart_kernel() r = await async_sandbox.notebook.exec_cell("x") + assert r.error is not None assert r.error.value == "name 'x' is not defined" diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index 11af7199..4fd6da79 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -10,6 +10,7 @@ def test_independence_of_kernels(sandbox: CodeInterpreter): sandbox.notebook.exec_cell("x = 1") r = sandbox.notebook.exec_cell("x", kernel_id=kernel_id) + assert r.error is not None assert r.error.value == "name 'x' is not defined" @@ -18,6 +19,7 @@ def test_restart_kernel(sandbox: CodeInterpreter): sandbox.notebook.restart_kernel() r = sandbox.notebook.exec_cell("x") + assert r.error is not None assert r.error.value == "name 'x' is not defined" From 0dda51b9282a8f2a30fa28a71f0de34b2b80566d Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 23:36:23 -0700 Subject: [PATCH 127/722] Fix output handler arguments; Fix stream line parsing; Add all types for parsed stream in JS --- js/src/codeInterpreter.ts | 53 +++++++++++++------ js/src/index.ts | 2 +- js/src/messaging.ts | 34 +----------- js/tests/streaming.test.ts | 6 +-- .../code_interpreter_async.py | 7 +-- .../code_interpreter_sync.py | 7 +-- python/e2b_code_interpreter/models.py | 21 ++++++-- template/server/main.py | 4 +- template/server/stream.py | 28 +++------- 9 files changed, 77 insertions(+), 85 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index c625fd36..c253a221 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,6 +1,6 @@ import { ConnectionConfig, Sandbox } from 'e2b' -import { Result, Execution, ExecutionError } from './messaging' +import { Result, Execution, ExecutionError, OutputMessage } from './messaging' async function* readLines(stream: ReadableStream) { const reader = stream.getReader(); @@ -10,17 +10,26 @@ async function* readLines(stream: ReadableStream) { while (true) { const { done, value } = await reader.read(); + if (value !== undefined) { + buffer += new TextDecoder().decode(value) + } + if (done) { - yield buffer + if (buffer.length > 0) { + yield buffer + } break } - buffer += new TextDecoder().decode(value) - const newlineIdx = buffer.indexOf('\n') - if (newlineIdx !== -1) { - yield buffer.slice(0, newlineIdx) - buffer = buffer.slice(newlineIdx + 1) - } + let newlineIdx = -1 + + do { + newlineIdx = buffer.indexOf('\n') + if (newlineIdx !== -1) { + yield buffer.slice(0, newlineIdx) + buffer = buffer.slice(newlineIdx + 1) + } + } while (newlineIdx !== -1) } } finally { reader.releaseLock() @@ -36,8 +45,8 @@ export class JupyterExtension { code: string, opts?: { kernelID?: string, - onStdout?: (output: string) => (Promise | any), - onStderr?: (output: string) => (Promise | any), + onStdout?: (output: OutputMessage) => (Promise | any), + onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), timeoutMs?: number, requestTimeoutMs?: number, @@ -82,6 +91,7 @@ export class JupyterExtension { let stdout: string[] = [] let stderr: string[] = [] let error: ExecutionError | undefined = undefined + let executionCount: number | undefined = undefined try { for await (const chunk of readLines(res.body)) { @@ -96,23 +106,31 @@ export class JupyterExtension { } break case 'stdout': - stdout.push(msg.value) - console.log(msg) + stdout.push(msg.text) if (opts?.onStdout) { - await opts.onStdout(msg.value) + await opts.onStdout({ + error: false, + line: msg.text, + timestamp: new Date().getTime() * 1000, + }) } break case 'stderr': - stderr.push(msg.value) + stderr.push(msg.text) if (opts?.onStderr) { - await opts.onStderr(msg.value) + await opts.onStderr({ + error: true, + line: msg.text, + timestamp: new Date().getTime() * 1000, + }) } break case 'error': error = new ExecutionError(msg.name, msg.value, msg.traceback) break - default: - console.warn(`Unhandled message type: ${msg.type}`) + case 'number_of_executions': + executionCount = msg.execution_count + break } } } finally { @@ -126,6 +144,7 @@ export class JupyterExtension { stderr, }, error, + executionCount, ) } diff --git a/js/src/index.ts b/js/src/index.ts index ec3c3a38..9b212b51 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,6 +1,6 @@ export { CodeInterpreter, JupyterExtension } from './codeInterpreter' -export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData, CellMessage } from './messaging' +export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData, OutputMessage } from './messaging' import { CodeInterpreter } from './codeInterpreter' diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 40397d83..698d2565 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,7 +1,4 @@ -/** - * A message from a process. - */ -export class CellMessage { +export class OutputMessage { constructor( public readonly line: string, /** @@ -35,7 +32,7 @@ export class ExecutionError { /** * The raw traceback of the error. **/ - public tracebackRaw: string[] + public tracebackRaw: string[], ) { } /** @@ -271,30 +268,3 @@ export class Execution { } } } - -/** - * Represents the execution of a cell in the Jupyter kernel. - * It's an internal class used by JupyterKernelWebSocket. - */ -class CellExecution { - execution: Execution - onStdout?: (out: CellMessage) => any - onStderr?: (out: CellMessage) => any - onResult?: (data: Result) => any - inputAccepted: boolean = false - - constructor( - onStdout?: (out: CellMessage) => any, - onStderr?: (out: CellMessage) => any, - onResult?: (data: Result) => any - ) { - this.execution = new Execution([], { stdout: [], stderr: [] }) - this.onStdout = onStdout - this.onStderr = onStderr - this.onResult = onResult - } -} - -interface Cells { - [id: string]: CellExecution -} diff --git a/js/tests/streaming.test.ts b/js/tests/streaming.test.ts index 2099d292..a4b8a17b 100644 --- a/js/tests/streaming.test.ts +++ b/js/tests/streaming.test.ts @@ -1,11 +1,11 @@ import { expect } from 'vitest' -import { Result, CellMessage } from '../src' +import { Result, OutputMessage } from '../src' import { sandboxTest } from './setup' sandboxTest('streaming output', async ({ sandbox }) => { - const out: CellMessage[] = [] + const out: OutputMessage[] = [] await sandbox.notebook.execCell('print(1)', { onStdout: (msg) => out.push(msg) }) @@ -15,7 +15,7 @@ sandboxTest('streaming output', async ({ sandbox }) => { }) sandboxTest('streaming error', async ({ sandbox }) => { - const out: CellMessage[] = [] + const out: OutputMessage[] = [] await sandbox.notebook.execCell('import sys;print(1, file=sys.stderr)', { onStderr: (msg) => out.push(msg) }) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 00fbc474..4244b3be 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -3,7 +3,7 @@ from typing import Optional, List from httpx import AsyncHTTPTransport, AsyncClient -from e2b import AsyncSandbox, ConnectionConfig, Stdout, Stderr +from e2b import AsyncSandbox, ConnectionConfig from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT from e2b_code_interpreter.models import ( @@ -12,6 +12,7 @@ Result, parse_output, OutputHandler, + OutputMessage, ) logger = logging.getLogger(__name__) @@ -38,8 +39,8 @@ async def exec_cell( self, code: str, kernel_id: Optional[str] = None, - on_stdout: Optional[OutputHandler[Stdout]] = None, - on_stderr: Optional[OutputHandler[Stderr]] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index d710344a..1abef312 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -2,7 +2,7 @@ from typing import Optional, Dict, List from httpx import HTTPTransport, Client -from e2b import Sandbox, Stderr, Stdout, ConnectionConfig +from e2b import Sandbox, ConnectionConfig from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT from e2b_code_interpreter.models import ( @@ -11,6 +11,7 @@ Result, parse_output, OutputHandler, + OutputMessage, ) logger = logging.getLogger(__name__) @@ -38,8 +39,8 @@ def exec_cell( code: str, kernel_id: Optional[str] = None, language: Optional[str] = None, - on_stdout: Optional[OutputHandler[Stdout]] = None, - on_stderr: Optional[OutputHandler[Stderr]] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index e8088137..16fa3f70 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -23,6 +23,19 @@ ] +@dataclass +class OutputMessage: + line: str + timestamp: int + """ + Unix epoch in nanoseconds + """ + error: bool = False + + def __str__(self): + return self.line + + class Error: """ Represents an error that occurred during the execution of a cell. @@ -308,8 +321,8 @@ class KernelException(Exception): def parse_output( execution: Execution, output: str, - on_stdout: Optional[OutputHandler[Stdout]] = None, - on_stderr: Optional[OutputHandler[Stderr]] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, ) -> None: data = json.loads(output) @@ -323,11 +336,11 @@ def parse_output( elif data_type == "stdout": execution.logs.stdout += data["text"] if on_stdout: - on_stdout(data["text"]) + on_stdout(OutputMessage(data["text"], data["timestamp"], False)) elif data_type == "stderr": execution.logs.stderr += data["text"] if on_stderr: - on_stderr(data["text"]) + on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": execution.error = Error(**data) elif data_type == "number_of_executions": diff --git a/template/server/main.py b/template/server/main.py index 24b91a48..abc60afc 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -12,7 +12,7 @@ from messaging import JupyterKernelWebSocket from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket -from stream import StreamingLisJsonResponse +from stream import StreamingListJsonResponse logging.basicConfig(level=logging.DEBUG) @@ -85,7 +85,7 @@ async def execute(request: ExecutionRequest): else: ws = websockets["default"] - return StreamingLisJsonResponse(ws.execute(request.code)) + return StreamingListJsonResponse(ws.execute(request.code)) @app.post("/contexts") diff --git a/template/server/stream.py b/template/server/stream.py index ded29251..f6db3c49 100644 --- a/template/server/stream.py +++ b/template/server/stream.py @@ -1,5 +1,5 @@ import json -from typing import Iterable, Mapping, Optional, AsyncIterable, Union +from typing import Mapping, Optional, AsyncIterable from fastapi.encoders import jsonable_encoder from starlette.background import BackgroundTask @@ -17,7 +17,7 @@ async def async_enumerate(async_sequence: AsyncIterable, start=0): idx += 1 -class StreamingLisJsonResponse(StreamingResponse): +class StreamingListJsonResponse(StreamingResponse): """Converts a pydantic model generator into a streaming HTTP Response that streams a JSON list, one element at a time. @@ -26,16 +26,14 @@ class StreamingLisJsonResponse(StreamingResponse): def __init__( self, - content_generator: Union[Iterable, AsyncIterable], + content_generator: AsyncIterable, status_code: int = 200, headers: Optional[Mapping[str, str]] = None, media_type: Optional[str] = None, background: Optional[BackgroundTask] = None, ) -> None: - if isinstance(content_generator, AsyncIterable): - body_iterator = self._encoded_async_generator(content_generator) - else: - body_iterator = self._encoded_generator(content_generator) + body_iterator = self._encoded_async_generator(content_generator) + super().__init__( content=body_iterator, status_code=status_code, @@ -48,16 +46,6 @@ async def _encoded_async_generator(self, async_generator: AsyncIterable): """Converts an asynchronous pydantic model generator into a streaming JSON list """ - async for idx, item in async_enumerate(async_generator): - yield json.dumps(jsonable_encoder(item)) - yield "\n" - yield '{"type": "end_of_execution"}' - - async def _encoded_generator(self, generator): - """Converts a synchronous pydantic model generator - into a streaming JSON list - """ - for idx, item in enumerate(generator): - yield json.dumps(jsonable_encoder(item)) - yield "\n" - yield '{"type": "end_of_execution"}' + async for _, item in async_enumerate(async_generator): + yield f"{json.dumps(jsonable_encoder(item))}\n" + yield '{"type": "end_of_execution"}\n' From d30d89df4d1fbf93679d1cd6d1bec1de6801b414 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 23:49:30 -0700 Subject: [PATCH 128/722] Fix results parsing in JS --- js/src/codeInterpreter.ts | 2 +- js/src/messaging.ts | 47 ++++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index c253a221..cd585e70 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -99,7 +99,7 @@ export class JupyterExtension { switch (msg.type) { case 'result': - const result = new Result(msg.data, true) + const result = new Result({ ...msg, type: undefined, is_main_result: undefined }, msg.is_main_result) results.push(result) if (opts?.onResult) { await opts.onResult(result) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 698d2565..dfa1136a 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -112,34 +112,39 @@ export class Result { readonly raw: RawData - constructor(data: RawData, public readonly isMainResult: boolean) { - this.text = data['text/plain'] - this.html = data['text/html'] - this.markdown = data['text/markdown'] - this.svg = data['image/svg+xml'] - this.png = data['image/png'] - this.jpeg = data['image/jpeg'] - this.pdf = data['application/pdf'] - this.latex = data['text/latex'] - this.json = data['application/json'] - this.javascript = data['application/javascript'] + constructor(rawData: RawData, public readonly isMainResult: boolean) { + const data = { ...rawData } + delete data['type'] + delete data['is_main_result'] + + this.text = data['text'] + this.html = data['html'] + this.markdown = data['markdown'] + this.svg = data['svg'] + this.png = data['png'] + this.jpeg = data['jpeg'] + this.pdf = data['pdf'] + this.latex = data['latex'] + this.json = data['json'] + this.javascript = data['javascript'] this.isMainResult = isMainResult this.raw = data this.extra = {} + for (const key of Object.keys(data)) { if ( ![ - 'text/plain', - 'text/html', - 'text/markdown', - 'image/svg+xml', - 'image/png', - 'image/jpeg', - 'application/pdf', - 'text/latex', - 'application/json', - 'application/javascript' + 'plain', + 'html', + 'markdown', + 'svg', + 'png', + 'jpeg', + 'pdf', + 'latex', + 'json', + 'javascript' ].includes(key) ) { this.extra[key] = data[key] From 39670a14034d49de02667bb72c751864f8cbf058 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 10 Jul 2024 23:53:24 -0700 Subject: [PATCH 129/722] Fix python result formats --- python/e2b_code_interpreter/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 16fa3f70..bcb8f447 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -123,6 +123,8 @@ def formats(self) -> Iterable[str]: :return: All available formats of the result in MIME types. """ formats = [] + if self.text: + formats.append("text") if self.html: formats.append("html") if self.markdown: From b3f6686102fd9e21dc5d9db1c297628c26ec20e7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 10:58:46 +0200 Subject: [PATCH 130/722] Change server port --- js/src/codeInterpreter.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- template/server/main.py | 1 - template/start-up.sh | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index cd585e70..d6bd9abe 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -245,7 +245,7 @@ export class JupyterExtension { export class CodeInterpreter extends Sandbox { protected static override readonly defaultTemplate: string = 'ci-no-ws' - protected static readonly jupyterPort = 8000 + protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(CodeInterpreter.jupyterPort)}`, diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index 9ff8c39f..8a783dcd 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,2 +1,2 @@ DEFAULT_TEMPLATE = "ci-no-ws" -JUPYTER_PORT = 8000 +JUPYTER_PORT = 49999 diff --git a/template/server/main.py b/template/server/main.py index abc60afc..73b6a15f 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -33,7 +33,6 @@ # TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? # TODO: Fix returned values in JS # TODO: Handle all types of messages in JS -# TODO: Change port so it is outside of the well known range @asynccontextmanager diff --git a/template/start-up.sh b/template/start-up.sh index da6e285b..67c4c418 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -26,7 +26,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null cd /root/.server/ - uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 --no-access-log --no-use-colors + uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors } echo "Starting Code Interpreter server..." From 3f730ba7861ae6ecac6e610aaaac436cdc5654c1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 11:17:17 +0200 Subject: [PATCH 131/722] Use context id and return object in list contexts --- .../code_interpreter_async.py | 6 +- .../code_interpreter_sync.py | 6 +- template/server/api/models/context.py | 7 ++ template/server/api/models/create_kernel.py | 4 +- template/server/main.py | 68 +++++++++---------- 5 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 template/server/api/models/context.py diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 4244b3be..8b982c2e 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -97,8 +97,7 @@ async def restart_kernel( logger.debug(f"Restarting kernel: {kernel_id}") response = await self._client.post( - f"{self._url}/contexts/restart", - json={"kernel_id": kernel_id}, + f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() @@ -112,8 +111,7 @@ async def shutdown_kernel( response = await self._client.request( method="DELETE", - url=f"{self._url}/contexts", - json={"kernel_id": kernel_id}, + url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 1abef312..d127bb9a 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -103,8 +103,7 @@ def shutdown_kernel( response = self._client.request( method="DELETE", - url=f"{self._url}/contexts", - json={"kernel_id": kernel_id}, + url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() @@ -117,8 +116,7 @@ def restart_kernel( logger.debug(f"Creating new kernel for language: {kernel_id}") response = self._client.post( - f"{self._url}/contexts/restart", - json={"kernel_id": kernel_id}, + f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() diff --git a/template/server/api/models/context.py b/template/server/api/models/context.py new file mode 100644 index 00000000..fdef94d1 --- /dev/null +++ b/template/server/api/models/context.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, StrictStr +from pydantic import Field + + +class Context(BaseModel): + id: StrictStr = Field(description="Context ID") + name: StrictStr = Field(description="Context name") diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py index fa6d42f9..57b3e633 100644 --- a/template/server/api/models/create_kernel.py +++ b/template/server/api/models/create_kernel.py @@ -3,7 +3,7 @@ from pydantic import Field -class CreateKernel(BaseModel): +class CreateContext(BaseModel): cwd: Optional[StrictStr] = Field( default=None, description="Current working directory" ) @@ -15,7 +15,7 @@ class CreateKernel(BaseModel): ) -class RestartKernel(BaseModel): +class RestartContext(BaseModel): kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/main.py b/template/server/main.py index 73b6a15f..f54f0357 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -3,13 +3,13 @@ import uuid import httpx -from typing import Dict, Union, Literal +from typing import Dict, Union, Literal, List from pydantic import StrictStr from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException -from api.models.create_kernel import CreateKernel, RestartKernel, ShutdownKernel -from messaging import JupyterKernelWebSocket +from api.models.context import Context +from api.models.create_kernel import CreateContext, RestartContext, ShutdownKernel from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket from stream import StreamingListJsonResponse @@ -29,8 +29,6 @@ # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx # TODO: Fix on_* handler types on clients for them to be the same as in current prod CI # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods -# TODO: Return objects not just plain types from api (list kernels) so we can expand it later with more data (kernel language, cwd, etc.) -# TODO: Should we use kernel ids as context ids and have /contexts/{context_id}/restart, etc? # TODO: Fix returned values in JS # TODO: Handle all types of messages in JS @@ -88,7 +86,7 @@ async def execute(request: ExecutionRequest): @app.post("/contexts") -async def create_kernel(request: CreateKernel): +async def create_context(request: CreateContext) -> Context: logger.info(f"Creating new kernel for language: {request.language}") kernel_name = request.language or "python3" @@ -131,85 +129,85 @@ async def create_kernel(request: CreateKernel): websockets[kernel_id] = ws - return {"kernel_id": kernel_id} + return Context(name=kernel_name, id=kernel_id) @app.get("/contexts") -async def list_kernels(): - logger.info(f"Listing kernels") +async def list_contexts() -> List[Context]: + logger.info(f"Listing contexts") kernel_ids = list(websockets.keys()) kernel_ids.remove(default_kernel_id) return [ - { - "kernel_id": websockets[kernel_id].kernel_id, - "name": websockets[kernel_id].name, - } + Context( + id=websockets[kernel_id].kernel_id, + name=websockets[kernel_id].name, + ) for kernel_id in kernel_ids ] -@app.post("/contexts/restart") -async def restart_kernel(request: RestartKernel): - logger.info(f"Restarting kernel") +@app.post("/contexts/{context_id}/restart") +async def restart_context(context_id: str) -> None: + logger.info(f"Restarting context {context_id}") - kernel_id = request.kernel_id or "default" + context_id = context_id or "default" - ws = websockets.get(kernel_id, None) + ws = websockets.get(context_id, None) if not ws: raise HTTPException( status_code=404, - detail=f"Kernel {kernel_id} not found", + detail=f"Kernel {context_id} not found", ) - kernel_id = ws.kernel_id + context_id = ws.kernel_id session_id = ws.session_id await ws.close() response = await client.post( - f"http://localhost:8888/api/kernels/{kernel_id}/restart" + f"http://localhost:8888/api/kernels/{context_id}/restart" ) if not response.is_success: raise HTTPException( status_code=500, - detail=f"Failed to restart kernel {kernel_id}", + detail=f"Failed to restart context {context_id}", ) - ws = JupyterKernelWebSocket(kernel_id, session_id, ws.name) + ws = JupyterKernelWebSocket(context_id, session_id, ws.name) - task = asyncio.create_task(ws.connect()) + _ = asyncio.create_task(ws.connect()) await ws.started - websockets[kernel_id] = ws + websockets[context_id] = ws -@app.delete("/contexts") -async def shutdown_kernel(request: ShutdownKernel): - logger.info(f"Shutting down kernel") +@app.delete("/contexts/{context_id}") +async def remove_context(context_id: str) -> None: + logger.info(f"Removing context {context_id}") - kernel_id = request.kernel_id or "default" + context_id = context_id or "default" - ws = websockets.get(kernel_id, None) + ws = websockets.get(context_id, None) if not ws: raise HTTPException( status_code=404, - detail=f"Kernel {kernel_id} not found", + detail=f"Kernel {context_id} not found", ) - kernel_id = ws.kernel_id + context_id = ws.kernel_id try: await ws.close() except: pass - response = await client.delete(f"http://localhost:8888/api/kernels/{kernel_id}") + response = await client.delete(f"http://localhost:8888/api/kernels/{context_id}") if not response.is_success: raise HTTPException( status_code=500, - detail=f"Failed to shutdown kernel {kernel_id}", + detail=f"Failed to remove context {context_id}", ) - del websockets[kernel_id] + del websockets[context_id] From a16116f0e9c516105bcee833879a47c49ccb3456 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 11:43:27 +0200 Subject: [PATCH 132/722] Add comment --- template/server/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index f54f0357..d23a586c 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -26,7 +26,7 @@ # TODO: Increase timeout for requests to allow streaming, increase max request/response sizes to acommodate larger results, Increase keepalive timeout # TODO: Handle pings from server so we can keep the connection from idling -# TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx +# TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? # TODO: Fix on_* handler types on clients for them to be the same as in current prod CI # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods # TODO: Fix returned values in JS From 20d3f77c54ea12f02a6ce95b8d221a96767e6fe5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 11:52:29 +0200 Subject: [PATCH 133/722] Fix server port --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7a1a65ef..c47bac6b 100644 --- a/Makefile +++ b/Makefile @@ -12,4 +12,4 @@ generate: start-template-server: - docker run --rm -p 8000:8000 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) \ No newline at end of file + docker run --rm -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) From c69838eb5ac79ae29b6f9a448f3d5a438e2147b2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 13:26:08 +0200 Subject: [PATCH 134/722] Fix kernel methods --- .../code_interpreter_sync.py | 6 +++-- python/tests/sync/test_kernels.py | 4 +-- python/tests/sync/test_streaming.py | 4 +-- template/e2b.Dockerfile | 2 -- template/server/main.py | 25 +++++++------------ template/server/messaging.py | 11 ++++++-- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index d127bb9a..a06cf109 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -92,7 +92,8 @@ def create_kernel( ) response.raise_for_status() - return response.json().kernel_id + data = response.json() + return data['id'] def shutdown_kernel( self, @@ -115,6 +116,7 @@ def restart_kernel( ) -> None: logger.debug(f"Creating new kernel for language: {kernel_id}") + kernel_id = kernel_id or "default" response = self._client.post( f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, @@ -140,7 +142,7 @@ def list_kernels( ) response.raise_for_status() - return [Kernel(k.kernel_id, k.name) for k in response.json()] + return [Kernel(k['id'], k['name']) for k in response.json()] class CodeInterpreter(Sandbox): diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index 4fd6da79..d12bad13 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -36,10 +36,10 @@ def test_list_kernels(sandbox: CodeInterpreter): def test_shutdown(sandbox: CodeInterpreter): kernel_id = sandbox.notebook.create_kernel() kernels = sandbox.notebook.list_kernels() - assert kernel_id in kernels + assert kernel_id in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 2 sandbox.notebook.shutdown_kernel(kernel_id) kernels = sandbox.notebook.list_kernels() - assert kernel_id not in kernels + assert kernel_id not in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 1 diff --git a/python/tests/sync/test_streaming.py b/python/tests/sync/test_streaming.py index ea46b78f..6b9cd8da 100644 --- a/python/tests/sync/test_streaming.py +++ b/python/tests/sync/test_streaming.py @@ -11,7 +11,7 @@ def test(line) -> None: sandbox.notebook.exec_cell("print(1)", on_stdout=test) assert len(out) == 1 - assert out[0] == "1\n" + assert out[0].line == "1\n" def test_streaming_error(sandbox: CodeInterpreter): @@ -22,7 +22,7 @@ def test_streaming_error(sandbox: CodeInterpreter): ) assert len(out) == 1 - assert out[0] == "1\n" + assert out[0].line == "1\n" def test_streaming_result(sandbox: CodeInterpreter): diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 524e5cb4..afff0b4a 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -27,6 +27,4 @@ COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ COPY ./server $SERVER_PATH -EXPOSE 8000 - ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/server/main.py b/template/server/main.py index d23a586c..945321a6 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -9,7 +9,7 @@ from fastapi import FastAPI, HTTPException from api.models.context import Context -from api.models.create_kernel import CreateContext, RestartContext, ShutdownKernel +from api.models.create_kernel import CreateContext from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket from stream import StreamingListJsonResponse @@ -17,6 +17,8 @@ logging.basicConfig(level=logging.DEBUG) logger = logging.Logger(__name__) +http_logger = logging.getLogger("httpcore.http11") +http_logger.setLevel(logging.WARNING) websockets: Dict[Union[str, StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} global default_kernel_id @@ -48,17 +50,16 @@ async def lifespan(app: FastAPI): default_ws = JupyterKernelWebSocket(default_kernel_id, session_id, "python") websockets["default"] = default_ws - websockets["python"] = default_ws logger.info("Connecting to default runtime") - task = asyncio.create_task(default_ws.connect()) + _ = asyncio.create_task(default_ws.connect()) await default_ws.started logger.info("Connected to default runtime") yield - await default_ws.close() - task.cancel() + for ws in websockets.values(): + await ws.close() await client.aclose() @@ -137,7 +138,6 @@ async def list_contexts() -> List[Context]: logger.info(f"Listing contexts") kernel_ids = list(websockets.keys()) - kernel_ids.remove(default_kernel_id) return [ Context( @@ -152,8 +152,6 @@ async def list_contexts() -> List[Context]: async def restart_context(context_id: str) -> None: logger.info(f"Restarting context {context_id}") - context_id = context_id or "default" - ws = websockets.get(context_id, None) if not ws: raise HTTPException( @@ -161,13 +159,12 @@ async def restart_context(context_id: str) -> None: detail=f"Kernel {context_id} not found", ) - context_id = ws.kernel_id session_id = ws.session_id await ws.close() response = await client.post( - f"http://localhost:8888/api/kernels/{context_id}/restart" + f"http://localhost:8888/api/kernels/{ws.kernel_id}/restart" ) if not response.is_success: raise HTTPException( @@ -175,7 +172,7 @@ async def restart_context(context_id: str) -> None: detail=f"Failed to restart context {context_id}", ) - ws = JupyterKernelWebSocket(context_id, session_id, ws.name) + ws = JupyterKernelWebSocket(ws.kernel_id, session_id, ws.name) _ = asyncio.create_task(ws.connect()) await ws.started @@ -187,8 +184,6 @@ async def restart_context(context_id: str) -> None: async def remove_context(context_id: str) -> None: logger.info(f"Removing context {context_id}") - context_id = context_id or "default" - ws = websockets.get(context_id, None) if not ws: raise HTTPException( @@ -196,14 +191,12 @@ async def remove_context(context_id: str) -> None: detail=f"Kernel {context_id} not found", ) - context_id = ws.kernel_id - try: await ws.close() except: pass - response = await client.delete(f"http://localhost:8888/api/kernels/{context_id}") + response = await client.delete(f"http://localhost:8888/api/kernels/{ws.kernel_id}") if not response.is_success: raise HTTPException( status_code=500, diff --git a/template/server/messaging.py b/template/server/messaging.py index a4c485c6..89a8860e 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -237,8 +237,15 @@ async def _process_message(self, data: dict): logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") async def close(self): - logger.debug("Closing WebSocket") - self._stopped.set_result(None) + logger.debug(f"Closing WebSocket {self.kernel_id}") + try: + self._stopped.set_result(None) + except Exception as e: + logger.error(f"Error while closing WebSocket {self.kernel_id}: {e}") + + for cleanup in self._process_cleanup: + cleanup() + if self._ws is not None: await self._ws.close() From 4b323e857f58d4bbc152482d05fbbabe1b3a5e7f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 13:45:36 +0200 Subject: [PATCH 135/722] Fix list test --- python/tests/sync/test_kernels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index d12bad13..2dde711c 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -29,7 +29,7 @@ def test_list_kernels(sandbox: CodeInterpreter): kernel_id = sandbox.notebook.create_kernel() kernels = sandbox.notebook.list_kernels() - assert kernel_id in kernels + assert kernel_id in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 2 From eec112ca0b0ada4b2e2dc4de021c32250ededccf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 13:56:42 +0200 Subject: [PATCH 136/722] Run async tests --- python/e2b_code_interpreter/code_interpreter_sync.py | 4 ++-- python/pytest.ini | 2 ++ python/tests/async/test_bash.py | 4 +--- python/tests/async/test_basic.py | 4 ---- python/tests/async/test_display_data.py | 3 --- python/tests/async/test_execution_count.py | 3 --- python/tests/async/test_kernels.py | 7 ------- python/tests/async/test_reconnect.py | 3 --- python/tests/async/test_statefulness.py | 3 --- python/tests/async/test_streaming.py | 5 ----- 10 files changed, 5 insertions(+), 33 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index a06cf109..14e55732 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -93,7 +93,7 @@ def create_kernel( response.raise_for_status() data = response.json() - return data['id'] + return data["id"] def shutdown_kernel( self, @@ -142,7 +142,7 @@ def list_kernels( ) response.raise_for_status() - return [Kernel(k['id'], k['name']) for k in response.json()] + return [Kernel(k["id"], k["name"]) for k in response.json()] class CodeInterpreter(Sandbox): diff --git a/python/pytest.ini b/python/pytest.ini index 7776d099..adebb2fb 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -2,5 +2,7 @@ [pytest] markers = skip_debug: skip test if E2B_DEBUG is set. +asyncio_mode=auto addopts = "--import-mode=importlib" + diff --git a/python/tests/async/test_bash.py b/python/tests/async/test_bash.py index 5227ce09..871e9fb8 100644 --- a/python/tests/async/test_bash.py +++ b/python/tests/async/test_bash.py @@ -1,8 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture + async def test_bash(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/async/test_basic.py b/python/tests/async/test_basic.py index 65d8cf63..946b8463 100644 --- a/python/tests/async/test_basic.py +++ b/python/tests/async/test_basic.py @@ -1,10 +1,6 @@ -import pytest_asyncio - - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_basic(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_display_data.py b/python/tests/async/test_display_data.py index 32039993..976f552e 100644 --- a/python/tests/async/test_display_data.py +++ b/python/tests/async/test_display_data.py @@ -1,9 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_display_data(async_sandbox: AsyncCodeInterpreter): # plot random graph result = await async_sandbox.notebook.exec_cell( diff --git a/python/tests/async/test_execution_count.py b/python/tests/async/test_execution_count.py index 383f410b..01337f6e 100644 --- a/python/tests/async/test_execution_count.py +++ b/python/tests/async/test_execution_count.py @@ -1,9 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_execution_count(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = await async_sandbox.notebook.exec_cell("!pwd") diff --git a/python/tests/async/test_kernels.py b/python/tests/async/test_kernels.py index a1dd7542..7ccb714a 100644 --- a/python/tests/async/test_kernels.py +++ b/python/tests/async/test_kernels.py @@ -1,14 +1,10 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_create_new_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.create_kernel() -@pytest_asyncio.fixture async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() await async_sandbox.notebook.exec_cell("x = 1") @@ -18,7 +14,6 @@ async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" -@pytest_asyncio.fixture async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") await async_sandbox.notebook.restart_kernel() @@ -28,7 +23,6 @@ async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" -@pytest_asyncio.fixture async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): kernels = await async_sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -39,7 +33,6 @@ async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): assert len(kernels) == 2 -@pytest_asyncio.fixture async def test_shutdown(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() diff --git a/python/tests/async/test_reconnect.py b/python/tests/async/test_reconnect.py index f23e7010..acccd0b8 100644 --- a/python/tests/async/test_reconnect.py +++ b/python/tests/async/test_reconnect.py @@ -1,9 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_reconnect(async_sandbox: AsyncCodeInterpreter): sandbox_id = async_sandbox.sandbox_id diff --git a/python/tests/async/test_statefulness.py b/python/tests/async/test_statefulness.py index e181753f..bae8e301 100644 --- a/python/tests/async/test_statefulness.py +++ b/python/tests/async/test_statefulness.py @@ -1,9 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_stateful(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") diff --git a/python/tests/async/test_streaming.py b/python/tests/async/test_streaming.py index d508a4fa..2cc41a58 100644 --- a/python/tests/async/test_streaming.py +++ b/python/tests/async/test_streaming.py @@ -1,9 +1,6 @@ -import pytest_asyncio - from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -@pytest_asyncio.fixture async def test_streaming_output(async_sandbox: AsyncCodeInterpreter): out = [] @@ -17,7 +14,6 @@ def test(line) -> None: assert out[0] == "1\n" -@pytest_asyncio.fixture async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): out = [] @@ -29,7 +25,6 @@ async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): assert out[0] == "1\n" -@pytest_asyncio.fixture async def test_streaming_result(async_sandbox: AsyncCodeInterpreter): code = """ import matplotlib.pyplot as plt From 909728f0174a3d5aca06351967a0d26b08e82669 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 14:14:03 +0200 Subject: [PATCH 137/722] Fix async --- .../code_interpreter_async.py | 41 +++++++++++-------- .../code_interpreter_sync.py | 4 +- python/pytest.ini | 3 +- .../{test_bash.py => test_async_bash.py} | 0 .../{test_basic.py => test_async_basic.py} | 0 ...lay_data.py => test_async_display_data.py} | 0 ...count.py => test_async_execution_count.py} | 0 ...{test_kernels.py => test_async_kernels.py} | 6 +-- ...t_reconnect.py => test_async_reconnect.py} | 0 ...efulness.py => test_async_statefulness.py} | 0 ...t_streaming.py => test_async_streaming.py} | 4 +- 11 files changed, 33 insertions(+), 25 deletions(-) rename python/tests/async/{test_bash.py => test_async_bash.py} (100%) rename python/tests/async/{test_basic.py => test_async_basic.py} (100%) rename python/tests/async/{test_display_data.py => test_async_display_data.py} (100%) rename python/tests/async/{test_execution_count.py => test_async_execution_count.py} (100%) rename python/tests/async/{test_kernels.py => test_async_kernels.py} (88%) rename python/tests/async/{test_reconnect.py => test_async_reconnect.py} (100%) rename python/tests/async/{test_statefulness.py => test_async_statefulness.py} (100%) rename python/tests/async/{test_streaming.py => test_async_streaming.py} (93%) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 8b982c2e..04e3a996 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -49,23 +49,27 @@ async def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout + execution = Execution() async with self._client.stream( "POST", - self._url, + f"{self._url}/execute", json={ "code": code, "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: - response.raise_for_status() - execution = Execution() - async for line in response.aiter_lines(): - parse_output(execution, line, on_stdout, on_stderr, on_result) + parse_output( + execution, + line, + on_stdout=on_stdout, + on_stderr=on_stderr, + on_result=on_result, + ) return execution @@ -87,31 +91,34 @@ async def create_kernel( ) response.raise_for_status() - return response.json().kernel_id + data = response.json() + return data["id"] - async def restart_kernel( + async def shutdown_kernel( self, kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Restarting kernel: {kernel_id}") + logger.debug(f"Shutting down a kernel with id {kernel_id}") - response = await self._client.post( - f"{self._url}/contexts/{kernel_id}/restart", + kernel_id = kernel_id or "default" + response = await self._client.request( + method="DELETE", + url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() - async def shutdown_kernel( + async def restart_kernel( self, kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Creating new kernel for language: {kernel_id}") + logger.debug(f"Restarting kernel: {kernel_id}") - response = await self._client.request( - method="DELETE", - url=f"{self._url}/contexts/{kernel_id}", + kernel_id = kernel_id or "default" + response = await self._client.post( + f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, ) response.raise_for_status() @@ -135,7 +142,7 @@ async def list_kernels( ) response.raise_for_status() - return [Kernel(k.kernel_id, k.name) for k in response.json()] + return [Kernel(k["id"], k["name"]) for k in response.json()] class AsyncCodeInterpreter(AsyncSandbox): @@ -149,7 +156,7 @@ def notebook(self) -> JupyterExtension: def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): super().__init__(sandbox_id, connection_config) - jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}/execute" + jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" self._notebook = JupyterExtension( jupyter_url, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 14e55732..8bf86403 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -56,7 +56,6 @@ def exec_cell( f"{self._url}/execute", json={ "code": code, - # "language": language, "kernel_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), @@ -100,8 +99,9 @@ def shutdown_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Creating new kernel for language: {kernel_id}") + logger.debug(f"Shutting down a kernel with id {kernel_id}") + kernel_id = kernel_id or "default" response = self._client.request( method="DELETE", url=f"{self._url}/contexts/{kernel_id}", diff --git a/python/pytest.ini b/python/pytest.ini index adebb2fb..c493232f 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,5 +4,6 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addopts = "--import-mode=importlib" +addpots = '--import-mode=importlib' +addopts = '--numprocesses=auto' diff --git a/python/tests/async/test_bash.py b/python/tests/async/test_async_bash.py similarity index 100% rename from python/tests/async/test_bash.py rename to python/tests/async/test_async_bash.py diff --git a/python/tests/async/test_basic.py b/python/tests/async/test_async_basic.py similarity index 100% rename from python/tests/async/test_basic.py rename to python/tests/async/test_async_basic.py diff --git a/python/tests/async/test_display_data.py b/python/tests/async/test_async_display_data.py similarity index 100% rename from python/tests/async/test_display_data.py rename to python/tests/async/test_async_display_data.py diff --git a/python/tests/async/test_execution_count.py b/python/tests/async/test_async_execution_count.py similarity index 100% rename from python/tests/async/test_execution_count.py rename to python/tests/async/test_async_execution_count.py diff --git a/python/tests/async/test_kernels.py b/python/tests/async/test_async_kernels.py similarity index 88% rename from python/tests/async/test_kernels.py rename to python/tests/async/test_async_kernels.py index 7ccb714a..9acddd89 100644 --- a/python/tests/async/test_kernels.py +++ b/python/tests/async/test_async_kernels.py @@ -29,17 +29,17 @@ async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id in kernels + assert kernel_id in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 2 async def test_shutdown(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id in kernels + assert kernel_id in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 2 await async_sandbox.notebook.shutdown_kernel(kernel_id) kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id not in kernels + assert kernel_id not in [kernel.kernel_id for kernel in kernels] assert len(kernels) == 1 diff --git a/python/tests/async/test_reconnect.py b/python/tests/async/test_async_reconnect.py similarity index 100% rename from python/tests/async/test_reconnect.py rename to python/tests/async/test_async_reconnect.py diff --git a/python/tests/async/test_statefulness.py b/python/tests/async/test_async_statefulness.py similarity index 100% rename from python/tests/async/test_statefulness.py rename to python/tests/async/test_async_statefulness.py diff --git a/python/tests/async/test_streaming.py b/python/tests/async/test_async_streaming.py similarity index 93% rename from python/tests/async/test_streaming.py rename to python/tests/async/test_async_streaming.py index 2cc41a58..439b282b 100644 --- a/python/tests/async/test_streaming.py +++ b/python/tests/async/test_async_streaming.py @@ -11,7 +11,7 @@ def test(line) -> None: await async_sandbox.notebook.exec_cell("print(1)", on_stdout=test) assert len(out) == 1 - assert out[0] == "1\n" + assert out[0].line == "1\n" async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): @@ -22,7 +22,7 @@ async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): ) assert len(out) == 1 - assert out[0] == "1\n" + assert out[0].line == "1\n" async def test_streaming_result(async_sandbox: AsyncCodeInterpreter): From 4f839e2fd64059f349808143e0ac52515da3673e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 14:51:46 +0200 Subject: [PATCH 138/722] Fix JS kernel methods --- js/src/codeInterpreter.ts | 20 +++++++++----------- js/tests/kernels.test.ts | 11 ++++++++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index d6bd9abe..3f9f9e6a 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -163,7 +163,7 @@ export class JupyterExtension { 'Content-Type': 'application/json', }, body: JSON.stringify({ - language: kernelName, + kernel_name: kernelName, cwd: cwd || '/home/user' }), keepalive: true, @@ -174,7 +174,8 @@ export class JupyterExtension { throw new Error(`Failed to create kernel: ${res.statusText} ${await res?.text()}`) } - return res.json() + const data = await res.json() + return data.id } async restartKernel({ @@ -184,14 +185,12 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - const res = await fetch(`${this.url}/contexts/restart`, { + kernelID = kernelID || 'default' + const res = await fetch(`${this.url}/contexts/${kernelID}/restart`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ - kernel_id: kernelID, - }), keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), }) @@ -208,14 +207,13 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - const res = await fetch(`${this.url}/contexts`, { + kernelID = kernelID || 'default' + + const res = await fetch(`${this.url}/contexts/${kernelID}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ - kernel_id: kernelID, - }), keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), }) @@ -239,7 +237,7 @@ export class JupyterExtension { throw new Error(`Failed to list kernels: ${res.statusText} ${await res?.text()}`) } - return (await res.json()).map((kernel: any) => ({ kernelID: kernel.kernel_id, name: kernel.name })) + return (await res.json()).map((kernel: any) => ({ kernelID: kernel.id, name: kernel.name })) } } diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 300b1ff3..37e8ab6e 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -29,6 +29,15 @@ sandboxTest('list kernels', async ({ sandbox }) => { const kernelID = await sandbox.notebook.createKernel() kernels = await sandbox.notebook.listKernels() - expect(kernels).toContain(kernelID) + expect(kernels.map(kernel => kernel.kernelID)).toContain(kernelID) expect(kernels.length).toEqual(2) }) +sandboxTest('shutdown kernel', async ({ sandbox }) => { + let kernels = await sandbox.notebook.listKernels() + expect(kernels.length).toEqual(1) + + const kernelID = await sandbox.notebook.shutdownKernel() + kernels = await sandbox.notebook.listKernels() + expect(kernels).not.toContain(kernelID) + expect(kernels.length).toEqual(0) +}) From 9eb5d7b502105f9b3842ab6d100f9c898745e403 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 15:20:54 +0200 Subject: [PATCH 139/722] Fix test workflow --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1e7c8fed..850b7bc5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: python: ${{ steps.filter.outputs.python }} + js: ${{ steps.filter.outputs.js }} steps: - name: Checkout repository uses: actions/checkout@v3 From b99cbe6207d06a3b78fa8da98c9bfe487155d1fd Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 11 Jul 2024 16:40:59 +0200 Subject: [PATCH 140/722] Remove done todos --- template/server/main.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 945321a6..758d9e2f 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -31,8 +31,6 @@ # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? # TODO: Fix on_* handler types on clients for them to be the same as in current prod CI # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods -# TODO: Fix returned values in JS -# TODO: Handle all types of messages in JS @asynccontextmanager From d5c843f616e05fcf183a4332ce2106228985cd2a Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 09:47:20 -0700 Subject: [PATCH 141/722] Enable js test in PR --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1e7c8fed..850b7bc5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: python: ${{ steps.filter.outputs.python }} + js: ${{ steps.filter.outputs.js }} steps: - name: Checkout repository uses: actions/checkout@v3 From c8d07a2d4e07a93bfef6159b14e5ae08049c11d1 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 12:30:39 -0700 Subject: [PATCH 142/722] Fix pytest config; Cleanup clients in SDKs --- js/src/codeInterpreter.ts | 3 --- python/e2b_code_interpreter/code_interpreter_async.py | 3 +-- python/e2b_code_interpreter/code_interpreter_sync.py | 3 +-- python/pytest.ini | 4 +--- template/server/main.py | 1 - 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 3f9f9e6a..2cd4490a 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -211,9 +211,6 @@ export class JupyterExtension { const res = await fetch(`${this.url}/contexts/${kernelID}`, { method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), }) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 04e3a996..3ee2a253 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -102,8 +102,7 @@ async def shutdown_kernel( logger.debug(f"Shutting down a kernel with id {kernel_id}") kernel_id = kernel_id or "default" - response = await self._client.request( - method="DELETE", + response = await self._client.delete( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 8bf86403..dee581fe 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -102,8 +102,7 @@ def shutdown_kernel( logger.debug(f"Shutting down a kernel with id {kernel_id}") kernel_id = kernel_id or "default" - response = self._client.request( - method="DELETE", + response = self._client.delete( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) diff --git a/python/pytest.ini b/python/pytest.ini index c493232f..2b1ebd0a 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,6 +4,4 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addpots = '--import-mode=importlib' -addopts = '--numprocesses=auto' - +addopts = "--import-mode=importlib" "--numprocesses=auto" diff --git a/template/server/main.py b/template/server/main.py index 758d9e2f..e34c198d 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -29,7 +29,6 @@ # TODO: Increase timeout for requests to allow streaming, increase max request/response sizes to acommodate larger results, Increase keepalive timeout # TODO: Handle pings from server so we can keep the connection from idling # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? -# TODO: Fix on_* handler types on clients for them to be the same as in current prod CI # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods From 1e901fa2771c57386f5e6d4859b16efc406bc217 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:11:21 -0700 Subject: [PATCH 143/722] Extract JS output parsing --- js/src/codeInterpreter.ts | 59 +++++---------------------------------- js/src/messaging.ts | 50 +++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 54 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 2cd4490a..f9c51ea5 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,6 +1,6 @@ import { ConnectionConfig, Sandbox } from 'e2b' -import { Result, Execution, ExecutionError, OutputMessage } from './messaging' +import { Result, Execution, ExecutionError, OutputMessage, parseOutput } from './messaging' async function* readLines(stream: ReadableStream) { const reader = stream.getReader(); @@ -10,9 +10,12 @@ async function* readLines(stream: ReadableStream) { while (true) { const { done, value } = await reader.read(); + console.log('check') + if (value !== undefined) { buffer += new TextDecoder().decode(value) } + console.log('inc message', buffer) if (done) { if (buffer.length > 0) { @@ -87,65 +90,17 @@ export class JupyterExtension { }, bodyTimeout) : undefined - const results: Result[] = [] - let stdout: string[] = [] - let stderr: string[] = [] - let error: ExecutionError | undefined = undefined - let executionCount: number | undefined = undefined + const execution = new Execution() try { for await (const chunk of readLines(res.body)) { - const msg = JSON.parse(chunk) - - switch (msg.type) { - case 'result': - const result = new Result({ ...msg, type: undefined, is_main_result: undefined }, msg.is_main_result) - results.push(result) - if (opts?.onResult) { - await opts.onResult(result) - } - break - case 'stdout': - stdout.push(msg.text) - if (opts?.onStdout) { - await opts.onStdout({ - error: false, - line: msg.text, - timestamp: new Date().getTime() * 1000, - }) - } - break - case 'stderr': - stderr.push(msg.text) - if (opts?.onStderr) { - await opts.onStderr({ - error: true, - line: msg.text, - timestamp: new Date().getTime() * 1000, - }) - } - break - case 'error': - error = new ExecutionError(msg.name, msg.value, msg.traceback) - break - case 'number_of_executions': - executionCount = msg.execution_count - break - } + await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult) } } finally { clearTimeout(bodyTimer) } - return new Execution( - results, - { - stdout, - stderr, - }, - error, - executionCount, - ) + return execution } async createKernel({ diff --git a/js/src/messaging.ts b/js/src/messaging.ts index dfa1136a..608fc77c 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -236,11 +236,11 @@ export class Execution { /** * List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). */ - public results: Result[], + public results: Result[] = [], /** * Logs printed to stdout and stderr during execution. */ - public logs: Logs, + public logs: Logs = { stdout: [], stderr: [] }, /** * An Error object if an error occurred, null otherwise. */ @@ -273,3 +273,49 @@ export class Execution { } } } + +export async function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => (Promise | any), + onStderr?: (output: OutputMessage) => (Promise | any), + onResult?: (data: Result) => (Promise | any), +) { + const msg = JSON.parse(line) + + switch (msg.type) { + case 'result': + const result = new Result({ ...msg, type: undefined, is_main_result: undefined }, msg.is_main_result) + execution.results.push(result) + if (onResult) { + await onResult(result) + } + break + case 'stdout': + execution.logs.stdout.push(msg.text) + if (onStdout) { + await onStdout({ + error: false, + line: msg.text, + timestamp: new Date().getTime() * 1000, + }) + } + break + case 'stderr': + execution.logs.stderr.push(msg.text) + if (onStderr) { + await onStderr({ + error: true, + line: msg.text, + timestamp: new Date().getTime() * 1000, + }) + } + break + case 'error': + execution.error = new ExecutionError(msg.name, msg.value, msg.traceback) + break + case 'number_of_executions': + execution.executionCount = msg.execution_count + break + } +} \ No newline at end of file From b99e6f4ca3451675e5e829f1c1f0b49425149e79 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:11:39 -0700 Subject: [PATCH 144/722] Fix incorrect split of the execution logs --- python/e2b_code_interpreter/__init__.py | 2 +- .../code_interpreter_async.py | 5 +- .../code_interpreter_sync.py | 5 +- python/e2b_code_interpreter/models.py | 104 +++++++----------- template/server/main.py | 6 +- 5 files changed, 53 insertions(+), 69 deletions(-) diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index f495bb32..ce68fdcc 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -2,4 +2,4 @@ from .code_interpreter_sync import CodeInterpreter from .code_interpreter_async import AsyncCodeInterpreter -from .models import Execution, Error, Result, KernelException, MIMEType, Logs +from .models import Execution, ExecutionError, Result, KernelException, MIMEType, Logs diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 3ee2a253..490fe713 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -49,7 +49,6 @@ async def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout - execution = Execution() async with self._client.stream( "POST", @@ -62,7 +61,11 @@ async def exec_cell( ) as response: response.raise_for_status() + execution = Execution() + async for line in response.aiter_lines(): + print("line", line) + parse_output( execution, line, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index dee581fe..1ef4c898 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -49,7 +49,6 @@ def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout - execution = Execution() with self._client.stream( "POST", @@ -62,6 +61,8 @@ def exec_cell( ) as response: response.raise_for_status() + execution = Execution() + for line in response.iter_lines(): parse_output( execution, @@ -71,7 +72,7 @@ def exec_cell( on_result=on_result, ) - return execution + return execution def create_kernel( self, diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index bcb8f447..a261ff9e 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,6 +1,6 @@ import json -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import ( List, Optional, @@ -13,8 +13,6 @@ Union, ) -from e2b.sandbox.process.process_handle import Stdout, Stderr - T = TypeVar("T") OutputHandler = Union[ @@ -36,16 +34,16 @@ def __str__(self): return self.line -class Error: +@dataclass +class ExecutionError: """ Represents an error that occurred during the execution of a cell. The error contains the name of the error, the value of the error, and the traceback. """ - def __init__(self, name: str, value: str, traceback: List[str]): - self.name = name - self.value = value - self.traceback_raw = traceback + name: str + value: str + traceback_raw: List[str] @property def traceback(self) -> str: @@ -70,6 +68,7 @@ class MIMEType(str): """ +@dataclass class Result: """ Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. @@ -85,36 +84,20 @@ class Result: def __getitem__(self, item): return getattr(self, item) - # Allows to iterate over formats() - def __init__( - self, - text: Optional[str] = None, - html: Optional[str] = None, - markdown: Optional[str] = None, - svg: Optional[str] = None, - png: Optional[str] = None, - jpeg: Optional[str] = None, - pdf: Optional[str] = None, - latex: Optional[str] = None, - json: Optional[dict] = None, - javascript: Optional[str] = None, - is_main_result: bool = False, - extra: Optional[dict] = None, - ): - self.text = text - self.html = html - self.markdown = markdown - self.svg = svg - self.png = png - self.jpeg = jpeg - self.pdf = pdf - self.latex = latex - self.json = json - self.javascript = javascript - self.is_main_result = is_main_result - """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" - self.extra = extra or {} - """Extra data that can be included. Not part of the standard types.""" + text: Optional[str] = None + html: Optional[str] = None + markdown: Optional[str] = None + svg: Optional[str] = None + png: Optional[str] = None + jpeg: Optional[str] = None + pdf: Optional[str] = None + latex: Optional[str] = None + json: Optional[dict] = None + javascript: Optional[str] = None + is_main_result: bool = False + """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" + extra: Optional[dict] = None + """Extra data that can be included. Not part of the standard types.""" def formats(self) -> Iterable[str]: """ @@ -144,8 +127,9 @@ def formats(self) -> Iterable[str]: if self.javascript: formats.append("javascript") - for key in self.extra: - formats.append(key) + if self.extra: + for key in self.extra: + formats.append(key) return formats @@ -233,20 +217,16 @@ def _repr_javascript_(self) -> Optional[str]: return self.javascript +@dataclass(repr=False) class Logs: """ Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. """ - def __init__( - self, - stdout: Optional[List[str]] = None, - stderr: Optional[List[str]] = None, - ): - self.stdout = stdout or [] - """List of strings printed to stdout by prints, subprocesses, etc.""" - self.stderr = stderr or [] - """List of strings printed to stderr by prints, subprocesses, etc.""" + stdout: List[str] = field(default_factory=list) + """List of strings printed to stdout by prints, subprocesses, etc.""" + stderr: List[str] = field(default_factory=list) + """List of strings printed to stderr by prints, subprocesses, etc.""" def __repr__(self): return f"Logs(stdout: {self.stdout}, stderr: {self.stderr})" @@ -271,20 +251,20 @@ def serialize_results(results: List[Result]) -> List[Dict[str, str]]: return serialized +@dataclass(repr=False) class Execution: """ Represents the result of a cell execution. """ - def __init__(self, **kwargs): - self.results: List[Result] = kwargs.pop("results", []) - """List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).""" - self.logs: Logs = kwargs.pop("logs", Logs()) - """Logs printed to stdout and stderr during execution.""" - self.error: Optional[Error] = kwargs.pop("error", None) - """Error object if an error occurred, None otherwise.""" - self.execution_count: Optional[int] = kwargs.pop("execution_count", None) - """Execution count of the cell.""" + results: List[Result] = field(default_factory=list) + """List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).""" + logs: Logs = field(default_factory=Logs) + """Logs printed to stdout and stderr during execution.""" + error: Optional[ExecutionError] = None + """Error object if an error occurred, None otherwise.""" + execution_count: Optional[int] = None + """Execution count of the cell.""" def __repr__(self): return f"Execution(Results: {self.results}, Logs: {self.logs}, Error: {self.error})" @@ -326,7 +306,7 @@ def parse_output( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, -) -> None: +): data = json.loads(output) data_type = data.pop("type") @@ -336,15 +316,15 @@ def parse_output( if on_result: on_result(result) elif data_type == "stdout": - execution.logs.stdout += data["text"] + execution.logs.stdout.append(data["text"]) if on_stdout: on_stdout(OutputMessage(data["text"], data["timestamp"], False)) elif data_type == "stderr": - execution.logs.stderr += data["text"] + execution.logs.stderr.append(data["text"]) if on_stderr: on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": - execution.error = Error(**data) + execution.error = ExecutionError(**data) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] diff --git a/template/server/main.py b/template/server/main.py index e34c198d..011db93b 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -25,11 +25,11 @@ global client - -# TODO: Increase timeout for requests to allow streaming, increase max request/response sizes to acommodate larger results, Increase keepalive timeout -# TODO: Handle pings from server so we can keep the connection from idling # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods +# TODO: Error handling in SDKs +# TODO: Why separated letters in python Execution? +# TODO: Check correct results format in Python after dataclasses @asynccontextmanager From 3916a2130cb1d25403cea95e0a3839c77476380d Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:13:28 -0700 Subject: [PATCH 145/722] Fix exports --- python/e2b_code_interpreter/__init__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index ce68fdcc..053166c1 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -2,4 +2,13 @@ from .code_interpreter_sync import CodeInterpreter from .code_interpreter_async import AsyncCodeInterpreter -from .models import Execution, ExecutionError, Result, KernelException, MIMEType, Logs +from .models import ( + Execution, + ExecutionError, + Result, + KernelException, + MIMEType, + Logs, + OutputHandler, + OutputMessage, +) From 8ee5e2c0f06a5a162fbe2a95153f57f1e6e7e920 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:14:01 -0700 Subject: [PATCH 146/722] Remove logs --- js/src/codeInterpreter.ts | 3 --- python/e2b_code_interpreter/code_interpreter_async.py | 2 -- 2 files changed, 5 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index f9c51ea5..70e67b11 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -10,12 +10,9 @@ async function* readLines(stream: ReadableStream) { while (true) { const { done, value } = await reader.read(); - console.log('check') - if (value !== undefined) { buffer += new TextDecoder().decode(value) } - console.log('inc message', buffer) if (done) { if (buffer.length > 0) { diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 490fe713..3bc1ef5d 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -64,8 +64,6 @@ async def exec_cell( execution = Execution() async for line in response.aiter_lines(): - print("line", line) - parse_output( execution, line, From 22cc8198d7f6d6471e103cf4d0ed9b9d06693de6 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:26:25 -0700 Subject: [PATCH 147/722] Fix traceback field --- js/src/messaging.ts | 9 +-------- python/e2b_code_interpreter/models.py | 12 ++---------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 608fc77c..5d2edc36 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -32,15 +32,8 @@ export class ExecutionError { /** * The raw traceback of the error. **/ - public tracebackRaw: string[], + public traceback: string, ) { } - - /** - * Returns the traceback of the error as a string. - */ - get traceback(): string { - return this.tracebackRaw.join('\n') - } } /** diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index a261ff9e..6a16c4ed 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -43,16 +43,7 @@ class ExecutionError: name: str value: str - traceback_raw: List[str] - - @property - def traceback(self) -> str: - """ - Returns the traceback as a single string. - - :return: The traceback as a single string. - """ - return "\n".join(self.traceback_raw) + traceback: str def to_json(self) -> str: """ @@ -324,6 +315,7 @@ def parse_output( if on_stderr: on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": + print("all data", data) execution.error = ExecutionError(**data) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] From 303f4d4b55c8cbbd8e1af14686df3668d17e2870 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 14:27:11 -0700 Subject: [PATCH 148/722] Update SDK --- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index e60a9c3c..936f2a4e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a26" +version = "0.17.2a30" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a26-py3-none-any.whl", hash = "sha256:0a628d9800db311a687c3d0b00f51b92e13c6b4e30b568cb61144f1f5ff79390"}, - {file = "e2b-0.17.2a26.tar.gz", hash = "sha256:b9b678d5b71742df64a27c174a6bda23cb6bf3386631a96def72132d48655b18"}, + {file = "e2b-0.17.2a30-py3-none-any.whl", hash = "sha256:8bfa59b4cdcf561ecf8147fedf391351db915b6b2cf4a5e78de2f88d5c1bb44e"}, + {file = "e2b-0.17.2a30.tar.gz", hash = "sha256:cfef2ceb17a4a484132de532a1cd0bf02ba350b3aa2f4e319a81fc79e5935e4b"}, ] [package.dependencies] @@ -481,4 +481,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "cf5d23a754efa39ec7bff0ad5903f98f252dd64eae2ece4f48ef2e0b0736aa58" +content-hash = "c336fe0cd4d58620c9ae74bfb0177195651834976aabfdf1f1e694cec7dafe9f" diff --git a/python/pyproject.toml b/python/pyproject.toml index 7f05e000..fc4dca5b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,7 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -e2b = "0.17.2a26" +e2b = "0.17.2a30" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" From 12dafc22722c4572db2f697fedebe640c09819dd Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 15:29:17 -0700 Subject: [PATCH 149/722] Pass fields to execution error explicitly --- python/e2b_code_interpreter/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 6a16c4ed..0f5ac858 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -315,8 +315,7 @@ def parse_output( if on_stderr: on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": - print("all data", data) - execution.error = ExecutionError(**data) + execution.error = ExecutionError(data["name"], data["value"], data["traceback"]) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] From 8a6c02bf5ef4e2e83dcc7879885732be7fd60e32 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 15:43:52 -0700 Subject: [PATCH 150/722] Improve CI error handling --- js/src/codeInterpreter.ts | 31 ++++++++++++++++++++----------- js/src/messaging.ts | 20 +++++++++++++++++++- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 70e67b11..4fcf793b 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,6 +1,6 @@ import { ConnectionConfig, Sandbox } from 'e2b' -import { Result, Execution, ExecutionError, OutputMessage, parseOutput } from './messaging' +import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' async function* readLines(stream: ReadableStream) { const reader = stream.getReader(); @@ -73,8 +73,13 @@ export class JupyterExtension { keepalive: true, }) - if (!res.ok || !res.body) { - throw new Error(`Failed to execute code: ${res.statusText} ${await res?.text()}`) + const error = await extractError(res) + if (error) { + throw error + } + + if (!res.body) { + throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`) } clearTimeout(reqTimer) @@ -122,8 +127,9 @@ export class JupyterExtension { signal: this.connectionConfig.getSignal(requestTimeoutMs), }) - if (!res.ok || !res.body) { - throw new Error(`Failed to create kernel: ${res.statusText} ${await res?.text()}`) + const error = await extractError(res) + if (error) { + throw error } const data = await res.json() @@ -147,8 +153,9 @@ export class JupyterExtension { signal: this.connectionConfig.getSignal(requestTimeoutMs), }) - if (!res.ok) { - throw new Error(`Failed to restart kernel: ${res.statusText} ${await res?.text()}`) + const error = await extractError(res) + if (error) { + throw error } } @@ -167,8 +174,9 @@ export class JupyterExtension { signal: this.connectionConfig.getSignal(requestTimeoutMs), }) - if (!res.ok) { - throw new Error(`Failed to shutdown kernel: ${res.statusText} ${await res?.text()}`) + const error = await extractError(res) + if (error) { + throw error } } @@ -182,8 +190,9 @@ export class JupyterExtension { signal: this.connectionConfig.getSignal(requestTimeoutMs), }) - if (!res.ok) { - throw new Error(`Failed to list kernels: ${res.statusText} ${await res?.text()}`) + const error = await extractError(res) + if (error) { + throw error } return (await res.json()).map((kernel: any) => ({ kernelID: kernel.id, name: kernel.name })) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 5d2edc36..a86c2ae7 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,3 +1,22 @@ +import { NotFoundError, SandboxError, TimeoutError } from 'e2b' + +export async function extractError(res: Response) { + if (res.ok) { + return + } + + switch (res.status) { + case 502: + return new TimeoutError( + `${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.` + ) + case 404: + return new NotFoundError(await res.text()) + default: + return new SandboxError(`${res.status} ${res.statusText}`) + } +} + export class OutputMessage { constructor( public readonly line: string, @@ -14,7 +33,6 @@ export class OutputMessage { } } - /** * Represents an error that occurred during the execution of a cell. * The error contains the name of the error, the value of the error, and the traceback. From 902f9be09bb2de23fed1a3a1526a3f4670179a5a Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 15:50:32 -0700 Subject: [PATCH 151/722] Improve python exception handling --- python/e2b_code_interpreter/__init__.py | 1 - .../code_interpreter_async.py | 26 +++++++++++++++---- .../code_interpreter_sync.py | 25 ++++++++++++++---- python/e2b_code_interpreter/models.py | 19 ++++++++++---- template/server/main.py | 2 -- 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index 053166c1..9c8e47c2 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -6,7 +6,6 @@ Execution, ExecutionError, Result, - KernelException, MIMEType, Logs, OutputHandler, diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 3bc1ef5d..3352e5ba 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -10,6 +10,7 @@ Execution, Kernel, Result, + extract_exception, parse_output, OutputHandler, OutputMessage, @@ -59,7 +60,10 @@ async def exec_cell( }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err execution = Execution() @@ -90,7 +94,10 @@ async def create_kernel( }, timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err data = response.json() return data["id"] @@ -107,7 +114,10 @@ async def shutdown_kernel( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err async def restart_kernel( self, @@ -121,7 +131,10 @@ async def restart_kernel( f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err async def list_kernels( self, @@ -140,7 +153,10 @@ async def list_kernels( f"{self._url}/contexts", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err return [Kernel(k["id"], k["name"]) for k in response.json()] diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 1ef4c898..8b1eec46 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -9,6 +9,7 @@ Execution, Kernel, Result, + extract_exception, parse_output, OutputHandler, OutputMessage, @@ -59,7 +60,9 @@ def exec_cell( }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: - response.raise_for_status() + err = extract_exception(response) + if err: + raise err execution = Execution() @@ -90,7 +93,10 @@ def create_kernel( }, timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err data = response.json() return data["id"] @@ -107,7 +113,10 @@ def shutdown_kernel( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err def restart_kernel( self, @@ -121,7 +130,10 @@ def restart_kernel( f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err def list_kernels( self, @@ -140,7 +152,10 @@ def list_kernels( f"{self._url}/contexts", timeout=request_timeout or self._connection_config.request_timeout, ) - response.raise_for_status() + + err = extract_exception(response) + if err: + raise err return [Kernel(k["id"], k["name"]) for k in response.json()] diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 0f5ac858..0ed6e325 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,5 +1,6 @@ import json +from e2b import NotFoundException, TimeoutException, SandboxException from dataclasses import dataclass, field from typing import ( List, @@ -13,6 +14,8 @@ Union, ) +from httpx import Response + T = TypeVar("T") OutputHandler = Union[ @@ -283,12 +286,18 @@ def to_json(self) -> str: return json.dumps(data) -class KernelException(Exception): - """ - Exception raised when a kernel operation fails. - """ +def extract_exception(res: Response) -> NotFoundException | TimeoutException | SandboxException | None: + if res.is_success: + return None - pass + if res.status_code == 404: + return NotFoundException(res.text) + elif res.status_code == 502: + return TimeoutException( + f"{res.text}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeout' when starting the sandbox or calling '.set_timeout' on the sandbox with the desired timeout." + ) + else: + return SandboxException(f"{res.status_code}: {res.text}") def parse_output( diff --git a/template/server/main.py b/template/server/main.py index 011db93b..7116cc4e 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -28,8 +28,6 @@ # TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? # TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods # TODO: Error handling in SDKs -# TODO: Why separated letters in python Execution? -# TODO: Check correct results format in Python after dataclasses @asynccontextmanager From a34fff2279ae8c47ad88240a2f13f811cde6fcf5 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 15:52:49 -0700 Subject: [PATCH 152/722] Remove output type --- python/e2b_code_interpreter/models.py | 2 +- template/server/main.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 0ed6e325..da7d7e48 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -286,7 +286,7 @@ def to_json(self) -> str: return json.dumps(data) -def extract_exception(res: Response) -> NotFoundException | TimeoutException | SandboxException | None: +def extract_exception(res: Response): if res.is_success: return None diff --git a/template/server/main.py b/template/server/main.py index 7116cc4e..f51ad132 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -25,9 +25,6 @@ global client -# TODO: Check https://www.uvicorn.org/deployment/#running-behind-nginx | Why do we need to run behind nginx? -# TODO: Think about what to return from this API so later we can change only the SDK (not the API) when we change methods -# TODO: Error handling in SDKs @asynccontextmanager From 19ea5cf628ae1f41ed2bef5b20bc36f993292226 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 11 Jul 2024 22:48:49 -0700 Subject: [PATCH 153/722] [WIP] Cleanup API --- js/src/codeInterpreter.ts | 9 ++- .../code_interpreter_async.py | 16 ++-- .../code_interpreter_sync.py | 16 ++-- python/e2b_code_interpreter/constants.py | 1 + template/server/api/models/context.py | 1 + template/server/api/models/create_context.py | 13 ++++ template/server/api/models/create_kernel.py | 23 ------ .../server/api/models/execution_request.py | 7 +- template/server/api/models/output.py | 5 -- template/server/api/models/result.py | 6 +- template/server/main.py | 76 ++++++++++++------- template/server/messaging.py | 12 ++- 12 files changed, 100 insertions(+), 85 deletions(-) create mode 100644 template/server/api/models/create_context.py delete mode 100644 template/server/api/models/create_kernel.py diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 4fcf793b..aa0dc42e 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -38,6 +38,7 @@ async function* readLines(stream: ReadableStream) { export class JupyterExtension { private static readonly execTimeoutMs = 300_000 + private static readonly defaultKernelID = 'default' constructor(private readonly url: string, private readonly connectionConfig: ConnectionConfig) { } @@ -120,8 +121,8 @@ export class JupyterExtension { 'Content-Type': 'application/json', }, body: JSON.stringify({ - kernel_name: kernelName, - cwd: cwd || '/home/user' + name: kernelName, + cwd, }), keepalive: true, signal: this.connectionConfig.getSignal(requestTimeoutMs), @@ -143,7 +144,7 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - kernelID = kernelID || 'default' + kernelID = kernelID || JupyterExtension.defaultKernelID const res = await fetch(`${this.url}/contexts/${kernelID}/restart`, { method: 'POST', headers: { @@ -166,7 +167,7 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - kernelID = kernelID || 'default' + kernelID = kernelID || JupyterExtension.defaultKernelID const res = await fetch(`${this.url}/contexts/${kernelID}`, { method: 'DELETE', diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 3352e5ba..bbd510f9 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -5,7 +5,11 @@ from e2b import AsyncSandbox, ConnectionConfig -from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT +from e2b_code_interpreter.constants import ( + DEFAULT_KERNEL_ID, + DEFAULT_TEMPLATE, + JUPYTER_PORT, +) from e2b_code_interpreter.models import ( Execution, Kernel, @@ -56,7 +60,7 @@ async def exec_cell( f"{self._url}/execute", json={ "code": code, - "kernel_id": kernel_id, + "context_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -80,7 +84,7 @@ async def exec_cell( async def create_kernel( self, - cwd: Optional[str] = "/home/user", + cwd: Optional[str] = None, kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, ) -> str: @@ -89,7 +93,7 @@ async def create_kernel( response = await self._client.post( f"{self._url}/contexts", json={ - "language": kernel_name, + "name": kernel_name, "cwd": cwd, }, timeout=request_timeout or self._connection_config.request_timeout, @@ -109,7 +113,7 @@ async def shutdown_kernel( ) -> None: logger.debug(f"Shutting down a kernel with id {kernel_id}") - kernel_id = kernel_id or "default" + kernel_id = kernel_id or DEFAULT_KERNEL_ID response = await self._client.delete( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, @@ -126,7 +130,7 @@ async def restart_kernel( ) -> None: logger.debug(f"Restarting kernel: {kernel_id}") - kernel_id = kernel_id or "default" + kernel_id = kernel_id or DEFAULT_KERNEL_ID response = await self._client.post( f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 8b1eec46..773ca250 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -4,7 +4,11 @@ from httpx import HTTPTransport, Client from e2b import Sandbox, ConnectionConfig -from e2b_code_interpreter.constants import DEFAULT_TEMPLATE, JUPYTER_PORT +from e2b_code_interpreter.constants import ( + DEFAULT_KERNEL_ID, + DEFAULT_TEMPLATE, + JUPYTER_PORT, +) from e2b_code_interpreter.models import ( Execution, Kernel, @@ -56,7 +60,7 @@ def exec_cell( f"{self._url}/execute", json={ "code": code, - "kernel_id": kernel_id, + "context_id": kernel_id, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -79,7 +83,7 @@ def exec_cell( def create_kernel( self, - cwd: Optional[str] = "/home/user", + cwd: Optional[str] = None, kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, ) -> str: @@ -88,7 +92,7 @@ def create_kernel( response = self._client.post( f"{self._url}/contexts", json={ - "language": kernel_name, + "name": kernel_name, "cwd": cwd, }, timeout=request_timeout or self._connection_config.request_timeout, @@ -108,7 +112,7 @@ def shutdown_kernel( ) -> None: logger.debug(f"Shutting down a kernel with id {kernel_id}") - kernel_id = kernel_id or "default" + kernel_id = kernel_id or DEFAULT_KERNEL_ID response = self._client.delete( url=f"{self._url}/contexts/{kernel_id}", timeout=request_timeout or self._connection_config.request_timeout, @@ -125,7 +129,7 @@ def restart_kernel( ) -> None: logger.debug(f"Creating new kernel for language: {kernel_id}") - kernel_id = kernel_id or "default" + kernel_id = kernel_id or DEFAULT_KERNEL_ID response = self._client.post( f"{self._url}/contexts/{kernel_id}/restart", timeout=request_timeout or self._connection_config.request_timeout, diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index 8a783dcd..e4ca0ccc 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,2 +1,3 @@ DEFAULT_TEMPLATE = "ci-no-ws" JUPYTER_PORT = 49999 +DEFAULT_KERNEL_ID = "default" diff --git a/template/server/api/models/context.py b/template/server/api/models/context.py index fdef94d1..49ab1fc6 100644 --- a/template/server/api/models/context.py +++ b/template/server/api/models/context.py @@ -5,3 +5,4 @@ class Context(BaseModel): id: StrictStr = Field(description="Context ID") name: StrictStr = Field(description="Context name") + cwd: StrictStr = Field(description="Current working directory of the context") diff --git a/template/server/api/models/create_context.py b/template/server/api/models/create_context.py new file mode 100644 index 00000000..c24c7fab --- /dev/null +++ b/template/server/api/models/create_context.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel, StrictStr +from pydantic import Field +from typing import Optional + + +class CreateContext(BaseModel): + cwd: Optional[StrictStr] = Field( + default="/home/user", + description="Current working directory", + ) + name: Optional[StrictStr] = Field( + default="python", description="Name of the kernel" + ) diff --git a/template/server/api/models/create_kernel.py b/template/server/api/models/create_kernel.py deleted file mode 100644 index 57b3e633..00000000 --- a/template/server/api/models/create_kernel.py +++ /dev/null @@ -1,23 +0,0 @@ -from typing import Any, Dict, Optional -from pydantic import BaseModel, StrictStr -from pydantic import Field - - -class CreateContext(BaseModel): - cwd: Optional[StrictStr] = Field( - default=None, description="Current working directory" - ) - language: Optional[StrictStr] = Field( - default=None, description="Language of the code to be executed" - ) - kernel_name: Optional[StrictStr] = Field( - default=None, description="Name of the kernel" - ) - - -class RestartContext(BaseModel): - kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") - - -class ShutdownKernel(BaseModel): - kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index 46668451..a0243329 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -1,11 +1,8 @@ -from typing import Any, Dict, Optional +from typing import Optional from pydantic import BaseModel, StrictStr from pydantic import Field class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") - language: Optional[StrictStr] = Field( - default=None, description="Language of the code to be executed" - ) - kernel_id: Optional[StrictStr] = Field(default=None, description="Kernel ID") + context_id: Optional[StrictStr] = Field(default="default", description="Context ID") diff --git a/template/server/api/models/output.py b/template/server/api/models/output.py index 1a976aa8..8d7620fd 100644 --- a/template/server/api/models/output.py +++ b/template/server/api/models/output.py @@ -3,11 +3,6 @@ from enum import Enum from pydantic import BaseModel -try: - from typing import Self -except ImportError: - from typing_extensions import Self - class OutputType(Enum): """ diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 5465d3cf..836bc30b 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -6,11 +6,6 @@ from api.models.output import OutputType -try: - from typing import Self -except ImportError: - from typing_extensions import Self - class Result(BaseModel): """ @@ -23,6 +18,7 @@ class Result(BaseModel): The class also provides methods to display the data in a Jupyter notebook. """ + type: OutputType = OutputType.RESULT text: Optional[str] = None diff --git a/template/server/main.py b/template/server/main.py index f51ad132..04945927 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -9,7 +9,7 @@ from fastapi import FastAPI, HTTPException from api.models.context import Context -from api.models.create_kernel import CreateContext +from api.models.create_context import CreateContext from api.models.execution_request import ExecutionRequest from messaging import JupyterKernelWebSocket from stream import StreamingListJsonResponse @@ -20,10 +20,11 @@ http_logger = logging.getLogger("httpcore.http11") http_logger.setLevel(logging.WARNING) -websockets: Dict[Union[str, StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} -global default_kernel_id +jupyter_base_url = "http://localhost:8888" +websockets: Dict[Union[str, StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} +global default_kernel_id global client @@ -32,19 +33,21 @@ async def lifespan(app: FastAPI): global client client = httpx.AsyncClient() - # Load the default kernel - session_id = str(uuid.uuid4()) - global default_kernel_id with open("/root/.jupyter/kernel_id") as file: default_kernel_id = file.read().strip() - default_ws = JupyterKernelWebSocket(default_kernel_id, session_id, "python") + default_ws = JupyterKernelWebSocket( + default_kernel_id, + str(uuid.uuid4()), + "python", + "/home/user", + ) websockets["default"] = default_ws logger.info("Connecting to default runtime") - _ = asyncio.create_task(default_ws.connect()) + asyncio.create_task(default_ws.connect()) await default_ws.started logger.info("Connected to default runtime") @@ -63,15 +66,21 @@ async def lifespan(app: FastAPI): @app.get("/health") async def health(): - return "Request was successful" + return "OK" @app.post("/execute") async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") - if request.kernel_id: - ws = websockets.get(request.kernel_id, websockets["default"]) + if request.context_id: + ws = websockets.get(request.context_id) + + if not ws: + raise HTTPException( + status_code=404, + detail=f"Kernel {request.context_id} not found", + ) else: ws = websockets["default"] @@ -80,20 +89,17 @@ async def execute(request: ExecutionRequest): @app.post("/contexts") async def create_context(request: CreateContext) -> Context: - logger.info(f"Creating new kernel for language: {request.language}") - - kernel_name = request.language or "python3" - cwd = request.cwd or "/home/user" + logger.info(f"Creating new kernel") data = { "path": str(uuid.uuid4()), - "kernel": {"name": kernel_name}, + "kernel": {"name": request.name}, "type": "notebook", "name": str(uuid.uuid4()), } - logger.debug(f"Creating kernel with data: {data}") + logger.debug(f"Creating new kernel with data: {data}") - response = await client.post("http://localhost:8888/api/sessions", json=data) + response = await client.post(f"{jupyter_base_url}/api/sessions", json=data) if not response.is_success: raise HTTPException( @@ -106,7 +112,8 @@ async def create_context(request: CreateContext) -> Context: kernel_id = session_data["kernel"]["id"] response = await client.patch( - f"http://localhost:8888/api/sessions/{session_id}", json={"path": cwd} + f"{jupyter_base_url}/api/sessions/{session_id}", + json={"path": request.cwd}, ) if not response.is_success: raise HTTPException( @@ -116,18 +123,23 @@ async def create_context(request: CreateContext) -> Context: logger.debug(f"Created kernel {kernel_id}") - ws = JupyterKernelWebSocket(kernel_id, session_id, kernel_name) - task = asyncio.create_task(ws.connect()) + ws = JupyterKernelWebSocket( + kernel_id, + session_id, + request.name, + request.cwd, + ) + asyncio.create_task(ws.connect()) await ws.started websockets[kernel_id] = ws - return Context(name=kernel_name, id=kernel_id) + return Context(name=request.name, id=kernel_id, cwd=request.cwd) @app.get("/contexts") async def list_contexts() -> List[Context]: - logger.info(f"Listing contexts") + logger.info(f"Listing kernels") kernel_ids = list(websockets.keys()) @@ -135,6 +147,7 @@ async def list_contexts() -> List[Context]: Context( id=websockets[kernel_id].kernel_id, name=websockets[kernel_id].name, + cwd=websockets[kernel_id].cwd, ) for kernel_id in kernel_ids ] @@ -142,7 +155,7 @@ async def list_contexts() -> List[Context]: @app.post("/contexts/{context_id}/restart") async def restart_context(context_id: str) -> None: - logger.info(f"Restarting context {context_id}") + logger.info(f"Restarting kernel {context_id}") ws = websockets.get(context_id, None) if not ws: @@ -156,15 +169,20 @@ async def restart_context(context_id: str) -> None: await ws.close() response = await client.post( - f"http://localhost:8888/api/kernels/{ws.kernel_id}/restart" + f"{jupyter_base_url}/api/kernels/{ws.kernel_id}/restart" ) if not response.is_success: raise HTTPException( status_code=500, - detail=f"Failed to restart context {context_id}", + detail=f"Failed to restart kernel {context_id}", ) - ws = JupyterKernelWebSocket(ws.kernel_id, session_id, ws.name) + ws = JupyterKernelWebSocket( + ws.kernel_id, + session_id, + ws.name, + ws.cwd, + ) _ = asyncio.create_task(ws.connect()) await ws.started @@ -174,7 +192,7 @@ async def restart_context(context_id: str) -> None: @app.delete("/contexts/{context_id}") async def remove_context(context_id: str) -> None: - logger.info(f"Removing context {context_id}") + logger.info(f"Removing kernel {context_id}") ws = websockets.get(context_id, None) if not ws: @@ -188,7 +206,7 @@ async def remove_context(context_id: str) -> None: except: pass - response = await client.delete(f"http://localhost:8888/api/kernels/{ws.kernel_id}") + response = await client.delete(f"{jupyter_base_url}/api/kernels/{ws.kernel_id}") if not response.is_success: raise HTTPException( status_code=500, diff --git a/template/server/messaging.py b/template/server/messaging.py index 89a8860e..1267a1b6 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -21,6 +21,7 @@ from api.models.logs import Stdout, Stderr from api.models.result import Result from api.models.output import EndOfExecution, NumberOfExecutions, OutputType + from websockets.legacy.client import WebSocketClientProtocol, Connect from websockets.exceptions import ConnectionClosed @@ -40,9 +41,16 @@ def __init__(self): class JupyterKernelWebSocket: _ws: Optional[WebSocketClientProtocol] = None - def __init__(self, kernel_id: str, session_id: str, name: str): - self.kernel_id = kernel_id + def __init__( + self, + kernel_id: str, + session_id: str, + name: str, + cwd: str, + ): self.name = name + self.cwd = cwd + self.kernel_id = kernel_id self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" self.session_id = session_id self._executions: Dict[str, Execution] = {} From 6819d7aaed4bb35871bbe1c5a310519bca70ca90 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 12 Jul 2024 15:46:25 +0200 Subject: [PATCH 154/722] Fix create kernel when name or cwd not specified --- js/src/codeInterpreter.ts | 2 +- .../e2b_code_interpreter/code_interpreter_async.py | 11 +++++++---- .../e2b_code_interpreter/code_interpreter_sync.py | 13 ++++++++----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index aa0dc42e..4c48a842 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -69,7 +69,7 @@ export class JupyterExtension { }, body: JSON.stringify({ code, - kernel_id: opts?.kernelID, + context_id: opts?.kernelID, }), keepalive: true, }) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index bbd510f9..4a499e7e 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -90,12 +90,15 @@ async def create_kernel( ) -> str: logger.debug(f"Creating new kernel: {kernel_name}") + data = {} + if kernel_name: + data['name'] = kernel_name + if cwd: + data['cwd'] = cwd + response = await self._client.post( f"{self._url}/contexts", - json={ - "name": kernel_name, - "cwd": cwd, - }, + json=data, timeout=request_timeout or self._connection_config.request_timeout, ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 773ca250..93e76f54 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -89,12 +89,15 @@ def create_kernel( ) -> str: logger.debug(f"Creating new kernel: {kernel_name}") + data = {} + if kernel_name: + data['name'] = kernel_name + if cwd: + data['cwd'] = cwd + response = self._client.post( f"{self._url}/contexts", - json={ - "name": kernel_name, - "cwd": cwd, - }, + json=data, timeout=request_timeout or self._connection_config.request_timeout, ) @@ -161,7 +164,7 @@ def list_kernels( if err: raise err - return [Kernel(k["id"], k["name"]) for k in response.json()] + return [Kernel(kernel_id=k["id"], name=k["name"]) for k in response.json()] class CodeInterpreter(Sandbox): From 781297d5257787c9d2fb71efe707f449250d54cc Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 11:49:12 -0700 Subject: [PATCH 155/722] Explicitly process response body on errors to prevent access error --- .../code_interpreter_async.py | 16 ++++++++-------- python/e2b_code_interpreter/models.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 4a499e7e..b46f34c5 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -14,7 +14,7 @@ Execution, Kernel, Result, - extract_exception, + aextract_exception, parse_output, OutputHandler, OutputMessage, @@ -65,7 +65,7 @@ async def exec_cell( timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: - err = extract_exception(response) + err = await aextract_exception(response) if err: raise err @@ -92,9 +92,9 @@ async def create_kernel( data = {} if kernel_name: - data['name'] = kernel_name + data["name"] = kernel_name if cwd: - data['cwd'] = cwd + data["cwd"] = cwd response = await self._client.post( f"{self._url}/contexts", @@ -102,7 +102,7 @@ async def create_kernel( timeout=request_timeout or self._connection_config.request_timeout, ) - err = extract_exception(response) + err = await aextract_exception(response) if err: raise err @@ -122,7 +122,7 @@ async def shutdown_kernel( timeout=request_timeout or self._connection_config.request_timeout, ) - err = extract_exception(response) + err = await aextract_exception(response) if err: raise err @@ -139,7 +139,7 @@ async def restart_kernel( timeout=request_timeout or self._connection_config.request_timeout, ) - err = extract_exception(response) + err = await aextract_exception(response) if err: raise err @@ -161,7 +161,7 @@ async def list_kernels( timeout=request_timeout or self._connection_config.request_timeout, ) - err = extract_exception(response) + err = await aextract_exception(response) if err: raise err diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index da7d7e48..4b0ecb05 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -286,10 +286,26 @@ def to_json(self) -> str: return json.dumps(data) +async def aextract_exception(res: Response): + if res.is_success: + return None + + await res.aread() + return extract_exception(res) + + def extract_exception(res: Response): if res.is_success: return None + res.read() + return format_exception(res) + + +def format_exception(res: Response): + if res.is_success: + return None + if res.status_code == 404: return NotFoundException(res.text) elif res.status_code == 502: From 691960818a954bf7dfeaa46ed7ff554936c7bc91 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 14:13:34 -0700 Subject: [PATCH 156/722] Update core SDK --- js/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 5a9afd80..4f223501 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.17" + "e2b": "0.16.2-beta.23" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c80d52c4..75edbe4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.17 - version: 0.16.2-beta.17 + specifier: 0.16.2-beta.23 + version: 0.16.2-beta.23 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1932,8 +1932,8 @@ packages: engines: {node: '>=12'} dev: true - /e2b@0.16.2-beta.17: - resolution: {integrity: sha512-8CiHIC4OBPDXnIqTezpEIOpUX56rryx0MDyQSto0MpL3ywBI3Lva4UH6GcSWIB5sCg6bNaNAuvNfOOfz+TjP3g==} + /e2b@0.16.2-beta.23: + resolution: {integrity: sha512-xpT2CiymnWaJWC0HmTYdcTaXYgXwMqY2NW3ikl4Ham2t9wT3+2Xyz0EdJceBaZpPjNMm7+BcPBvj6tp8HGLptA==} engines: {node: '>=18'} dependencies: '@bufbuild/protobuf': 1.10.0 diff --git a/python/poetry.lock b/python/poetry.lock index 936f2a4e..d1384fdf 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a30" +version = "0.17.2a31" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a30-py3-none-any.whl", hash = "sha256:8bfa59b4cdcf561ecf8147fedf391351db915b6b2cf4a5e78de2f88d5c1bb44e"}, - {file = "e2b-0.17.2a30.tar.gz", hash = "sha256:cfef2ceb17a4a484132de532a1cd0bf02ba350b3aa2f4e319a81fc79e5935e4b"}, + {file = "e2b-0.17.2a31-py3-none-any.whl", hash = "sha256:e57d05d88ed60c1bf28d33f4bc177305d7a9c59e4cc15f4383b0f43fdf59d4d8"}, + {file = "e2b-0.17.2a31.tar.gz", hash = "sha256:f821abf6025a172f4915d6d29370693e7714cfa7c0a038507f3c411d3056f50a"}, ] [package.dependencies] @@ -481,4 +481,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "c336fe0cd4d58620c9ae74bfb0177195651834976aabfdf1f1e694cec7dafe9f" +content-hash = "74f066071198a25b98e29462b0b97d209e3e5a7c50ff93581125051d261d2fe5" diff --git a/python/pyproject.toml b/python/pyproject.toml index fc4dca5b..41f9b121 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,7 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -e2b = "0.17.2a30" +e2b = "0.17.2a31" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" From efc205840dc126e7996a4679badfd6adba9f1796 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 14:47:52 -0700 Subject: [PATCH 157/722] Update template --- template/e2b.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/template/e2b.toml b/template/e2b.toml index 3109f8ce..03d45b92 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,16 +1,16 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (6rn8gnglohgpuk1wsack) or 'template_name (ci-no-ws) from this config to spawn a sandbox: +# You can use 'template_id' (1tsfj5yvigmgc5gmgqz2) or 'template_name (code-interpreter-stateful) from this config to spawn a sandbox: # Python SDK # from e2b import Sandbox -# sandbox = Sandbox(template='ci-no-ws') +# sandbox = Sandbox(template='code-interpreter-stateful') # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'ci-no-ws' }) +# const sandbox = await Sandbox.create({ template: 'code-interpreter-stateful' }) memory_mb = 1_024 start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" -template_name = "ci-no-ws" -template_id = "6rn8gnglohgpuk1wsack" +template_name = "code-interpreter-stateful" +template_id = "1tsfj5yvigmgc5gmgqz2" From 907de489ccc87a938e754de73ff2a7436ffe9a46 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 12 Jul 2024 21:53:57 +0000 Subject: [PATCH 158/722] [skip ci] Release new versions --- js/package.json | 4 ++-- python/pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/package.json b/js/package.json index 502e1260..80e303df 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.4", + "version": "0.0.9-beta.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -69,4 +69,4 @@ "browserslist": [ "defaults" ] -} \ No newline at end of file +} diff --git a/python/pyproject.toml b/python/pyproject.toml index 2c710917..33e5d091 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a4" +version = "0.0.11a5" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 4071bfa0e15005365cf243e6e1565f96e0c1be0b Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 17:14:16 -0700 Subject: [PATCH 159/722] Update core --- python/poetry.lock | 9 +++++---- python/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index d1384fdf..929a79ba 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,19 +125,20 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a31" +version = "0.17.2a32" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a31-py3-none-any.whl", hash = "sha256:e57d05d88ed60c1bf28d33f4bc177305d7a9c59e4cc15f4383b0f43fdf59d4d8"}, - {file = "e2b-0.17.2a31.tar.gz", hash = "sha256:f821abf6025a172f4915d6d29370693e7714cfa7c0a038507f3c411d3056f50a"}, + {file = "e2b-0.17.2a32-py3-none-any.whl", hash = "sha256:4618bb4348063c595277f7eef2d0dc532c96ae9bbbbf424ea97d3af697eddc7e"}, + {file = "e2b-0.17.2a32.tar.gz", hash = "sha256:e205a95de05870c3dc57be55d8ba810f001a905a0e829ad51f097da249569021"}, ] [package.dependencies] attrs = ">=23.2.0,<24.0.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<0.28.0" +packaging = ">=24.1,<25.0" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" @@ -481,4 +482,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "74f066071198a25b98e29462b0b97d209e3e5a7c50ff93581125051d261d2fe5" +content-hash = "ef4bdd0d507a42c1999292f31110ca2a6141b9617a38bfe594bbc104ba558e6e" diff --git a/python/pyproject.toml b/python/pyproject.toml index 33e5d091..89737e18 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,9 +12,9 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -e2b = "0.17.2a31" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" +e2b = "0.17.2a32" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 1f791b701481ad19b9546058a987eaffd239e645 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 19:22:23 -0700 Subject: [PATCH 160/722] Fix default template --- js/src/codeInterpreter.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 4c48a842..0af9905b 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -201,7 +201,7 @@ export class JupyterExtension { } export class CodeInterpreter extends Sandbox { - protected static override readonly defaultTemplate: string = 'ci-no-ws' + protected static override readonly defaultTemplate: string = 'code-interpreter-stateful' protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index e4ca0ccc..f0fb9124 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ -DEFAULT_TEMPLATE = "ci-no-ws" +DEFAULT_TEMPLATE = "code-interpreter-stateful" JUPYTER_PORT = 49999 DEFAULT_KERNEL_ID = "default" From 6c491a4e861f224ad0ff1f99edc3ca93492be254 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Jul 2024 02:23:07 +0000 Subject: [PATCH 161/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 80e303df..fec21593 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.5", + "version": "0.0.9-beta.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 89737e18..71a5af20 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a5" +version = "0.0.11a6" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From d9856a8b60454db93e4c476a3e1ed8c3b63058ad Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 12 Jul 2024 19:25:46 -0700 Subject: [PATCH 162/722] Trigger release --- js/src/index.ts | 4 ++-- python/e2b_code_interpreter/__init__.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/index.ts b/js/src/index.ts index 9b212b51..05fd35b9 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,9 +1,9 @@ +export * from 'e2b' + export { CodeInterpreter, JupyterExtension } from './codeInterpreter' export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData, OutputMessage } from './messaging' import { CodeInterpreter } from './codeInterpreter' -export * from 'e2b' - export default CodeInterpreter diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index 9c8e47c2..c7ab0875 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -1,5 +1,4 @@ from e2b import * - from .code_interpreter_sync import CodeInterpreter from .code_interpreter_async import AsyncCodeInterpreter from .models import ( From d71c0760cb8f0cb05dcfd6e39ff97de8bd8a1029 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Jul 2024 02:26:49 +0000 Subject: [PATCH 163/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index fec21593..5ee8c813 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.6", + "version": "0.0.9-beta.7", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 71a5af20..b046585c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a6" +version = "0.0.11a7" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 8077d199061fdf9c3799e678ad424620b0811d3f Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 13 Jul 2024 12:58:58 -0700 Subject: [PATCH 164/722] Trigger docker template rebuild on beta branch for now --- .github/workflows/template.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 1efbc57f..9efdc812 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -7,6 +7,7 @@ on: - '.github/workflows/template.yml' branches: - main + - beta permissions: contents: read From 3469ab72caaf9de763c296a80e972c18312519b1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Jul 2024 19:59:51 +0000 Subject: [PATCH 165/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 5ee8c813..9db9c921 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.7", + "version": "0.0.9-beta.8", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index b046585c..47c5cf1e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a7" +version = "0.0.11a8" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From cd79ca3f026288b774f15d90b9f9771752f3ab18 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 13 Jul 2024 13:00:04 -0700 Subject: [PATCH 166/722] Trigger docker template rebuild on beta branch for now --- .github/workflows/template.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 9efdc812..1bbadba2 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -6,7 +6,6 @@ on: - 'template/**' - '.github/workflows/template.yml' branches: - - main - beta permissions: From 1f3c662f58c91699117248366e76b216adc630d3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Jul 2024 20:00:49 +0000 Subject: [PATCH 167/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 9db9c921..be251487 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.8", + "version": "0.0.9-beta.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 47c5cf1e..11b13e52 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a8" +version = "0.0.11a9" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From b1162a0444af4b1e6908bee54aac64d255eb354e Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 13 Jul 2024 20:40:23 -0700 Subject: [PATCH 168/722] Update core SDK --- js/package.json | 2 +- pnpm-lock.yaml | 6501 ++++++++++++++++++++++++++--------------------- 2 files changed, 3572 insertions(+), 2931 deletions(-) diff --git a/js/package.json b/js/package.json index be251487..2b34b97a 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.23" + "e2b": "0.16.2-beta.25" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75edbe4f..d74638d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.23 - version: 0.16.2-beta.23 + specifier: 0.16.2-beta.25 + version: 0.16.2-beta.25 devDependencies: '@types/node': specifier: ^18.18.6 @@ -41,7 +41,7 @@ importers: version: 16.14.20 tsup: specifier: ^8.1.0 - version: 8.1.0(typescript@5.5.3) + version: 8.1.0(postcss@8.4.38)(typescript@5.5.3) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -53,50 +53,2884 @@ importers: packages: - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + + '@bufbuild/protobuf@1.10.0': + resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + + '@changesets/apply-release-plan@7.0.0': + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + + '@changesets/assemble-release-plan@6.0.0': + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.1': + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + + '@changesets/config@3.0.0': + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + + '@changesets/errors@0.1.4': + resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.0.0': + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + + '@changesets/get-release-plan@4.0.0': + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@2.0.0': + resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} + + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + + '@changesets/logger@0.0.5': + resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + + '@changesets/parse@0.3.16': + resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + + '@changesets/read@0.5.9': + resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@5.2.1': + resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.0': + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@connectrpc/connect-web@1.4.0': + resolution: {integrity: sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + '@connectrpc/connect': 1.4.0 + + '@connectrpc/connect@1.4.0': + resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/fs@3.1.0': + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@4.1.0': + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.0.2': + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/run-script@6.0.2': + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.2.2': + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + + '@rollup/rollup-android-arm-eabi@4.13.0': + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.13.0': + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.13.0': + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.13.0': + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.13.0': + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.13.0': + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.13.0': + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.13.0': + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.13.0': + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.13.0': + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.13.0': + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.13.0': + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + + '@sigstore/bundle@1.1.0': + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.2.1': + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/sign@1.0.0': + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/tuf@1.0.3': + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@snyk/github-codeowners@1.1.0': + resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} + engines: {node: '>=8.10'} + hasBin: true + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tufjs/canonical-json@1.0.0': + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@tufjs/models@1.0.4': + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@18.18.6': + resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} + + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/semver-utils@1.1.3': + resolution: {integrity: sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@vitest/expect@2.0.1': + resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} + + '@vitest/runner@2.0.1': + resolution: {integrity: sha512-XfcSXOGGxgR2dQ466ZYqf0ZtDLLDx9mZeQcKjQDLQ9y6Cmk2Wl7wxMuhiYK4Fo1VxCtLcFEGW2XpcfMuiD1Maw==} + + '@vitest/snapshot@2.0.1': + resolution: {integrity: sha512-rst79a4Q+J5vrvHRapdfK4BdqpMH0eF58jVY1vYeBo/1be+nkyenGI5SCSohmjf6MkCkI20/yo5oG+0R8qrAnA==} + + '@vitest/spy@2.0.1': + resolution: {integrity: sha512-NLkdxbSefAtJN56GtCNcB4GiHFb5i9q1uh4V229lrlTZt2fnwsTyjLuWIli1xwK2fQspJJmHXHyWx0Of3KTXWA==} + + '@vitest/utils@2.0.1': + resolution: {integrity: sha512-STH+2fHZxlveh1mpU4tKzNgRk7RZJyr6kFGJYCI5vocdfqfPsQrgVC6k7dBWHfin5QNB4TLvRS0Ckly3Dt1uWw==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + bundle-require@4.0.2: + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + changeset@0.2.6: + resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-table3@0.6.4: + resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} + engines: {node: 10.* || >= 12.*} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compare-versions@6.1.0: + resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + + csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + + csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + + csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + e2b@0.16.2-beta.25: + resolution: {integrity: sha512-v0MmVDOo5Ti6itKY9ggLfTdyrzOY+ApO/lr28j3H6Z8hX4QsYkABDH3Hd2Xpgjr08MUd6T3yWdOfjl+pRZzLug==} + engines: {node: '>=18'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-memoize@2.5.2: + resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + fp-and-or@0.1.4: + resolution: {integrity: sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==} + engines: {node: '>=10'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@5.2.1: + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore-walk@6.0.4: + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + ini@4.1.2: + resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-parse-helpfulerror@1.0.3: + resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonlines@0.1.1: + resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + knip@5.25.1: + resolution: {integrity: sha512-vUopqkh/gOovZ05qYgTghZpmkM3b2eKYdLTsu11ZTYnYEcsdfQeZs6l4U7Rap4b+1KEDd/yydJsuWl+4NyEA9g==} + engines: {node: '>=18.6.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4' + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-check-updates@16.14.20: + resolution: {integrity: sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==} + engines: {node: '>=14.14'} + hasBin: true + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + openapi-fetch@0.9.8: + resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + + openapi-typescript-helpers@0.0.8: + resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + parse-github-url@1.0.2: + resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} + engines: {node: '>=0.10.0'} + hasBin: true + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + preferred-pm@3.1.3: + resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} + engines: {node: '>=10'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@9.0.0: + resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + engines: {node: '>=18'} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prompts-ncu@3.0.0: + resolution: {integrity: sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==} + engines: {node: '>= 14'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rc-config-loader@4.1.3: + resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + remote-git-tags@3.0.0: + resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} + engines: {node: '>=8'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver-utils@1.1.4: + resolution: {integrity: sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + + smol-toml@1.2.2: + resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} + engines: {node: '>= 18'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.8.1: + resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spawn-please@2.0.2: + resolution: {integrity: sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==} + engines: {node: '>=14'} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + engines: {node: '>=14.16'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + summary@2.1.0: + resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tsup@8.1.0: + resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + + tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + + udc@1.0.1: + resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vite-node@2.0.1: + resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.2.6: + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.0.1: + resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.0.1 + '@vitest/ui': 2.0.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@3.3.0: + resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + +snapshots: + + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: true - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.4': dependencies: regenerator-runtime: 0.14.1 - dev: true - /@bufbuild/protobuf@1.10.0: - resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} - dev: false + '@bufbuild/protobuf@1.10.0': {} - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + '@changesets/apply-release-plan@7.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/config': 3.0.0 @@ -111,10 +2945,8 @@ packages: prettier: 2.8.8 resolve-from: 5.0.0 semver: 7.6.0 - dev: true - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 @@ -122,17 +2954,12 @@ packages: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.0 - dev: true - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 - dev: true - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - hasBin: true + '@changesets/cli@2.27.1': dependencies: '@babel/runtime': 7.24.4 '@changesets/apply-release-plan': 7.0.0 @@ -166,10 +2993,8 @@ packages: spawndamnit: 2.0.0 term-size: 2.2.1 tty-table: 4.2.3 - dev: true - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.0.0': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.0.0 @@ -178,32 +3003,24 @@ packages: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 - dev: true - /@changesets/errors@0.1.4: - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + '@changesets/errors@0.1.4': dependencies: extendable-error: 0.1.7 - dev: true - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - dev: true - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.0.0': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.6.0 - dev: true - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/assemble-release-plan': 6.0.0 @@ -212,14 +3029,10 @@ packages: '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - dev: true - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: true + '@changesets/get-version-range-type@0.4.0': {} - /@changesets/git@2.0.0: - resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} + '@changesets/git@2.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/errors': 0.1.4 @@ -228,10 +3041,8 @@ packages: is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 - dev: true - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 @@ -240,46 +3051,34 @@ packages: is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 - dev: true - /@changesets/logger@0.0.5: - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + '@changesets/logger@0.0.5': dependencies: chalk: 2.4.2 - dev: true - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 - dev: true - /@changesets/parse@0.3.16: - resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + '@changesets/parse@0.3.16': dependencies: '@changesets/types': 5.2.1 js-yaml: 3.14.1 - dev: true - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - dev: true - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - dev: true - /@changesets/read@0.5.9: - resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + '@changesets/read@0.5.9': dependencies: '@babel/runtime': 7.24.4 '@changesets/git': 2.0.0 @@ -289,10 +3088,8 @@ packages: chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - dev: true - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/git': 3.0.0 @@ -302,533 +3099,211 @@ packages: chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - dev: true - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true + '@changesets/types@4.1.0': {} - /@changesets/types@5.2.1: - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - dev: true + '@changesets/types@5.2.1': {} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: true + '@changesets/types@6.0.0': {} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.3.0': dependencies: '@babel/runtime': 7.24.4 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - dev: true - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true + '@colors/colors@1.5.0': optional: true - /@connectrpc/connect-web@1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0): - resolution: {integrity: sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==} - peerDependencies: - '@bufbuild/protobuf': ^1.4.2 - '@connectrpc/connect': 1.4.0 + '@connectrpc/connect-web@1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))': dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) - dev: false - /@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0): - resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==} - peerDependencies: - '@bufbuild/protobuf': ^1.4.2 + '@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)': dependencies: '@bufbuild/protobuf': 1.10.0 - dev: false - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + '@esbuild/aix-ppc64@0.20.2': optional: true - /@esbuild/aix-ppc64@0.21.5: - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + '@esbuild/aix-ppc64@0.21.5': optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.20.2': optional: true - /@esbuild/android-arm64@0.21.5: - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.21.5': optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.20.2': optional: true - /@esbuild/android-arm@0.21.5: - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.21.5': optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.20.2': optional: true - /@esbuild/android-x64@0.21.5: - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.21.5': optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.20.2': optional: true - /@esbuild/darwin-arm64@0.21.5: - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.21.5': optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.20.2': optional: true - /@esbuild/darwin-x64@0.21.5: - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.21.5': optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-arm64@0.20.2': optional: true - /@esbuild/freebsd-arm64@0.21.5: - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-arm64@0.21.5': optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-x64@0.20.2': optional: true - /@esbuild/freebsd-x64@0.21.5: - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-x64@0.21.5': optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm64@0.20.2': optional: true - /@esbuild/linux-arm64@0.21.5: - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm64@0.21.5': optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm@0.20.2': optional: true - /@esbuild/linux-arm@0.21.5: - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm@0.21.5': optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.20.2': optional: true - /@esbuild/linux-ia32@0.21.5: - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.21.5': optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.20.2': optional: true - /@esbuild/linux-loong64@0.21.5: - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.21.5': optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.20.2': optional: true - /@esbuild/linux-mips64el@0.21.5: - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.21.5': optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.20.2': optional: true - /@esbuild/linux-ppc64@0.21.5: - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.21.5': optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.20.2': optional: true - /@esbuild/linux-riscv64@0.21.5: - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.21.5': optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.20.2': optional: true - /@esbuild/linux-s390x@0.21.5: - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.21.5': optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.20.2': optional: true - /@esbuild/linux-x64@0.21.5: - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.21.5': optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.20.2': optional: true - /@esbuild/netbsd-x64@0.21.5: - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.21.5': optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.20.2': optional: true - /@esbuild/openbsd-x64@0.21.5: - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.21.5': optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.20.2': optional: true - /@esbuild/sunos-x64@0.21.5: - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.21.5': optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.20.2': optional: true - /@esbuild/win32-arm64@0.21.5: - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.21.5': optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.20.2': optional: true - /@esbuild/win32-ia32@0.21.5: - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.21.5': optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.20.2': optional: true - /@esbuild/win32-x64@0.21.5: - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.21.5': optional: true - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: true + '@gar/promisify@1.1.3': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - dev: true - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@1.1.3': dependencies: '@babel/runtime': 7.24.4 '@changesets/types': 4.1.0 @@ -836,47 +3311,29 @@ packages: fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - dev: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.0 - dev: true - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@3.1.0': dependencies: semver: 7.6.0 - dev: true - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/git@4.1.0': dependencies: '@npmcli/promise-spawn': 6.0.2 lru-cache: 7.18.3 @@ -888,41 +3345,24 @@ packages: which: 3.0.1 transitivePeerDependencies: - bluebird - dev: true - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + '@npmcli/installed-package-contents@2.0.2': dependencies: npm-bundled: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - dev: true - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@npmcli/node-gyp@3.0.0': {} - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/promise-spawn@6.0.2': dependencies: which: 3.0.1 - dev: true - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/run-script@6.0.2': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 6.0.2 @@ -932,433 +3372,231 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pnpm/config.env-replace@1.1.0: - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} - dev: true + '@pnpm/config.env-replace@1.1.0': {} - /@pnpm/network.ca-file@1.0.2: - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} + '@pnpm/network.ca-file@1.0.2': dependencies: graceful-fs: 4.2.10 - dev: true - /@pnpm/npm-conf@2.2.2: - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} + '@pnpm/npm-conf@2.2.2': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.13.0': optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.13.0': optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.13.0': optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.13.0': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.13.0': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.13.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.13.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.13.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.13.0': optional: true - /@sigstore/bundle@1.1.0: - resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/bundle@1.1.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 - dev: true - /@sigstore/protobuf-specs@0.2.1: - resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@sigstore/protobuf-specs@0.2.1': {} - /@sigstore/sign@1.0.0: - resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/sign@1.0.0': dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /@sigstore/tuf@1.0.3: - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/tuf@1.0.3': dependencies: '@sigstore/protobuf-specs': 0.2.1 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color - dev: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@sindresorhus/is@5.6.0: - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - dev: true + '@sindresorhus/is@5.6.0': {} - /@snyk/github-codeowners@1.1.0: - resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} - engines: {node: '>=8.10'} - hasBin: true + '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 ignore: 5.3.1 p-map: 4.0.0 - dev: true - /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 - dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@tootallnate/once@2.0.0': {} - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@tufjs/canonical-json@1.0.0': {} - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@tufjs/models@1.0.4': dependencies: '@tufjs/canonical-json': 1.0.0 minimatch: 9.0.3 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true + '@types/http-cache-semantics@4.0.4': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: true + '@types/node@12.20.55': {} - /@types/node@18.18.6: - resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} - dev: true + '@types/node@18.18.6': {} - /@types/node@20.14.10: - resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + '@types/node@20.14.10': dependencies: undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/semver-utils@1.1.3: - resolution: {integrity: sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==} - dev: true + '@types/semver-utils@1.1.3': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.5.10': dependencies: '@types/node': 20.14.10 - dev: true - /@vitest/expect@2.0.1: - resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} + '@vitest/expect@2.0.1': dependencies: '@vitest/spy': 2.0.1 '@vitest/utils': 2.0.1 chai: 5.1.1 - dev: true - /@vitest/runner@2.0.1: - resolution: {integrity: sha512-XfcSXOGGxgR2dQ466ZYqf0ZtDLLDx9mZeQcKjQDLQ9y6Cmk2Wl7wxMuhiYK4Fo1VxCtLcFEGW2XpcfMuiD1Maw==} + '@vitest/runner@2.0.1': dependencies: '@vitest/utils': 2.0.1 pathe: 1.1.2 - dev: true - /@vitest/snapshot@2.0.1: - resolution: {integrity: sha512-rst79a4Q+J5vrvHRapdfK4BdqpMH0eF58jVY1vYeBo/1be+nkyenGI5SCSohmjf6MkCkI20/yo5oG+0R8qrAnA==} + '@vitest/snapshot@2.0.1': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@2.0.1: - resolution: {integrity: sha512-NLkdxbSefAtJN56GtCNcB4GiHFb5i9q1uh4V229lrlTZt2fnwsTyjLuWIli1xwK2fQspJJmHXHyWx0Of3KTXWA==} + '@vitest/spy@2.0.1': dependencies: tinyspy: 3.0.0 - dev: true - /@vitest/utils@2.0.1: - resolution: {integrity: sha512-STH+2fHZxlveh1mpU4tKzNgRk7RZJyr6kFGJYCI5vocdfqfPsQrgVC6k7dBWHfin5QNB4TLvRS0Ckly3Dt1uWw==} + '@vitest/utils@2.0.1': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 3.1.1 pretty-format: 29.7.0 - dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true + abbrev@1.1.1: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true + aproba@2.0.0: {} - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -1368,44 +3606,24 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - dev: true + assertion-error@2.0.1: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - dev: true - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.3.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -1415,62 +3633,38 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + breakword@1.0.6: dependencies: wcwidth: 1.0.1 - dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: semver: 7.6.0 - dev: true - /bundle-require@4.0.2(esbuild@0.21.5): - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' + bundle-require@4.0.2(esbuild@0.21.5): dependencies: esbuild: 0.21.5 load-tsconfig: 0.2.5 - dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -1492,11 +3686,8 @@ packages: unique-filename: 2.0.1 transitivePeerDependencies: - bluebird - dev: true - /cacache@17.1.4: - resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@17.1.4: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 @@ -1510,16 +3701,10 @@ packages: ssri: 10.0.5 tar: 6.2.1 unique-filename: 3.0.0 - dev: true - /cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - dev: true + cacheable-lookup@7.0.0: {} - /cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} + cacheable-request@10.2.14: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 @@ -1528,90 +3713,56 @@ packages: mimic-response: 4.0.0 normalize-url: 8.0.1 responselike: 3.0.0 - dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true + camelcase@7.0.1: {} - /chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} + chai@5.1.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 loupe: 3.1.1 pathval: 2.0.0 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /changeset@0.2.6: - resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} + changeset@0.2.6: dependencies: udc: 1.0.1 underscore: 1.13.6 - dev: true - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - dev: true + check-error@2.1.1: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -1622,382 +3773,216 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true + chownr@2.0.0: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + clean-stack@2.2.0: {} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true + cli-boxes@3.0.0: {} - /cli-table3@0.6.4: - resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.4: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - requiresBuild: true - dev: true + clone@1.0.4: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true + color-support@1.1.3: {} - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: true + commander@10.0.1: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} - dev: false + compare-versions@6.1.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: true - /configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} + configstore@6.0.0: dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - dev: true - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true + console-control-strings@1.1.0: {} - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 - dev: true - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true + csv-generate@3.4.3: {} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true + csv-parse@4.16.3: {} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true + csv-stringify@5.6.5: {} - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + csv@5.5.3: dependencies: csv-generate: 3.4.3 csv-parse: 4.16.3 csv-stringify: 5.6.5 stream-transform: 2.1.3 - dev: true - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.5: dependencies: ms: 2.1.2 - dev: true - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true - /deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - dev: true + deep-eql@5.0.2: {} - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - requiresBuild: true + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true + defer-to-connect@2.0.1: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true + delegates@1.0.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + dotenv@16.4.5: {} - /e2b@0.16.2-beta.23: - resolution: {integrity: sha512-xpT2CiymnWaJWC0HmTYdcTaXYgXwMqY2NW3ikl4Ham2t9wT3+2Xyz0EdJceBaZpPjNMm7+BcPBvj6tp8HGLptA==} - engines: {node: '>=18'} + e2b@0.16.2-beta.25: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) - '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0) + '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)) compare-versions: 6.1.0 openapi-fetch: 0.9.8 platform: 1.3.6 - dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + easy-table@1.2.0: dependencies: ansi-regex: 5.0.1 optionalDependencies: wcwidth: 1.0.1 - dev: true - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: true optional: true - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - dev: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true + err-code@2.0.3: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -2045,56 +4030,34 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -2119,13 +4082,8 @@ packages: '@esbuild/win32-arm64': 0.20.2 '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - dev: true - /esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 '@esbuild/android-arm': 0.21.5 @@ -2150,38 +4108,20 @@ packages: '@esbuild/win32-arm64': 0.21.5 '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: true + escalade@3.1.2: {} - /escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - dev: true + escape-goat@4.0.0: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -2192,11 +4132,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -2207,166 +4144,100 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true + exponential-backoff@3.1.1: {} - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: true + extendable-error@0.1.7: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-memoize@2.5.2: - resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} - dev: true + fast-memoize@2.5.2: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - dev: true + form-data-encoder@2.1.4: {} - /fp-and-or@0.1.4: - resolution: {integrity: sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==} - engines: {node: '>=10'} - dev: true + fp-and-or@0.1.4: {} - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-minipass@3.0.3: dependencies: minipass: 7.0.4 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -2376,74 +4247,44 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-stdin@8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} - dev: true + get-stdin@8.0.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2451,37 +4292,24 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -2489,17 +4317,12 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 @@ -2512,560 +4335,296 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 - dev: true - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true + graceful-fs@4.2.10: {} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + grapheme-splitter@1.0.4: {} - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true + has-unicode@2.0.1: {} - /has-yarn@3.0.0: - resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + has-yarn@3.0.0: {} - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@5.2.1: - resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hosted-git-info@5.2.1: dependencies: lru-cache: 7.18.3 - dev: true - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true + human-id@1.0.2: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: true - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - requiresBuild: true + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true optional: true - /ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.4: dependencies: minimatch: 9.0.3 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + import-lazy@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true + infer-owner@1.0.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true + ini@2.0.0: {} - /ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.2: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + is-ci@3.0.1: dependencies: ci-info: 3.9.0 - dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - dev: true - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true + is-lambda@1.0.1: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-npm@6.0.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /is-yarn-global@0.4.1: - resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} - engines: {node: '>=12'} - dev: true + is-yarn-global@0.4.1: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true - dev: true + jiti@1.21.6: {} - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + jju@1.4.0: {} - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + joycon@3.1.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: true + jsbn@1.1.0: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.1: {} - /json-parse-helpfulerror@1.0.3: - resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + json-parse-helpfulerror@1.0.3: dependencies: jju: 1.4.0 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonlines@0.1.1: - resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} - dev: true + jsonlines@0.1.1: {} - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): - resolution: {integrity: sha512-vUopqkh/gOovZ05qYgTghZpmkM3b2eKYdLTsu11ZTYnYEcsdfQeZs6l4U7Rap4b+1KEDd/yydJsuWl+4NyEA9g==} - engines: {node: '>=18.6.0'} - hasBin: true - peerDependencies: - '@types/node': '>=18' - typescript: '>=5.0.4' + knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 @@ -3086,109 +4645,62 @@ packages: typescript: 5.5.3 zod: 3.22.4 zod-validation-error: 3.3.0(zod@3.22.4) - dev: true - /latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} + latest-version@7.0.0: dependencies: package-json: 8.1.1 - dev: true - /lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.2: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + load-tsconfig@0.2.5: {} - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lodash.sortby@4.7.0: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + lodash.startcase@4.4.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.1: dependencies: get-func-name: 2.0.2 - dev: true - /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lowercase-keys@3.0.0: {} - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.0: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true + lru-cache@7.18.3: {} - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 @@ -3209,11 +4721,8 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + make-fetch-happen@11.1.1: dependencies: agentkeepalive: 4.5.0 cacache: 17.1.4 @@ -3232,21 +4741,12 @@ packages: ssri: 10.0.5 transitivePeerDependencies: - supports-color - dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + meow@6.1.1: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -3259,207 +4759,115 @@ packages: trim-newlines: 3.0.1 type-fest: 0.13.1 yargs-parser: 18.1.3 - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + mimic-response@3.1.0: {} - /mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + mimic-response@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - dev: true - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: true - /minipass-fetch@3.0.4: - resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@3.0.4: dependencies: minipass: 7.0.4 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: true - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - dev: true - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + minipass-json-stream@1.0.1: dependencies: jsonparse: 1.3.1 minipass: 3.3.6 - dev: true - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: true - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - /mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - dev: true + mixme@0.5.10: {} - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@0.6.3: {} - /node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -3475,56 +4883,34 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@6.0.0: dependencies: abbrev: 1.1.1 - dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - dev: true + normalize-url@8.0.1: {} - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@3.0.0: dependencies: npm-normalize-package-bin: 3.0.1 - dev: true - /npm-check-updates@16.14.20: - resolution: {integrity: sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==} - engines: {node: '>=14.14'} - hasBin: true + npm-check-updates@16.14.20: dependencies: '@types/semver-utils': 1.1.3 chalk: 5.3.0 @@ -3562,50 +4948,32 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.3.0: dependencies: semver: 7.6.0 - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 semver: 7.6.0 validate-npm-package-name: 5.0.0 - dev: true - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@7.0.4: dependencies: ignore-walk: 6.0.4 - dev: true - /npm-pick-manifest@8.0.2: - resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-pick-manifest@8.0.2: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 semver: 7.6.0 - dev: true - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@14.0.5: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 @@ -3616,167 +4984,95 @@ packages: proc-log: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /openapi-fetch@0.9.8: - resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + openapi-fetch@0.9.8: dependencies: openapi-typescript-helpers: 0.0.8 - dev: false - /openapi-typescript-helpers@0.0.8: - resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} - dev: false + openapi-typescript-helpers@0.0.8: {} - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true + outdent@0.5.0: {} - /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - dev: true + p-cancelable@3.0.0: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + p-filter@2.1.0: dependencies: p-map: 2.1.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + p-map@2.1.0: {} - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /package-json@8.1.1: - resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} - engines: {node: '>=14.16'} + package-json@8.1.1: dependencies: got: 12.6.1 registry-auth-token: 5.0.2 registry-url: 6.0.1 semver: 7.6.0 - dev: true - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + pacote@15.2.0: dependencies: '@npmcli/git': 4.1.0 '@npmcli/installed-package-contents': 2.0.2 @@ -3799,247 +5095,124 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true + parse-github-url@1.0.2: {} - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - dev: true + parse-ms@4.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - dev: true + pathval@2.0.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true + picocolors@1.0.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picomatch@2.3.1: {} - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true + picomatch@4.0.2: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + pify@4.0.1: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /platform@1.3.6: - resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - dev: false + platform@1.3.6: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.2 yaml: 2.4.5 - dev: true + optionalDependencies: + postcss: 8.4.38 - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - dev: true - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preferred-pm@3.1.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.0.0 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /pretty-ms@9.0.0: - resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} - engines: {node: '>=18'} + pretty-ms@9.0.0: dependencies: parse-ms: 4.0.0 - dev: true - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@3.0.0: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true + progress@2.0.3: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true + promise-inflight@1.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: true - /prompts-ncu@3.0.0: - resolution: {integrity: sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==} - engines: {node: '>= 14'} + prompts-ncu@3.0.0: dependencies: kleur: 4.1.5 sisteransi: 1.0.5 - dev: true - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: true + proto-list@1.2.4: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + pseudomap@1.0.2: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} - engines: {node: '>=12.20'} + pupa@3.1.0: dependencies: escape-goat: 4.0.0 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@5.1.1: {} - /rc-config-loader@4.1.3: - resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} + rc-config-loader@4.1.3: dependencies: debug: 4.3.4 js-yaml: 4.1.0 @@ -4047,196 +5220,115 @@ packages: require-from-string: 2.0.2 transitivePeerDependencies: - supports-color - dev: true - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.2.0: {} - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.1 npm-normalize-package-bin: 3.0.1 - dev: true - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + read-package-json@6.0.4: dependencies: glob: 10.3.10 json-parse-even-better-errors: 3.0.1 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true + regenerator-runtime@0.14.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} - engines: {node: '>=14'} + registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.2.2 - dev: true - /registry-url@6.0.1: - resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} - engines: {node: '>=12'} + registry-url@6.0.1: dependencies: rc: 1.2.8 - dev: true - /remote-git-tags@3.0.0: - resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} - engines: {node: '>=8'} - dev: true + remote-git-tags@3.0.0: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true + require-main-filename@2.0.0: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + resolve-alpn@1.2.1: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 - dev: true - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true + retry@0.12.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true + rimraf@5.0.5: dependencies: glob: 10.3.10 - dev: true - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.13.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -4254,73 +5346,43 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.13.0 '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - requiresBuild: true - dev: true + safer-buffer@2.1.2: {} - /semver-diff@4.0.0: - resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} - engines: {node: '>=12'} + semver-diff@4.0.0: dependencies: semver: 7.6.0 - dev: true - /semver-utils@1.1.4: - resolution: {integrity: sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==} - dev: true + semver-utils@1.1.4: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -4328,69 +5390,40 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + siginfo@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /sigstore@1.9.0: - resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + sigstore@1.9.0: dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 @@ -4399,26 +5432,14 @@ packages: make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true + smart-buffer@4.2.0: {} - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 breakword: 1.0.6 @@ -4426,229 +5447,136 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 15.4.1 - dev: true - /smol-toml@1.2.2: - resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} - engines: {node: '>= 18'} - dev: true + smol-toml@1.2.2: {} - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.4 socks: 2.8.1 transitivePeerDependencies: - supports-color - dev: true - /socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + socks@2.8.1: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 - dev: true - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /spawn-please@2.0.2: - resolution: {integrity: sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==} - engines: {node: '>=14'} + spawn-please@2.0.2: dependencies: cross-spawn: 7.0.3 - dev: true - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 - dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: true + sprintf-js@1.1.3: {} - /ssri@10.0.5: - resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@10.0.5: dependencies: minipass: 7.0.4 - dev: true - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ssri@9.0.1: dependencies: minipass: 3.3.6 - dev: true - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true + std-env@3.7.0: {} - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + stream-transform@2.1.3: dependencies: mixme: 0.5.10 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@5.0.1: - resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} - engines: {node: '>=14.16'} - dev: true + strip-json-comments@5.0.1: {} - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -4657,34 +5585,20 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - /summary@2.1.0: - resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - dev: true + summary@2.1.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -4692,101 +5606,48 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true + term-size@2.2.1: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - dev: true + tinybench@2.8.0: {} - /tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} - engines: {node: ^18.0.0 || >=20.0.0} - dev: true + tinypool@1.0.0: {} - /tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@3.0.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tsup@8.1.0(typescript@5.5.3): - resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@8.1.0(postcss@8.4.38)(typescript@5.5.3): dependencies: bundle-require: 4.0.2(esbuild@0.21.5) cac: 6.7.14 @@ -4796,22 +5657,20 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2 + postcss-load-config: 4.0.2(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.13.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 typescript: 5.5.3 transitivePeerDependencies: - supports-color - ts-node - dev: true - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true + tty-table@4.2.3: dependencies: chalk: 4.1.2 csv: 5.5.3 @@ -4820,67 +5679,40 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 17.7.2 - dev: true - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 debug: 4.3.4 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true + type-fest@0.13.1: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -4888,11 +5720,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -4900,89 +5729,51 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.5.3: {} - /udc@1.0.1: - resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} - dev: true + udc@1.0.1: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - dev: true + underscore@1.13.6: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@5.26.5: {} - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 - dev: true - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 - dev: true - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 - dev: true - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 - dev: true - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.1.2: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + untildify@4.0.0: {} - /update-notifier@6.0.2: - resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} - engines: {node: '>=14.16'} + update-notifier@6.0.2: dependencies: boxen: 7.1.1 chalk: 5.3.0 @@ -4998,30 +5789,19 @@ packages: semver: 7.6.0 semver-diff: 4.0.0 xdg-basedir: 5.1.0 - dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@5.0.0: dependencies: builtins: 5.0.1 - dev: true - /vite-node@2.0.1(@types/node@18.18.6): - resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@2.0.1(@types/node@18.18.6): dependencies: cac: 6.7.14 debug: 4.3.5 @@ -5037,71 +5817,19 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@5.2.6(@types/node@18.18.6): - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.2.6(@types/node@18.18.6): dependencies: - '@types/node': 18.18.6 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 optionalDependencies: + '@types/node': 18.18.6 fsevents: 2.3.3 - dev: true - /vitest@2.0.1(@types/node@18.18.6): - resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.1 - '@vitest/ui': 2.0.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@2.0.1(@types/node@18.18.6): dependencies: '@ampproject/remapping': 2.3.0 - '@types/node': 18.18.6 '@vitest/expect': 2.0.1 '@vitest/runner': 2.0.1 '@vitest/snapshot': 2.0.1 @@ -5119,6 +5847,8 @@ packages: vite: 5.2.6(@types/node@18.18.6) vite-node: 2.0.1(@types/node@18.18.6) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 18.18.6 transitivePeerDependencies: - less - lightningcss @@ -5127,189 +5857,114 @@ packages: - sugarss - supports-color - terser - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - requiresBuild: true + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true + which-module@2.0.1: {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + which@3.0.1: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: true - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - dev: true + xdg-basedir@5.1.0: {} - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + yallist@2.1.2: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yaml@2.4.5: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -5322,11 +5977,8 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -5335,22 +5987,11 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /zod-validation-error@3.3.0(zod@3.22.4): - resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 + zod-validation-error@3.3.0(zod@3.22.4): dependencies: zod: 3.22.4 - dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: true + zod@3.22.4: {} From 545089d62c9e4e87c81448d32d970c2b56c54684 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 13 Jul 2024 20:55:31 -0700 Subject: [PATCH 169/722] Update pnpm --- .github/workflows/js_tests.yml | 4 ++-- .github/workflows/release.yml | 8 +++++--- .github/workflows/release_candidates.yml | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 9244926f..3fea1df9 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -21,10 +21,10 @@ jobs: uses: actions/checkout@v3 - name: Install pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v3 id: pnpm-install with: - version: 8 + version: 9.5 - name: Setup Node uses: actions/setup-node@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 418d796d..feaa74cc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,10 +21,10 @@ jobs: uses: actions/checkout@v3 - name: Install pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v3 id: pnpm-install with: - version: 8 + version: 9.5 - name: Setup Node uses: actions/setup-node@v3 @@ -119,7 +119,9 @@ jobs: virtualenvs-in-project: true installer-parallel: true - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 + with: + version: 9.5 - name: Setup Node.js 18 uses: actions/setup-node@v3 diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index c6bc9da6..672b8426 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -19,6 +19,8 @@ jobs: - uses: pnpm/action-setup@v3 if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} + with: + version: 9.5 - name: Setup Node.js 18 uses: actions/setup-node@v4 From d89e889687e6a081fb3b504e2a25cd892546305d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 14 Jul 2024 03:56:25 +0000 Subject: [PATCH 170/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 2b34b97a..c6206244 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.9", + "version": "0.0.9-beta.10", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 11b13e52..9a0eb8e7 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a9" +version = "0.0.11a10" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 369f00c135a687d5965ec08f973201614d243550 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 15 Jul 2024 18:50:24 +0200 Subject: [PATCH 171/722] Add multiple languages (Java, JavaScript, R, Bash) --- template/e2b.Dockerfile | 24 +++++++++++++++++++++++- template/start-up.sh | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index afff0b4a..94c23ccc 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -1,7 +1,11 @@ FROM python:3.10 +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" + RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo + build-essential curl git util-linux jq sudo nodejs npm ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -10,6 +14,24 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ IPYTHON_CONFIG_PATH="/root/.ipython" \ SERVER_PATH="/root/.server" +# Java Kernel +RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ + unzip ijava-1.3.0.zip && \ + python install.py --sys-prefix + +# Javascript Kernel +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + +# R Kernel +RUN apt-get update && apt-get install -y r-base +RUN R -e "install.packages('IRkernel')" +RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" + +# Bash Kernel +RUN pip install bash_kernel +RUN python -m bash_kernel.install + COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user diff --git a/template/start-up.sh b/template/start-up.sh index 67c4c418..ec9e8116 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -29,6 +29,8 @@ function start_jupyter_server() { uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors } +export PATH="/opt/java/openjdk/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + echo "Starting Code Interpreter server..." start_jupyter_server & jupyter server --IdentityProvider.token="" >/dev/null 2>&1 From b27cd1654796d0dc57928cff54c9b35f6f805e4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 15 Jul 2024 16:58:40 +0000 Subject: [PATCH 172/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c6206244..b68610b8 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.10", + "version": "0.0.9-beta.11", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9a0eb8e7..9aa9e7ef 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a10" +version = "0.0.11a11" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From b8218ab9c79069c87acac4e8861fb335401dbd77 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 16 Jul 2024 10:38:51 +0200 Subject: [PATCH 173/722] Build the template --- python/example.py | 48 ++++++++++++++++++++++++++++++----------- template/e2b.Dockerfile | 13 ++++++----- template/e2b.toml | 10 ++++----- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/python/example.py b/python/example.py index bd297350..a3eda3d7 100644 --- a/python/example.py +++ b/python/example.py @@ -3,22 +3,44 @@ load_dotenv() +python_code = """ +k = 1 +k +""" -code = """ -import matplotlib.pyplot as plt -import numpy as np -import time +java_code = """ +(int) eval("1 + 1") + 3 +""" -print("1") -time.sleep(10) +js_code = """ +console.log("Hello World"); +""" -import pandas -pandas.DataFrame({"a": [1, 2, 3]}) +r_code = """ +x <- 13 +x """ -sandbox = CodeInterpreter.connect("", debug=True) -sandbox.notebook.exec_cell("x = 1") -sandbox.notebook.restart_kernel() +sandbox = CodeInterpreter("code-interpreter-beta") +execution = sandbox.notebook.exec_cell(python_code) +print(execution) +print(execution.logs) +print(len(execution.results)) + +js_id = sandbox.notebook.create_kernel(kernel_name="javascript") +execution = sandbox.notebook.exec_cell(js_code, kernel_id=js_id) +print(execution) +print(execution.logs) +print(len(execution.results)) + +java_id = sandbox.notebook.create_kernel(kernel_name="java") +execution = sandbox.notebook.exec_cell(java_code, kernel_id=java_id) +print(execution) +print(execution.logs) +print(len(execution.results)) -r = sandbox.notebook.exec_cell("x") -assert r.error.value == "name 'x' is not defined" +r_id = sandbox.notebook.create_kernel(kernel_name="r") +execution = sandbox.notebook.exec_cell(r_code, kernel_id=r_id) +print(execution) +print(execution.logs) +print(len(execution.results)) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 94c23ccc..98a80e7d 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -14,6 +14,10 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ IPYTHON_CONFIG_PATH="/root/.ipython" \ SERVER_PATH="/root/.server" +# Install Jupyter +COPY ./requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user + # Java Kernel RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ unzip ijava-1.3.0.zip && \ @@ -32,13 +36,13 @@ RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" RUN pip install bash_kernel RUN python -m bash_kernel.install -COPY ./requirements.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user - +# Copy server and its requirements RUN mkdir -p $SERVER_PATH/ COPY ./server/requirements.txt $SERVER_PATH RUN pip install --no-cache-dir -r $SERVER_PATH/requirements.txt +COPY ./server $SERVER_PATH +# Copy Jupyter configuration COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh @@ -47,6 +51,5 @@ COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ -COPY ./server $SERVER_PATH - +# Setup entrypoint for local development ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/e2b.toml b/template/e2b.toml index 03d45b92..68c8bbfc 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,16 +1,16 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (1tsfj5yvigmgc5gmgqz2) or 'template_name (code-interpreter-stateful) from this config to spawn a sandbox: +# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: # Python SDK # from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-stateful') +# sandbox = Sandbox(template='code-interpreter-beta') # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-stateful' }) +# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) memory_mb = 1_024 start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-stateful" -template_id = "1tsfj5yvigmgc5gmgqz2" +template_name = "code-interpreter-beta" +template_id = "3e4rngfa34txe0gxc1zf" From 9cc52c7f0e753ae6be9ae43d7798d0f698fd29bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 16 Jul 2024 08:39:43 +0000 Subject: [PATCH 174/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index b68610b8..1e17fa50 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.11", + "version": "0.0.9-beta.12", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9aa9e7ef..51cbad78 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a11" +version = "0.0.11a12" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From cb321c08fa780b97757406be4d76dfa8494543b6 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 12:20:17 +0200 Subject: [PATCH 175/722] Remove stream wrapper --- template/server/stream.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/template/server/stream.py b/template/server/stream.py index f6db3c49..0ef0195b 100644 --- a/template/server/stream.py +++ b/template/server/stream.py @@ -6,17 +6,6 @@ from fastapi.responses import StreamingResponse -async def async_enumerate(async_sequence: AsyncIterable, start=0): - """Asynchronously enumerate an async iterator from a given start value. - - See https://stackoverflow.com/a/55930068/9639441 - """ - idx = start - async for element in async_sequence: - yield idx, element - idx += 1 - - class StreamingListJsonResponse(StreamingResponse): """Converts a pydantic model generator into a streaming HTTP Response that streams a JSON list, one element at a time. @@ -46,6 +35,6 @@ async def _encoded_async_generator(self, async_generator: AsyncIterable): """Converts an asynchronous pydantic model generator into a streaming JSON list """ - async for _, item in async_enumerate(async_generator): + async for item in async_generator: yield f"{json.dumps(jsonable_encoder(item))}\n" yield '{"type": "end_of_execution"}\n' From 987151348651dc0ab09664fdeba25e6d20741ccd Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 12:20:30 +0200 Subject: [PATCH 176/722] Remove unused openapi for template proxy server --- Makefile | 13 ----- openapi.yml | 148 ---------------------------------------------------- 2 files changed, 161 deletions(-) delete mode 100644 openapi.yml diff --git a/Makefile b/Makefile index c47bac6b..ea1bc454 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,2 @@ -.PHONY: generate -generate: - # Generate Python client - pipx install openapi-python-client - rm -rf ./python/e2b_code_interpreter/client - openapi-python-client generate --path openapi.yml --output-path ./python/e2b_code_interpreter/client - mv ./python/e2b_code_interpreter/client/e2b_code_interpreter_client/* ./python/e2b_code_interpreter/client - - rm ./python/e2b_code_interpreter/client/.gitignore ./python/e2b_code_interpreter/client/pyproject.toml ./python/e2b_code_interpreter/client/README.md ./python/e2b_code_interpreter/client/py.typed - rm -rf ./python/e2b_code_interpreter/client/e2b_code_interpreter_client - black . - - start-template-server: docker run --rm -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) diff --git a/openapi.yml b/openapi.yml deleted file mode 100644 index 1d0f1188..00000000 --- a/openapi.yml +++ /dev/null @@ -1,148 +0,0 @@ -openapi: 3.0.0 -info: - version: 0.1.0 - title: E2B Code Interpreter - -components: - parameters: - templateID: - name: templateID - in: path - required: true - schema: - type: string - buildID: - name: buildID - in: path - required: true - schema: - type: string - sandboxID: - name: sandboxID - in: path - required: true - schema: - type: string - - responses: - "400": - description: Bad request - content: - text/plain: - schema: - type: string - "404": - description: Not found - content: - text/plain: - schema: - type: string - - "500": - description: Server error - content: - text/plain: - schema: - type: string - - schemas: - Output: - required: - - type - properties: - type: - type: string - enum: - - stdout - - stderr - - result - - error - description: Type of the result - text: - type: string - description: Textual representation of the result - html: - type: string - description: HTML representation of the result - markdown: - type: string - description: Markdown representation of the result - svg: - type: string - description: SVG representation of the result - png: - type: string - description: PNG representation of the result - jpeg: - type: string - description: JPEG representation of the result - pdf: - type: string - description: PDF representation of the result - latex: - type: string - description: LaTeX representation of the result - json: - type: object - description: JSON representation of the result - javascript: - type: string - description: JavaScript representation of the result - extra: - type: object - description: Extra representations of the result - is_main_result: - type: boolean - description: Whether this is the main result of the cell - - name: - type: string - description: Name of the exception - value: - type: string - description: Value of the exception - traceback: - type: string - description: List of strings representing the traceback - - ExecutionRequest: - required: - - code - properties: - code: - type: string - description: Code to be executed - language: - type: string - description: Language of the code to be executed - -paths: - /health: - get: - description: Health check - responses: - "200": - description: Request was successful - - /execute: - post: - description: Create a sandbox from the template - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/ExecutionRequest" - responses: - "200": - description: The sandbox was created successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/Output" - "400": - $ref: "#/components/responses/400" - "500": - $ref: "#/components/responses/500" From 9bcf61774cff364bbfd72db168ad18e5c2ed3d21 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 12:28:31 +0200 Subject: [PATCH 177/722] Update JS test for local debug testing --- js/tests/bash.test.ts | 5 +++-- js/tests/executionCount.test.ts | 5 +++-- js/tests/kernels.test.ts | 9 ++++++--- js/tests/statefulness.test.ts | 5 +++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/js/tests/bash.test.ts b/js/tests/bash.test.ts index 26f2f7d0..ff20756a 100644 --- a/js/tests/bash.test.ts +++ b/js/tests/bash.test.ts @@ -1,8 +1,9 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' -sandboxTest('bash', async ({ sandbox }) => { +// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. +sandboxTest.skipIf(isDebug)('bash', async ({ sandbox }) => { const result = await sandbox.notebook.execCell('!pwd') expect(result.logs.stdout.join().trim()).toEqual('/home/user') diff --git a/js/tests/executionCount.test.ts b/js/tests/executionCount.test.ts index 9d1a9794..7baef60e 100644 --- a/js/tests/executionCount.test.ts +++ b/js/tests/executionCount.test.ts @@ -1,8 +1,9 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' -sandboxTest('execution count', async ({ sandbox }) => { +// Skip this test if we are running in debug mode — we don't create new sandbox for each test so the execution number is not reset. +sandboxTest.skipIf(isDebug)('execution count', async ({ sandbox }) => { await sandbox.notebook.execCell('!pwd') const result = await sandbox.notebook.execCell('!pwd') diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 37e8ab6e..510c01e1 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -1,6 +1,6 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' sandboxTest('create new kernel', async ({ sandbox }) => { await sandbox.notebook.createKernel() @@ -23,7 +23,8 @@ sandboxTest('restart kernel', async ({ sandbox }) => { expect(output.error!.value).toEqual("name 'x' is not defined") }) -sandboxTest('list kernels', async ({ sandbox }) => { +// Skip this test if we are running in debug mode — we don't know how many kernels are in the local debug testing container. +sandboxTest.skipIf(isDebug)('list kernels', async ({ sandbox }) => { let kernels = await sandbox.notebook.listKernels() expect(kernels.length).toEqual(1) @@ -32,7 +33,9 @@ sandboxTest('list kernels', async ({ sandbox }) => { expect(kernels.map(kernel => kernel.kernelID)).toContain(kernelID) expect(kernels.length).toEqual(2) }) -sandboxTest('shutdown kernel', async ({ sandbox }) => { + +// Skip this test if we are running in debug mode — we don't know how many kernels are in the local debug testing container. +sandboxTest.skipIf(isDebug)('shutdown kernel', async ({ sandbox }) => { let kernels = await sandbox.notebook.listKernels() expect(kernels.length).toEqual(1) diff --git a/js/tests/statefulness.test.ts b/js/tests/statefulness.test.ts index 59e4e302..8989f22b 100644 --- a/js/tests/statefulness.test.ts +++ b/js/tests/statefulness.test.ts @@ -1,8 +1,9 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' -sandboxTest('statefulness', async ({ sandbox }) => { +// Skip this test if we are running in debug mode — the execution is persisted between all tests so the result is not reset. +sandboxTest.skipIf(isDebug)('statefulness', async ({ sandbox }) => { await sandbox.notebook.execCell('x = 1') const result = await sandbox.notebook.execCell('x += 1; x') From 869f29b99732e476ae3dece4d29e167382f10e55 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 13:35:05 +0200 Subject: [PATCH 178/722] Improve jupyter proxy server performance --- template/server/main.py | 13 ++-- template/server/messaging.py | 125 ++++++++--------------------------- 2 files changed, 32 insertions(+), 106 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 04945927..0c9f9f3f 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -44,11 +44,10 @@ async def lifespan(app: FastAPI): "/home/user", ) - websockets["default"] = default_ws - logger.info("Connecting to default runtime") - asyncio.create_task(default_ws.connect()) - await default_ws.started + await default_ws.connect() + + websockets["default"] = default_ws logger.info("Connected to default runtime") yield @@ -129,8 +128,7 @@ async def create_context(request: CreateContext) -> Context: request.name, request.cwd, ) - asyncio.create_task(ws.connect()) - await ws.started + await ws.connect() websockets[kernel_id] = ws @@ -184,8 +182,7 @@ async def restart_context(context_id: str) -> None: ws.cwd, ) - _ = asyncio.create_task(ws.connect()) - await ws.started + await ws.connect() websockets[context_id] = ws diff --git a/template/server/messaging.py b/template/server/messaging.py index 1267a1b6..2a509b43 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -2,39 +2,37 @@ import logging import uuid import asyncio -import random -from asyncio import Future, Queue +from asyncio import Queue from typing import ( - Callable, Dict, - Any, - AsyncIterator, - List, - AsyncIterable, Optional, Union, ) from pydantic import StrictStr +from websockets.client import WebSocketClientProtocol, connect from api.models.error import Error from api.models.logs import Stdout, Stderr from api.models.result import Result from api.models.output import EndOfExecution, NumberOfExecutions, OutputType -from websockets.legacy.client import WebSocketClientProtocol, Connect -from websockets.exceptions import ConnectionClosed - - -TIMEOUT = 60 - logger = logging.getLogger(__name__) class Execution: def __init__(self): - self.queue = Queue() + self.queue = Queue[ + Union[ + Result, + Error, + Stdout, + Stderr, + EndOfExecution, + NumberOfExecutions, + ] + ]() self.input_accepted = False @@ -53,11 +51,8 @@ def __init__( self.kernel_id = kernel_id self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" self.session_id = session_id + self._executions: Dict[str, Execution] = {} - self._process_cleanup: List[Callable[[], Any]] = [] - self._waiting_for_replies: Dict[str, Future] = {} - self._stopped = Future() - self.started = Future() async def connect(self): logger.debug(f"WebSocket connecting to {self.url}") @@ -65,38 +60,18 @@ async def connect(self): ws_logger = logger.getChild("websockets.client") ws_logger.setLevel(logging.ERROR) - websocket_connector = E2BConnect( + self._ws = await connect( self.url, max_size=None, max_queue=None, logger=ws_logger, ) - websocket_connector.BACKOFF_MIN = 1 - websocket_connector.BACKOFF_FACTOR = 1 - websocket_connector.BACKOFF_INITIAL = 0.2 # type: ignore - - async for websocket in websocket_connector: - try: - self._ws = websocket - self.started.set_result(None) - - logger.info(f"WebSocket connected to {self.url}") - - receive_task = asyncio.create_task( - self._receive_message(), name="receive_message" - ) - self._process_cleanup.append(receive_task.cancel) - - while not self._stopped.done(): - await asyncio.sleep(0) - - logger.info("WebSocket stopped") - break - except ConnectionClosed: - logger.warning("WebSocket disconnected, it will try to reconnect") - if self._stopped.done(): - break + logger.info(f"WebSocket connected to {self.url}") + self._receive_task = asyncio.create_task( + self._receive_message(), + name="receive_message", + ) def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: return json.dumps( @@ -120,7 +95,7 @@ def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: } ) - async def execute(self, code: Union[str, StrictStr]) -> AsyncIterable: + async def execute(self, code: Union[str, StrictStr]): message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") @@ -144,10 +119,11 @@ async def execute(self, code: Union[str, StrictStr]) -> AsyncIterable: del self._executions[message_id] async def _receive_message(self): + if not self._ws: + logger.error("No WebSocket connection") + return + try: - if not self._ws: - logger.error("No WebSocket connection") - return async for message in self._ws: logger.debug(f"WebSocket received message: {message}".strip()) await self._process_message(json.loads(message)) @@ -246,58 +222,11 @@ async def _process_message(self, data: dict): async def close(self): logger.debug(f"Closing WebSocket {self.kernel_id}") - try: - self._stopped.set_result(None) - except Exception as e: - logger.error(f"Error while closing WebSocket {self.kernel_id}: {e}") - - for cleanup in self._process_cleanup: - cleanup() if self._ws is not None: await self._ws.close() - for handler in self._waiting_for_replies.values(): - logger.debug(f"Cancelling waiting for execution result for {handler}") - handler.cancel() - del handler - + self._receive_task.cancel() -class E2BConnect(Connect): - async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]: - retries = 0 - max_retries = 12 - backoff_delay = 0.1 - while True: - try: - async with self as protocol: - yield protocol - except Exception: - retries += 1 - if retries >= max_retries: - raise Exception("Failed to connect to the server") - # Add a random initial delay between 0 and 5 seconds. - # See 7.2.3. Recovering from Abnormal Closure in RFC 6544. - if backoff_delay == 0.1: - initial_delay = random.random() - self.logger.info( - "! connect failed; reconnecting in %.1f seconds", - initial_delay, - exc_info=True, - ) - await asyncio.sleep(initial_delay) - else: - self.logger.info( - "! connect failed again; retrying in %d seconds", - int(backoff_delay), - exc_info=True, - ) - await asyncio.sleep(int(backoff_delay)) - # Increase delay with truncated exponential backoff. - if retries > 4: - backoff_delay = backoff_delay * 1.2 - backoff_delay = min(backoff_delay, 10) - continue - else: - # Connection succeeded - reset backoff delay - backoff_delay = 0.1 + for execution in self._executions.values(): + execution.queue.put_nowait(EndOfExecution()) From 3ed3699afeffaad5930ff30f9586e3cde37dfd82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 17 Jul 2024 11:52:44 +0000 Subject: [PATCH 179/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 1e17fa50..902f33a7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.12", + "version": "0.0.9-beta.13", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 51cbad78..5eddee98 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a12" +version = "0.0.11a13" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 78aac113437855905b506bc1723de32cac609ce9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 17 Jul 2024 14:13:42 +0200 Subject: [PATCH 180/722] Fix python image + add node-gyp --- template/e2b.Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 98a80e7d..ab2ac9c8 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10 +FROM python:3.10.14 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME @@ -24,6 +24,7 @@ RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3 python install.py --sys-prefix # Javascript Kernel +RUN npm install -g node-gyp RUN npm install -g --unsafe-perm ijavascript RUN ijsinstall --install=global From a42cafedf7396189e37cd8481cc6e304b69103c3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 17 Jul 2024 12:14:35 +0000 Subject: [PATCH 181/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 902f33a7..3e63d1bb 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.13", + "version": "0.0.9-beta.14", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 5eddee98..311a1856 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a13" +version = "0.0.11a14" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From dafc9cc2852438654d93344e95d21c89e7748f78 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 15:14:03 +0200 Subject: [PATCH 182/722] Fix timeout error handling in JS CI SDK --- js/src/codeInterpreter.ts | 214 +++++++++++++++++++++++--------------- 1 file changed, 128 insertions(+), 86 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 0af9905b..c3812fc3 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,7 +1,23 @@ -import { ConnectionConfig, Sandbox } from 'e2b' +import { ConnectionConfig, Sandbox, TimeoutError } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' +function formatRequestTimeoutError(error: unknown) { + if (error instanceof Error && error.name === 'AbortError') { + return new TimeoutError('Request timed out — the \'requestTimeoutMs\' option can be used to increase this timeout') + } + + return error +} + +function formatExecutionTimeoutError(error: unknown) { + if (error instanceof Error && error.name === 'AbortError') { + return new TimeoutError('Execution timed out — the \'timeoutMs\' option can be used to increase this timeout') + } + + return error +} + async function* readLines(stream: ReadableStream) { const reader = stream.getReader(); let buffer = '' @@ -62,48 +78,56 @@ export class JupyterExtension { }, requestTimeout) : undefined - const res = await fetch(`${this.url}/execute`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - code, - context_id: opts?.kernelID, - }), - keepalive: true, - }) - - const error = await extractError(res) - if (error) { - throw error - } + try { + const res = await fetch(`${this.url}/execute`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + code, + context_id: opts?.kernelID, + }), + signal: controller.signal, + keepalive: true, + }) + + const error = await extractError(res) + if (error) { + throw error + } - if (!res.body) { - throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`) - } + if (!res.body) { + throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`) + } - clearTimeout(reqTimer) + clearTimeout(reqTimer) - const bodyTimeout = opts?.timeoutMs ?? JupyterExtension.execTimeoutMs + const bodyTimeout = opts?.timeoutMs ?? JupyterExtension.execTimeoutMs - const bodyTimer = bodyTimeout - ? setTimeout(() => { - controller.abort() - }, bodyTimeout) - : undefined + const bodyTimer = bodyTimeout + ? setTimeout(() => { + controller.abort() + }, bodyTimeout) + : undefined - const execution = new Execution() + const execution = new Execution() - try { - for await (const chunk of readLines(res.body)) { - await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult) + + try { + for await (const chunk of readLines(res.body)) { + await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult) + } + } catch (error) { + throw formatExecutionTimeoutError(error) + } finally { + clearTimeout(bodyTimer) } - } finally { - clearTimeout(bodyTimer) - } - return execution + return execution + } catch (error) { + throw formatRequestTimeoutError(error) + } } async createKernel({ @@ -115,26 +139,31 @@ export class JupyterExtension { kernelName?: string, requestTimeoutMs?: number, } = {}): Promise { - const res = await fetch(`${this.url}/contexts`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - name: kernelName, - cwd, - }), - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error - } + try { - const data = await res.json() - return data.id + const res = await fetch(`${this.url}/contexts`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: kernelName, + cwd, + }), + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + const error = await extractError(res) + if (error) { + throw error + } + + const data = await res.json() + return data.id + } catch (error) { + throw formatRequestTimeoutError(error) + } } async restartKernel({ @@ -144,19 +173,23 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - kernelID = kernelID || JupyterExtension.defaultKernelID - const res = await fetch(`${this.url}/contexts/${kernelID}/restart`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error + try { + kernelID = kernelID || JupyterExtension.defaultKernelID + const res = await fetch(`${this.url}/contexts/${kernelID}/restart`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + const error = await extractError(res) + if (error) { + throw error + } + } catch (error) { + throw formatRequestTimeoutError(error) } } @@ -167,17 +200,22 @@ export class JupyterExtension { kernelID?: string, requestTimeoutMs?: number, } = {}): Promise { - kernelID = kernelID || JupyterExtension.defaultKernelID + try { - const res = await fetch(`${this.url}/contexts/${kernelID}`, { - method: 'DELETE', - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) + kernelID = kernelID || JupyterExtension.defaultKernelID - const error = await extractError(res) - if (error) { - throw error + const res = await fetch(`${this.url}/contexts/${kernelID}`, { + method: 'DELETE', + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + const error = await extractError(res) + if (error) { + throw error + } + } catch (error) { + throw formatRequestTimeoutError(error) } } @@ -186,17 +224,21 @@ export class JupyterExtension { }: { requestTimeoutMs?: number, } = {}): Promise<{ kernelID: string, name: string }[]> { - const res = await fetch(`${this.url}/contexts`, { - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error - } + try { + const res = await fetch(`${this.url}/contexts`, { + keepalive: true, + signal: this.connectionConfig.getSignal(requestTimeoutMs), + }) + + const error = await extractError(res) + if (error) { + throw error + } - return (await res.json()).map((kernel: any) => ({ kernelID: kernel.id, name: kernel.name })) + return (await res.json()).map((kernel: any) => ({ kernelID: kernel.id, name: kernel.name })) + } catch (error) { + throw formatRequestTimeoutError(error) + } } } From b90683e5ecb21589aa99cd3cd2cca7cf85741204 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 17 Jul 2024 13:15:03 +0000 Subject: [PATCH 183/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 3e63d1bb..75b3375a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.14", + "version": "0.0.9-beta.15", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 311a1856..65c8ed31 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a14" +version = "0.0.11a15" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 6edcbdc81e5ac26e00c19dbb1270934aece685da Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 17 Jul 2024 15:27:54 +0200 Subject: [PATCH 184/722] Improve timeout exception handling in Python CI SDK --- .../code_interpreter_async.py | 148 +++++++++-------- .../code_interpreter_sync.py | 149 ++++++++++-------- python/e2b_code_interpreter/exceptions.py | 13 ++ 3 files changed, 175 insertions(+), 135 deletions(-) create mode 100644 python/e2b_code_interpreter/exceptions.py diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index b46f34c5..28a59af2 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,4 +1,5 @@ import logging +import httpx from typing import Optional, List from httpx import AsyncHTTPTransport, AsyncClient @@ -19,6 +20,10 @@ OutputHandler, OutputMessage, ) +from e2b_code_interpreter.exceptions import ( + format_execution_timeout_error, + format_request_timeout_error, +) logger = logging.getLogger(__name__) @@ -55,32 +60,37 @@ async def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout - async with self._client.stream( - "POST", - f"{self._url}/execute", - json={ - "code": code, - "context_id": kernel_id, - }, - timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) as response: - - err = await aextract_exception(response) - if err: - raise err - - execution = Execution() - - async for line in response.aiter_lines(): - parse_output( - execution, - line, - on_stdout=on_stdout, - on_stderr=on_stderr, - on_result=on_result, - ) - - return execution + try: + async with self._client.stream( + "POST", + f"{self._url}/execute", + json={ + "code": code, + "context_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) as response: + + err = await aextract_exception(response) + if err: + raise err + + execution = Execution() + + async for line in response.aiter_lines(): + parse_output( + execution, + line, + on_stdout=on_stdout, + on_stderr=on_stderr, + on_result=on_result, + ) + + return execution + except httpx.ReadTimeout: + raise format_execution_timeout_error() + except httpx.TimeoutException: + raise format_request_timeout_error() async def create_kernel( self, @@ -96,18 +106,21 @@ async def create_kernel( if cwd: data["cwd"] = cwd - response = await self._client.post( - f"{self._url}/contexts", - json=data, - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = await self._client.post( + f"{self._url}/contexts", + json=data, + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = await aextract_exception(response) - if err: - raise err + err = await aextract_exception(response) + if err: + raise err - data = response.json() - return data["id"] + data = response.json() + return data["id"] + except httpx.TimeoutException: + raise format_request_timeout_error() async def shutdown_kernel( self, @@ -117,14 +130,17 @@ async def shutdown_kernel( logger.debug(f"Shutting down a kernel with id {kernel_id}") kernel_id = kernel_id or DEFAULT_KERNEL_ID - response = await self._client.delete( - url=f"{self._url}/contexts/{kernel_id}", - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = await self._client.delete( + url=f"{self._url}/contexts/{kernel_id}", + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = await aextract_exception(response) - if err: - raise err + err = await aextract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() async def restart_kernel( self, @@ -134,38 +150,36 @@ async def restart_kernel( logger.debug(f"Restarting kernel: {kernel_id}") kernel_id = kernel_id or DEFAULT_KERNEL_ID - response = await self._client.post( - f"{self._url}/contexts/{kernel_id}/restart", - timeout=request_timeout or self._connection_config.request_timeout, - ) - err = await aextract_exception(response) - if err: - raise err + try: + response = await self._client.post( + f"{self._url}/contexts/{kernel_id}/restart", + timeout=request_timeout or self._connection_config.request_timeout, + ) + + err = await aextract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() async def list_kernels( self, request_timeout: Optional[float] = None, ) -> List[Kernel]: - """ - Lists all available Jupyter kernels. - - This method fetches a list of all currently available Jupyter kernels from the server. It can be used - to retrieve the IDs of all kernels that are currently running or available for connection. - - :param timeout: The timeout for the kernel list request. - :return: List of kernel ids - """ - response = await self._client.get( - f"{self._url}/contexts", - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = await self._client.get( + f"{self._url}/contexts", + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = await aextract_exception(response) - if err: - raise err + err = await aextract_exception(response) + if err: + raise err - return [Kernel(k["id"], k["name"]) for k in response.json()] + return [Kernel(k["id"], k["name"]) for k in response.json()] + except httpx.TimeoutException: + raise format_request_timeout_error() class AsyncCodeInterpreter(AsyncSandbox): diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 93e76f54..de61b0f4 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,4 +1,5 @@ import logging +import httpx from typing import Optional, Dict, List from httpx import HTTPTransport, Client @@ -18,6 +19,10 @@ OutputHandler, OutputMessage, ) +from e2b_code_interpreter.exceptions import ( + format_execution_timeout_error, + format_request_timeout_error, +) logger = logging.getLogger(__name__) @@ -55,31 +60,36 @@ def exec_cell( timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout - with self._client.stream( - "POST", - f"{self._url}/execute", - json={ - "code": code, - "context_id": kernel_id, - }, - timeout=(request_timeout, timeout, request_timeout, request_timeout), - ) as response: - err = extract_exception(response) - if err: - raise err - - execution = Execution() - - for line in response.iter_lines(): - parse_output( - execution, - line, - on_stdout=on_stdout, - on_stderr=on_stderr, - on_result=on_result, - ) - - return execution + try: + with self._client.stream( + "POST", + f"{self._url}/execute", + json={ + "code": code, + "context_id": kernel_id, + }, + timeout=(request_timeout, timeout, request_timeout, request_timeout), + ) as response: + err = extract_exception(response) + if err: + raise err + + execution = Execution() + + for line in response.iter_lines(): + parse_output( + execution, + line, + on_stdout=on_stdout, + on_stderr=on_stderr, + on_result=on_result, + ) + + return execution + except httpx.ReadTimeout: + raise format_execution_timeout_error() + except httpx.TimeoutException: + raise format_request_timeout_error() def create_kernel( self, @@ -91,22 +101,25 @@ def create_kernel( data = {} if kernel_name: - data['name'] = kernel_name + data["name"] = kernel_name if cwd: - data['cwd'] = cwd + data["cwd"] = cwd - response = self._client.post( - f"{self._url}/contexts", - json=data, - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = self._client.post( + f"{self._url}/contexts", + json=data, + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = extract_exception(response) - if err: - raise err + err = extract_exception(response) + if err: + raise err - data = response.json() - return data["id"] + data = response.json() + return data["id"] + except httpx.TimeoutException: + raise format_request_timeout_error() def shutdown_kernel( self, @@ -116,14 +129,17 @@ def shutdown_kernel( logger.debug(f"Shutting down a kernel with id {kernel_id}") kernel_id = kernel_id or DEFAULT_KERNEL_ID - response = self._client.delete( - url=f"{self._url}/contexts/{kernel_id}", - timeout=request_timeout or self._connection_config.request_timeout, - ) - err = extract_exception(response) - if err: - raise err + try: + response = self._client.delete( + url=f"{self._url}/contexts/{kernel_id}", + timeout=request_timeout or self._connection_config.request_timeout, + ) + err = extract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() def restart_kernel( self, @@ -133,38 +149,35 @@ def restart_kernel( logger.debug(f"Creating new kernel for language: {kernel_id}") kernel_id = kernel_id or DEFAULT_KERNEL_ID - response = self._client.post( - f"{self._url}/contexts/{kernel_id}/restart", - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = self._client.post( + f"{self._url}/contexts/{kernel_id}/restart", + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = extract_exception(response) - if err: - raise err + err = extract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() def list_kernels( self, request_timeout: Optional[float] = None, ) -> List[Kernel]: - """ - Lists all available Jupyter kernels. - - This method fetches a list of all currently available Jupyter kernels from the server. It can be used - to retrieve the IDs of all kernels that are currently running or available for connection. - - :param timeout: The timeout for the kernel list request. - :return: List of kernel ids - """ - response = self._client.get( - f"{self._url}/contexts", - timeout=request_timeout or self._connection_config.request_timeout, - ) + try: + response = self._client.get( + f"{self._url}/contexts", + timeout=request_timeout or self._connection_config.request_timeout, + ) - err = extract_exception(response) - if err: - raise err + err = extract_exception(response) + if err: + raise err - return [Kernel(kernel_id=k["id"], name=k["name"]) for k in response.json()] + return [Kernel(kernel_id=k["id"], name=k["name"]) for k in response.json()] + except httpx.TimeoutException: + raise format_request_timeout_error() class CodeInterpreter(Sandbox): diff --git a/python/e2b_code_interpreter/exceptions.py b/python/e2b_code_interpreter/exceptions.py new file mode 100644 index 00000000..8d4da0d6 --- /dev/null +++ b/python/e2b_code_interpreter/exceptions.py @@ -0,0 +1,13 @@ +from e2b import TimeoutException + + +def format_request_timeout_error() -> Exception: + return TimeoutException( + f"Request timed out — the 'request_timeout' option can be used to increase this timeout", + ) + + +def format_execution_timeout_error() -> Exception: + return TimeoutException( + f"Execution timed out — the 'timeout' option can be used to increase this timeout", + ) From 0885139de22f9d7d42e018367a92117c71192cd4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 17 Jul 2024 13:29:45 +0000 Subject: [PATCH 185/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 75b3375a..4e52cf66 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.15", + "version": "0.0.9-beta.16", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 65c8ed31..be8b90b2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a15" +version = "0.0.11a16" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From d6b33829399a537bd5bed8146c97f58279d4d5a8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 22 Jul 2024 10:35:00 +0200 Subject: [PATCH 186/722] Update `e2b` package --- python/poetry.lock | 10 +++++----- python/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 929a79ba..ac3b0f2a 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "anyio" @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a32" +version = "0.17.2a34" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a32-py3-none-any.whl", hash = "sha256:4618bb4348063c595277f7eef2d0dc532c96ae9bbbbf424ea97d3af697eddc7e"}, - {file = "e2b-0.17.2a32.tar.gz", hash = "sha256:e205a95de05870c3dc57be55d8ba810f001a905a0e829ad51f097da249569021"}, + {file = "e2b-0.17.2a34-py3-none-any.whl", hash = "sha256:604e5ed6a0af2ee970b98b3806f2ff09b5f46226c70a0334c364d016f8de7201"}, + {file = "e2b-0.17.2a34.tar.gz", hash = "sha256:8c310878ef989682da479d894c83470f78f42712b9fcbad7445e256e8e09700e"}, ] [package.dependencies] @@ -482,4 +482,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "ef4bdd0d507a42c1999292f31110ca2a6141b9617a38bfe594bbc104ba558e6e" +content-hash = "bca1d0a510cc27b58ad41a71e33a2f18d39f3ff28357ce57e74ac2f6f289bc98" diff --git a/python/pyproject.toml b/python/pyproject.toml index be8b90b2..0e84140d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "0.17.2a32" +e2b = "0.17.2a34" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From e8cdeef609fa9b880eb6db7c51098bc8386cd3ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jul 2024 08:35:54 +0000 Subject: [PATCH 187/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 4e52cf66..be94bf93 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.16", + "version": "0.0.9-beta.17", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 0e84140d..b96ae898 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a16" +version = "0.0.11a17" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From a69b7b6552d15ad6ae2d3bd06eef6d3b3fb2dfb8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 22 Jul 2024 16:23:20 +0200 Subject: [PATCH 188/722] Rename `sandboxID` to `sandboxId` --- js/example.mts | 2 +- js/package.json | 2 +- js/tests/reconnect.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/example.mts b/js/example.mts index c82fc0eb..4afc07d0 100644 --- a/js/example.mts +++ b/js/example.mts @@ -24,7 +24,7 @@ pandas.DataFrame({"a": [1, 2, 3]}) ` const sandbox = await CodeInterpreter.connect("", { debug: true }) -console.log(sandbox.sandboxID) +console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { onStdout(msg) { diff --git a/js/package.json b/js/package.json index be94bf93..96a6353d 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.25" + "e2b": "0.16.2-beta.27" }, "engines": { "node": ">=18" diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index 96bae01a..bd0e07dd 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -4,7 +4,7 @@ import { CodeInterpreter } from '../src' import { sandboxTest } from './setup' sandboxTest('reconnect', async ({ sandbox }) => { - sandbox = await CodeInterpreter.connect(sandbox.sandboxID) + sandbox = await CodeInterpreter.connect(sandbox.sandboxId) const result = await sandbox.notebook.execCell('x =1; x') From e42cf722127d9e3e2ff5a438ed80363bd37e6a12 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Mon, 22 Jul 2024 16:57:09 +0200 Subject: [PATCH 189/722] Update core SDK --- js/example.mts | 2 +- js/package.json | 2 +- js/tests/reconnect.test.ts | 2 +- pnpm-lock.yaml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/js/example.mts b/js/example.mts index c82fc0eb..4afc07d0 100644 --- a/js/example.mts +++ b/js/example.mts @@ -24,7 +24,7 @@ pandas.DataFrame({"a": [1, 2, 3]}) ` const sandbox = await CodeInterpreter.connect("", { debug: true }) -console.log(sandbox.sandboxID) +console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { onStdout(msg) { diff --git a/js/package.json b/js/package.json index be94bf93..96a6353d 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.25" + "e2b": "0.16.2-beta.27" }, "engines": { "node": ">=18" diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index 96bae01a..bd0e07dd 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -4,7 +4,7 @@ import { CodeInterpreter } from '../src' import { sandboxTest } from './setup' sandboxTest('reconnect', async ({ sandbox }) => { - sandbox = await CodeInterpreter.connect(sandbox.sandboxID) + sandbox = await CodeInterpreter.connect(sandbox.sandboxId) const result = await sandbox.notebook.execCell('x =1; x') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d74638d8..e263c84f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.25 - version: 0.16.2-beta.25 + specifier: 0.16.2-beta.27 + version: 0.16.2-beta.27 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.25: - resolution: {integrity: sha512-v0MmVDOo5Ti6itKY9ggLfTdyrzOY+ApO/lr28j3H6Z8hX4QsYkABDH3Hd2Xpgjr08MUd6T3yWdOfjl+pRZzLug==} + e2b@0.16.2-beta.27: + resolution: {integrity: sha512-Aiy622hu3XtKfVJuiSUMAvY5uWnCRRT6o9lnbjJg71PTyMHjYQg0Gz+Qs16fDYsM/OlGCrEzU6PEqqcjaO05YA==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -3943,7 +3943,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.25: + e2b@0.16.2-beta.27: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) From a26888723a03b960b8288d94d0bca62b32bdb91b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jul 2024 14:57:58 +0000 Subject: [PATCH 190/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 96a6353d..6bf6e075 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.17", + "version": "0.0.9-beta.18", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index b96ae898..96ba2d57 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a17" +version = "0.0.11a18" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 579775c8c2d1b2d4394f6a16d29c1d55702973c1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 22 Jul 2024 17:24:45 +0200 Subject: [PATCH 191/722] Remove unused argument --- python/e2b_code_interpreter/code_interpreter_sync.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index de61b0f4..c3b7893b 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -48,14 +48,13 @@ def exec_cell( self, code: str, kernel_id: Optional[str] = None, - language: Optional[str] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, ) -> Execution: - logger.debug(f"Executing code {code} for language {language}") + logger.debug(f"Executing code {code}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) request_timeout = request_timeout or self._connection_config.request_timeout From 0159d95d3e230a9eed8bf2ac5fd49adc7b01b4b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jul 2024 15:26:47 +0000 Subject: [PATCH 192/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 6bf6e075..b1f72301 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.18", + "version": "0.0.9-beta.19", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 96ba2d57..2960d544 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a18" +version = "0.0.11a19" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 18bc1e669f1daf87482365c0b4b474a2d92dcde7 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Mon, 22 Jul 2024 23:29:21 +0200 Subject: [PATCH 193/722] Update Core SDKs --- js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 11 ++++++----- python/pyproject.toml | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/js/package.json b/js/package.json index 96a6353d..13a5848f 100644 --- a/js/package.json +++ b/js/package.json @@ -61,7 +61,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.27" + "e2b": "0.16.2-beta.29" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e263c84f..638ebf6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.27 - version: 0.16.2-beta.27 + specifier: 0.16.2-beta.29 + version: 0.16.2-beta.29 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.27: - resolution: {integrity: sha512-Aiy622hu3XtKfVJuiSUMAvY5uWnCRRT6o9lnbjJg71PTyMHjYQg0Gz+Qs16fDYsM/OlGCrEzU6PEqqcjaO05YA==} + e2b@0.16.2-beta.29: + resolution: {integrity: sha512-h7TEGe26yaaVXzd2aFPkBQ1f6d4678bmftzheidTALuD/pqaIqOmQ1kHvsW6yxrf3hVyBcHizyhAEOtRsBoSIg==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -3943,7 +3943,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.27: + e2b@0.16.2-beta.29: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) diff --git a/python/poetry.lock b/python/poetry.lock index ac3b0f2a..7e88b91b 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "anyio" @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a34" +version = "0.17.2a37" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a34-py3-none-any.whl", hash = "sha256:604e5ed6a0af2ee970b98b3806f2ff09b5f46226c70a0334c364d016f8de7201"}, - {file = "e2b-0.17.2a34.tar.gz", hash = "sha256:8c310878ef989682da479d894c83470f78f42712b9fcbad7445e256e8e09700e"}, + {file = "e2b-0.17.2a37-py3-none-any.whl", hash = "sha256:102933071b67b6b03b8dd596258da0a23d903cc0d1edeef9f43fb515bf4670f7"}, + {file = "e2b-0.17.2a37.tar.gz", hash = "sha256:442cae37f3c23e7b499f9c61f77849d9c459d2d90ecfedb8a92b8d23d643eea9"}, ] [package.dependencies] @@ -141,6 +141,7 @@ httpx = ">=0.27.0,<0.28.0" packaging = ">=24.1,<25.0" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" +typing-extensions = ">=4.12.2,<5.0.0" [[package]] name = "exceptiongroup" @@ -482,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "bca1d0a510cc27b58ad41a71e33a2f18d39f3ff28357ce57e74ac2f6f289bc98" +content-hash = "5f1acf187664d2a2b86e62db41913486459a790a7145566ec8b59a9deccae996" diff --git a/python/pyproject.toml b/python/pyproject.toml index b96ae898..f109878f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "0.17.2a34" +e2b = "0.17.2a37" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 74e4ac96843c9cffae5ebe43b23d41c9a816b2f6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jul 2024 21:31:00 +0000 Subject: [PATCH 194/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index bccb9b97..58265588 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.19", + "version": "0.0.9-beta.20", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 1b172611..028331c0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a19" +version = "0.0.11a20" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 4075731f2afa8cadbfb81b30f3fe48516aa2dc76 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Mon, 22 Jul 2024 23:40:14 +0200 Subject: [PATCH 195/722] Fix passing parameters --- python/e2b_code_interpreter/code_interpreter_async.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 28a59af2..8514d136 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -191,7 +191,7 @@ def notebook(self) -> JupyterExtension: return self._notebook def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): - super().__init__(sandbox_id, connection_config) + super().__init__(sandbox_id=sandbox_id, connection_config=connection_config) jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" From 27a99decc43befbf19b9798f0018b506731d59f7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jul 2024 21:41:12 +0000 Subject: [PATCH 196/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 58265588..310ee603 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.20", + "version": "0.0.9-beta.21", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 028331c0..dcaebd41 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a20" +version = "0.0.11a21" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 2a190bc57d9bef0cc7737964e985e723aa909e6c Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 23 Jul 2024 16:57:42 +0200 Subject: [PATCH 197/722] Add deno tests --- .github/workflows/js_tests.yml | 25 ++++++++++++++++++++++--- js/.gitignore | 1 + js/package.json | 8 +++++--- js/tests/runtimes/bun/run.test.ts | 13 +++++++++++++ js/tests/runtimes/deno/run.test.ts | 17 +++++++++++++++++ js/vitest.config.ts | 6 ++++++ pnpm-lock.yaml | 10 +++++----- 7 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 js/.gitignore create mode 100644 js/tests/runtimes/bun/run.test.ts create mode 100644 js/tests/runtimes/deno/run.test.ts diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 3fea1df9..627fa640 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -10,7 +10,7 @@ permissions: contents: read jobs: - publish: + test: defaults: run: working-directory: ./js @@ -45,7 +45,26 @@ jobs: - name: Test build run: pnpm build - - name: Run node tests - run: pnpm run test + - name: Run Node tests + run: pnpm test env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Run Bun tests + run: pnpm test:bun + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + + - name: Install Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Run Deno tests + run: pnpm test:deno + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + \ No newline at end of file diff --git a/js/.gitignore b/js/.gitignore new file mode 100644 index 00000000..fff3a34c --- /dev/null +++ b/js/.gitignore @@ -0,0 +1 @@ +deno.lock diff --git a/js/package.json b/js/package.json index 58265588..fccaa99e 100644 --- a/js/package.json +++ b/js/package.json @@ -30,7 +30,9 @@ "test:coverage": "vitest run --coverage", "check-deps": "knip", "update-deps": "ncu -u && pnpm i", - "example": "npx tsx example.mts" + "example": "npx tsx example.mts", + "test:bun": "bun test tests/runtimes/bun --env-file=.env", + "test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks" }, "devDependencies": { "@types/node": "^18.18.6", @@ -61,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.29" + "e2b": "0.16.2-beta.33" }, "engines": { "node": ">=18" @@ -69,4 +71,4 @@ "browserslist": [ "defaults" ] -} +} \ No newline at end of file diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts new file mode 100644 index 00000000..ce76dff0 --- /dev/null +++ b/js/tests/runtimes/bun/run.test.ts @@ -0,0 +1,13 @@ +import { expect, test } from 'bun:test' + +import { CodeInterpreter } from '../../../src' + +test('Bun test', async () => { + const sbx = await CodeInterpreter.create({ timeoutMs: 5_000 }) + try { + const result = await sbx.notebook.execCell('print("Hello, World!")') + expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') + } finally { + await sbx.kill() + } +}) diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts new file mode 100644 index 00000000..d885d5ba --- /dev/null +++ b/js/tests/runtimes/deno/run.test.ts @@ -0,0 +1,17 @@ +import { assertEquals } from 'https://deno.land/std@0.224.0/assert/mod.ts' +import { load } from 'https://deno.land/std@0.224.0/dotenv/mod.ts' + +await load({ envPath: '.env', export: true }) + +import { CodeInterpreter } from '../../../dist/index.mjs' + + +Deno.test('Deno test', async () => { + const sbx = await CodeInterpreter.create({ timeoutMs: 5_000 }) + try { + const result = await sbx.notebook.execCell('print("Hello, World!")') + assertEquals(result.logs.stdout.join(''), 'Hello, World!\n') + } finally { + await sbx.kill() + } +}) diff --git a/js/vitest.config.ts b/js/vitest.config.ts index b2d31c56..3d05b84e 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -11,6 +11,12 @@ export default defineConfig({ maxThreads: 4, }, }, + include: [ + 'tests/**/*.test.ts', + ], + exclude: [ + 'tests/runtimes/**', + ], globals: false, testTimeout: 20000, environment: 'node', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 638ebf6c..649afb01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.29 - version: 0.16.2-beta.29 + specifier: 0.16.2-beta.33 + version: 0.16.2-beta.33 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.29: - resolution: {integrity: sha512-h7TEGe26yaaVXzd2aFPkBQ1f6d4678bmftzheidTALuD/pqaIqOmQ1kHvsW6yxrf3hVyBcHizyhAEOtRsBoSIg==} + e2b@0.16.2-beta.33: + resolution: {integrity: sha512-YG1/rK218vgZxbY0YeIYnQZMTgYrGQ076cej7JY0mtUgzcIuuDXxI15t2W7Da+rjCsOLGovm3xMEh2A5fNHEhg==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -3943,7 +3943,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.29: + e2b@0.16.2-beta.33: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) From 78d8c6dbbbaea752c8a8d72c0f342fb2a424bfd3 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 23 Jul 2024 16:57:53 +0200 Subject: [PATCH 198/722] Enable CI/CD test --- .github/workflows/release_candidates.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 672b8426..7e36915e 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -7,6 +7,11 @@ permissions: contents: write jobs: + js-tests: + name: JS SDK Tests + uses: ./.github/workflows/js_tests.yml + secrets: inherit + release: name: Release Candidate runs-on: ubuntu-latest From b5655d7c13ce4b421d32816dab9720c4ebede6a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jul 2024 14:58:47 +0000 Subject: [PATCH 199/722] [skip ci] Release new versions --- js/package.json | 4 ++-- python/pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/package.json b/js/package.json index d17e067c..73295ed0 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.21", + "version": "0.0.9-beta.22", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -71,4 +71,4 @@ "browserslist": [ "defaults" ] -} \ No newline at end of file +} diff --git a/python/pyproject.toml b/python/pyproject.toml index dcaebd41..7672af90 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a21" +version = "0.0.11a22" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 58a9c79c8e7b2220875a8ddd98ea85f85c6626a6 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 23 Jul 2024 17:01:50 +0200 Subject: [PATCH 200/722] Revert "Enable CI/CD test" This reverts commit 78d8c6dbbbaea752c8a8d72c0f342fb2a424bfd3. --- .github/workflows/release_candidates.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 7e36915e..672b8426 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -7,11 +7,6 @@ permissions: contents: write jobs: - js-tests: - name: JS SDK Tests - uses: ./.github/workflows/js_tests.yml - secrets: inherit - release: name: Release Candidate runs-on: ubuntu-latest From 238ab5442aafd88eb0f9c51ea97481da8aaf382d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jul 2024 15:02:40 +0000 Subject: [PATCH 201/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 73295ed0..42b8b851 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.22", + "version": "0.0.9-beta.23", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 7672af90..5ff5f85c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a22" +version = "0.0.11a23" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 23e1d4866ed87dd02123763226b1d1e2502cce84 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 24 Jul 2024 20:44:33 +0200 Subject: [PATCH 202/722] Prevent overriding cd docker image --- .github/workflows/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 1efbc57f..1bbadba2 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -6,7 +6,7 @@ on: - 'template/**' - '.github/workflows/template.yml' branches: - - main + - beta permissions: contents: read From 4e3626f849d7e7204e65bbc8f35a7c8801dd9354 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 24 Jul 2024 20:48:53 +0200 Subject: [PATCH 203/722] Remove arm template build --- .github/workflows/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 1bbadba2..a18b9fdf 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -37,7 +37,7 @@ jobs: docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true docker buildx build \ --file e2b.Dockerfile \ - --platform linux/amd64,linux/arm64 \ + --platform linux/amd64 \ --push \ --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . From cf185835f6f4dfa37cdb51cde9498024e95b5c85 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 24 Jul 2024 18:51:27 +0000 Subject: [PATCH 204/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 42b8b851..5b23ed39 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.23", + "version": "0.0.9-beta.24", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 5ff5f85c..e48383d5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a23" +version = "0.0.11a24" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 2ea2770e8db8c931d9bc3267bb2bda3aac7ba241 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 31 Jul 2024 14:15:48 +0200 Subject: [PATCH 205/722] Fix string method on server for result --- template/server/api/models/result.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 836bc30b..ec85d587 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, Iterable from pydantic import BaseModel from api.models.output import OutputType @@ -53,13 +53,29 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.javascript = data.pop("application/javascript", None) self.extra = data - def __str__(self) -> Optional[str]: + def formats(self) -> Iterable[str]: + formats = [] + + for key in ["text", "html", "markdown", "svg", "png", "jpeg", "pdf", "latex", "json", "javascript"]: + if getattr(self, key): + formats.append(key) + + if self.extra: + for key in self.extra: + formats.append(key) + + return formats + + def __str__(self) -> str: """ Returns the text representation of the data. :return: The text representation of the data. """ - return self.text + return self.__repr__() def __repr__(self) -> str: - return f"Result({self.text})" + if self.text: + return f"Result({self.text})" + formats = self.formats() + return f"Result with formats: {formats}" From 195d001de5c5d7e824b3f806d4d13c5ac967f74d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 31 Jul 2024 12:16:39 +0000 Subject: [PATCH 206/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 5b23ed39..8ee4bfc0 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.24", + "version": "0.0.9-beta.25", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index e48383d5..dbac8e1b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a24" +version = "0.0.11a25" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5f36bd0453bf77a446006e83ccdb8d258f875079 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 1 Aug 2024 11:19:17 +0200 Subject: [PATCH 207/722] Fix string method --- python/e2b_code_interpreter/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 4b0ecb05..89b0c196 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -133,10 +133,11 @@ def __str__(self) -> Optional[str]: :return: The text representation of the data. """ - return self.text + return self.__repr__() def __repr__(self) -> str: - return f"Result({self.text})" + text = self.text or ",".join(self.formats()) + return f"Result({text})" def _repr_html_(self) -> Optional[str]: """ From 5eff3510ffae9be2fc0dad306ca48455943009b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Aug 2024 09:20:09 +0000 Subject: [PATCH 208/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 8ee4bfc0..9ebbb98f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.25", + "version": "0.0.9-beta.26", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index dbac8e1b..769ce4d8 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a25" +version = "0.0.11a26" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e8bc4c45882e10ec7140d11448c179a35b13db7d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 1 Aug 2024 11:21:49 +0200 Subject: [PATCH 209/722] Fix string method --- python/e2b_code_interpreter/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 89b0c196..a759b7d0 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -136,8 +136,10 @@ def __str__(self) -> Optional[str]: return self.__repr__() def __repr__(self) -> str: - text = self.text or ",".join(self.formats()) - return f"Result({text})" + if self.text: + return f"Result({self.text})" + else: + return "Result(Formats: " + ", ".join(self.formats()) + ")" def _repr_html_(self) -> Optional[str]: """ From 96a2729881cabd75ebb206bc504f78ee80943d5c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Aug 2024 09:23:09 +0000 Subject: [PATCH 210/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 9ebbb98f..f739e1df 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.26", + "version": "0.0.9-beta.27", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 769ce4d8..7dc5b027 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a26" +version = "0.0.11a27" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From a1c31368b14b3c34c40d14b89dacce159a19d051 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 1 Aug 2024 13:36:22 +0200 Subject: [PATCH 211/722] Add handling of unexpected closure --- template/server/api/models/output.py | 5 +++++ template/server/messaging.py | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/template/server/api/models/output.py b/template/server/api/models/output.py index 8d7620fd..8e620c38 100644 --- a/template/server/api/models/output.py +++ b/template/server/api/models/output.py @@ -15,12 +15,17 @@ class OutputType(Enum): ERROR = "error" NUMBER_OF_EXECUTIONS = "number_of_executions" END_OF_EXECUTION = "end_of_execution" + UNEXPECTED_END_OF_EXECUTION = "unexpected_end_of_execution" class EndOfExecution(BaseModel): type: OutputType = OutputType.END_OF_EXECUTION +class UnexpectedEndOfExecution(BaseModel): + type: OutputType = OutputType.UNEXPECTED_END_OF_EXECUTION + + class NumberOfExecutions(BaseModel): type: OutputType = OutputType.NUMBER_OF_EXECUTIONS execution_count: int diff --git a/template/server/messaging.py b/template/server/messaging.py index 2a509b43..a03477f5 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -15,8 +15,7 @@ from api.models.error import Error from api.models.logs import Stdout, Stderr from api.models.result import Result -from api.models.output import EndOfExecution, NumberOfExecutions, OutputType - +from api.models.output import EndOfExecution, NumberOfExecutions, OutputType, UnexpectedEndOfExecution logger = logging.getLogger(__name__) @@ -31,6 +30,7 @@ def __init__(self): Stderr, EndOfExecution, NumberOfExecutions, + UnexpectedEndOfExecution ] ]() self.input_accepted = False @@ -113,6 +113,15 @@ async def execute(self, code: Union[str, StrictStr]): if output.type == OutputType.END_OF_EXECUTION: break + if output.type == OutputType.UNEXPECTED_END_OF_EXECUTION: + logger.error(f"Unexpected end of execution for code ({message_id})") + yield Error( + name="UnexpectedEndOfExecution", + value="Connection to the execution was closed before the execution was finished", + traceback="", + ) + break + logger.debug(f"Got result for code ({message_id}): {output}") yield output.model_dump(exclude_none=True) @@ -229,4 +238,4 @@ async def close(self): self._receive_task.cancel() for execution in self._executions.values(): - execution.queue.put_nowait(EndOfExecution()) + execution.queue.put_nowait(UnexpectedEndOfExecution()) From 80805d2e1b0627d8f69ae444a2a08b012c59bcef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Aug 2024 11:37:11 +0000 Subject: [PATCH 212/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index f739e1df..d4f829e7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.27", + "version": "0.0.9-beta.28", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 7dc5b027..f0a441af 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a27" +version = "0.0.11a28" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From c2e50645ae8ba4e21c32770cd340a22e5e7502b9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 2 Aug 2024 15:34:55 +0200 Subject: [PATCH 213/722] Change order of languages from the slowest to the fastest to build --- template/e2b.Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index ab2ac9c8..3856852d 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -18,6 +18,11 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user +# R Kernel +RUN apt-get update && apt-get install -y r-base +RUN R -e "install.packages('IRkernel')" +RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" + # Java Kernel RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ unzip ijava-1.3.0.zip && \ @@ -28,11 +33,6 @@ RUN npm install -g node-gyp RUN npm install -g --unsafe-perm ijavascript RUN ijsinstall --install=global -# R Kernel -RUN apt-get update && apt-get install -y r-base -RUN R -e "install.packages('IRkernel')" -RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" - # Bash Kernel RUN pip install bash_kernel RUN python -m bash_kernel.install From d7b51696bc6d1756c5f547ee88abfd74df458384 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Aug 2024 13:36:35 +0000 Subject: [PATCH 214/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index d4f829e7..4c4e3bee 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.28", + "version": "0.0.9-beta.29", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index f0a441af..c4e9c8ce 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a28" +version = "0.0.11a29" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From a9e1639136f2c0e03f9a931a620823bc57480e3f Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Mon, 12 Aug 2024 21:28:34 +0200 Subject: [PATCH 215/722] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68e11b34..7a71ca0f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Follow E2B on [X (Twitter)](https://twitter.com/e2b_dev). ## 💻 Supported language runtimes - ✅ Python -- [(Beta)](https://github.com/e2b-dev/code-interpreter/pull/20) JavaScript, R, Java +- [(Beta)](https://e2b.dev/docs/guide/beta-code-interpreter-language-runtimes) JavaScript, R, Java ## 📖 Documentation - [e2b.dev/docs/code-interpreter](https://e2b.dev/docs/code-interpreter/installation) From 7b9ece5b78c4845bb6ab8a3a0441925a2bbb10a2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 13 Aug 2024 14:27:38 +0200 Subject: [PATCH 216/722] Update `e2b` --- js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 10 +++++----- python/pyproject.toml | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/js/package.json b/js/package.json index 4c4e3bee..0be77f90 100644 --- a/js/package.json +++ b/js/package.json @@ -63,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.33" + "e2b": "0.16.2-beta.35" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 649afb01..914b83c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.33 - version: 0.16.2-beta.33 + specifier: 0.16.2-beta.35 + version: 0.16.2-beta.35 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.33: - resolution: {integrity: sha512-YG1/rK218vgZxbY0YeIYnQZMTgYrGQ076cej7JY0mtUgzcIuuDXxI15t2W7Da+rjCsOLGovm3xMEh2A5fNHEhg==} + e2b@0.16.2-beta.35: + resolution: {integrity: sha512-owt+GXdUliIS6O41QRsDXMyL1hx7MprbP64arxKplGnDNoOD81W8MTkd7/Z61UbSC0q0tLltOU9oatVu24gnww==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -3943,7 +3943,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.33: + e2b@0.16.2-beta.35: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) diff --git a/python/poetry.lock b/python/poetry.lock index 7e88b91b..ad07be89 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "anyio" @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a37" +version = "0.17.2a43" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a37-py3-none-any.whl", hash = "sha256:102933071b67b6b03b8dd596258da0a23d903cc0d1edeef9f43fb515bf4670f7"}, - {file = "e2b-0.17.2a37.tar.gz", hash = "sha256:442cae37f3c23e7b499f9c61f77849d9c459d2d90ecfedb8a92b8d23d643eea9"}, + {file = "e2b-0.17.2a43-py3-none-any.whl", hash = "sha256:7af0c2f1c9df2457e01458a5409973572a92ef8bf94de0ebcb0e038510760cb4"}, + {file = "e2b-0.17.2a43.tar.gz", hash = "sha256:50586fa5171feb6cca51b020ad3b4e0bcba65d0ab8e1a71ce73b1528b37cd5c0"}, ] [package.dependencies] @@ -483,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5f1acf187664d2a2b86e62db41913486459a790a7145566ec8b59a9deccae996" +content-hash = "e51b240c5c43093191f28cab6a23284a8aaa940e359a8de72985428bea67b71f" diff --git a/python/pyproject.toml b/python/pyproject.toml index c4e9c8ce..8c3b8dae 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "0.17.2a37" +e2b = "0.17.2a43" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 8c0e30d6b1656e42e7c2e49d64ef42b5f43d9fd9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 13 Aug 2024 12:28:31 +0000 Subject: [PATCH 217/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 0be77f90..c1c5bbd3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.29", + "version": "0.0.9-beta.30", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 8c3b8dae..d9238b9b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a29" +version = "0.0.11a30" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 17740d7ed46f8fae3b36737629585113d8c90437 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 09:40:15 +0200 Subject: [PATCH 218/722] Ignore warning for overriding json field in server --- template/server/api/models/result.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index ec85d587..ae98630d 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -1,5 +1,6 @@ from __future__ import annotations +import warnings from typing import Optional, Iterable from pydantic import BaseModel @@ -7,6 +8,9 @@ from api.models.output import OutputType +warnings.filterwarnings("ignore", category=UserWarning) + + class Result(BaseModel): """ Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. From 1a4873b1f8137ac9d1818fe37642e0e35a0231bf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 11:15:46 +0200 Subject: [PATCH 219/722] Add env vars handling in template --- template/server/api/models/__init__.py | 0 template/server/api/models/env_vars.py | 4 ++ .../server/api/models/execution_request.py | 3 ++ template/server/main.py | 29 +++++++++---- template/server/messaging.py | 42 ++++++++++++++++--- 5 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 template/server/api/models/__init__.py create mode 100644 template/server/api/models/env_vars.py diff --git a/template/server/api/models/__init__.py b/template/server/api/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/template/server/api/models/env_vars.py b/template/server/api/models/env_vars.py new file mode 100644 index 00000000..7c51bcca --- /dev/null +++ b/template/server/api/models/env_vars.py @@ -0,0 +1,4 @@ +from typing import Dict +from pydantic import StrictStr + +EnvVars = Dict[StrictStr, str] diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index a0243329..595f12f5 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -2,7 +2,10 @@ from pydantic import BaseModel, StrictStr from pydantic import Field +from .env_vars import EnvVars + class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") context_id: Optional[StrictStr] = Field(default="default", description="Context ID") + env_vars: Optional[EnvVars] = Field(description="Environment variables") diff --git a/template/server/main.py b/template/server/main.py index 0c9f9f3f..7b8bee7e 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,9 +1,10 @@ -import asyncio import logging import uuid import httpx from typing import Dict, Union, Literal, List + +import requests from pydantic import StrictStr from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException @@ -21,9 +22,10 @@ http_logger.setLevel(logging.WARNING) -jupyter_base_url = "http://localhost:8888" +JUPYTER_BASE_URL = "http://localhost:8888" +ENVD_PORT = 49983 -websockets: Dict[Union[str, StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} +websockets: Dict[Union[StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} global default_kernel_id global client @@ -72,6 +74,7 @@ async def health(): async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") + global_env_vars: dict = requests.get(f"http://localhost:{ENVD_PORT}/envs").json() if request.context_id: ws = websockets.get(request.context_id) @@ -83,7 +86,17 @@ async def execute(request: ExecutionRequest): else: ws = websockets["default"] - return StreamingListJsonResponse(ws.execute(request.code)) + revert_env_vars = None + env_vars = {**global_env_vars, **(request.env_vars or {})} + if env_vars: + current_env_vars = await ws.get_env_vars() + + env_vars = {**global_env_vars, **current_env_vars, **(request.env_vars or {})} + await ws.set_env_vars(env_vars) + + revert_env_vars = {**global_env_vars, **current_env_vars} + + return StreamingListJsonResponse(ws.execute(request.code, revert_env_vars=revert_env_vars)) @app.post("/contexts") @@ -98,7 +111,7 @@ async def create_context(request: CreateContext) -> Context: } logger.debug(f"Creating new kernel with data: {data}") - response = await client.post(f"{jupyter_base_url}/api/sessions", json=data) + response = await client.post(f"{JUPYTER_BASE_URL}/api/sessions", json=data) if not response.is_success: raise HTTPException( @@ -111,7 +124,7 @@ async def create_context(request: CreateContext) -> Context: kernel_id = session_data["kernel"]["id"] response = await client.patch( - f"{jupyter_base_url}/api/sessions/{session_id}", + f"{JUPYTER_BASE_URL}/api/sessions/{session_id}", json={"path": request.cwd}, ) if not response.is_success: @@ -167,7 +180,7 @@ async def restart_context(context_id: str) -> None: await ws.close() response = await client.post( - f"{jupyter_base_url}/api/kernels/{ws.kernel_id}/restart" + f"{JUPYTER_BASE_URL}/api/kernels/{ws.kernel_id}/restart" ) if not response.is_success: raise HTTPException( @@ -203,7 +216,7 @@ async def remove_context(context_id: str) -> None: except: pass - response = await client.delete(f"{jupyter_base_url}/api/kernels/{ws.kernel_id}") + response = await client.delete(f"{JUPYTER_BASE_URL}/api/kernels/{ws.kernel_id}") if not response.is_success: raise HTTPException( status_code=500, diff --git a/template/server/messaging.py b/template/server/messaging.py index a03477f5..ffabc9c3 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -21,7 +21,7 @@ class Execution: - def __init__(self): + def __init__(self, in_background: bool = False): self.queue = Queue[ Union[ Result, @@ -34,6 +34,7 @@ def __init__(self): ] ]() self.input_accepted = False + self.in_background = in_background class JupyterKernelWebSocket: @@ -73,7 +74,7 @@ async def connect(self): name="receive_message", ) - def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: + def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr], background: bool) -> str: return json.dumps( { "header": { @@ -87,7 +88,7 @@ def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: "metadata": {}, "content": { "code": code, - "silent": False, + "silent": background, "store_history": True, "user_expressions": {}, "allow_stdin": False, @@ -95,12 +96,12 @@ def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr]) -> str: } ) - async def execute(self, code: Union[str, StrictStr]): + async def execute(self, code: Union[str, StrictStr], background: bool = False, revert_env_vars: Dict[StrictStr, str] = None): message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") - self._executions[message_id] = Execution() - request = self._get_execute_request(message_id, code) + self._executions[message_id] = Execution(in_background=background) + request = self._get_execute_request(message_id, code, background) if self._ws is None: raise Exception("WebSocket not connected") @@ -125,8 +126,33 @@ async def execute(self, code: Union[str, StrictStr]): logger.debug(f"Got result for code ({message_id}): {output}") yield output.model_dump(exclude_none=True) + if revert_env_vars: + code = "%reset" + code += "\n" + "\n".join([f"%set_env {key} {value}" for key, value in revert_env_vars.items()]) + async for _ in self.execute(code): + pass + del self._executions[message_id] + async def set_env_vars(self, env_vars: Dict[StrictStr, str]): + code = "\n".join([f"%set_env {key} {value}" for key, value in env_vars.items()]) + async for _ in self.execute(code): + pass + + async def get_env_vars(self) -> Dict[StrictStr, str]: + env_vars = {} + async for output in self.execute("%env"): + if output['type'] == OutputType.RESULT: + env_vars = json.loads(output['text'].replace("'", '"')) + + for key in env_vars: + if any(s in key.lower() for s in ('key', 'token', 'secret')): + async for output in self.execute(f"%env {key}"): + if output['type'] == OutputType.RESULT: + env_vars[key] = output['text'].replace("'", '') + + return env_vars + async def _receive_message(self): if not self._ws: logger.error("No WebSocket connection") @@ -191,6 +217,10 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "execute_result": await queue.put(Result(is_main_result=True, data=data["content"]["data"])) elif data["msg_type"] == "status": + if data["content"]["execution_state"] == "busy" and execution.in_background: + logger.debug(f"Cell {parent_msg_ig} started execution") + execution.input_accepted = True + if data["content"]["execution_state"] == "idle": if execution.input_accepted: logger.debug(f"Cell {parent_msg_ig} finished execution") From edca945dcc3a88a8b6a76c0586c17b5cfe55df28 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 11:19:30 +0200 Subject: [PATCH 220/722] Strip the extra `'` --- template/server/api/models/result.py | 3 +++ template/server/messaging.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index ae98630d..118d563d 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -46,6 +46,9 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.is_main_result = is_main_result self.text = data.pop("text/plain", None) + if self.text.startswith("'") and self.text.endswith("'"): + self.text = self.text[1:-1] + self.html = data.pop("text/html", None) self.markdown = data.pop("text/markdown", None) self.svg = data.pop("image/svg+xml", None) diff --git a/template/server/messaging.py b/template/server/messaging.py index ffabc9c3..44760538 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -149,7 +149,7 @@ async def get_env_vars(self) -> Dict[StrictStr, str]: if any(s in key.lower() for s in ('key', 'token', 'secret')): async for output in self.execute(f"%env {key}"): if output['type'] == OutputType.RESULT: - env_vars[key] = output['text'].replace("'", '') + env_vars[key] = output['text'] return env_vars From 18d2e20df3c2524a3936f6ae12cc38d1b7d64d0a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 11:35:40 +0200 Subject: [PATCH 221/722] Add env variables to Python SDK --- .../code_interpreter_async.py | 16 ++-- .../code_interpreter_sync.py | 18 ++-- python/poetry.lock | 90 +++++++++---------- python/pyproject.toml | 2 +- python/tests/async/test_async_env_vars.py | 32 +++++++ python/tests/sync/test_env_vars.py | 16 ++++ 6 files changed, 118 insertions(+), 56 deletions(-) create mode 100644 python/tests/async/test_async_env_vars.py create mode 100644 python/tests/sync/test_env_vars.py diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 8514d136..de7985ec 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, List +from typing import Optional, List, Dict from httpx import AsyncHTTPTransport, AsyncClient from e2b import AsyncSandbox, ConnectionConfig @@ -52,6 +52,7 @@ async def exec_cell( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, ) -> Execution: @@ -67,6 +68,7 @@ async def exec_cell( json={ "code": code, "context_id": kernel_id, + "env_vars": envs, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -97,14 +99,17 @@ async def create_kernel( cwd: Optional[str] = None, kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, + envs: Optional[Dict[str, str]] = None, ) -> str: - logger.debug(f"Creating new kernel: {kernel_name}") + logger.debug(f"Creating new kernel {kernel_name}") data = {} if kernel_name: data["name"] = kernel_name if cwd: data["cwd"] = cwd + if envs: + data["env_vars"] = envs try: response = await self._client.post( @@ -127,9 +132,10 @@ async def shutdown_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: + kernel_id = kernel_id or DEFAULT_KERNEL_ID + logger.debug(f"Shutting down a kernel with id {kernel_id}") - kernel_id = kernel_id or DEFAULT_KERNEL_ID try: response = await self._client.delete( url=f"{self._url}/contexts/{kernel_id}", @@ -147,10 +153,10 @@ async def restart_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Restarting kernel: {kernel_id}") - kernel_id = kernel_id or DEFAULT_KERNEL_ID + logger.debug(f"Restarting kernel {kernel_id}") + try: response = await self._client.post( f"{self._url}/contexts/{kernel_id}/restart", diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index c3b7893b..b5d3b6a7 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -51,6 +51,7 @@ def exec_cell( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, ) -> Execution: @@ -66,6 +67,7 @@ def exec_cell( json={ "code": code, "context_id": kernel_id, + "env_vars": envs, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -96,7 +98,7 @@ def create_kernel( kernel_name: Optional[str] = None, request_timeout: Optional[float] = None, ) -> str: - logger.debug(f"Creating new kernel: {kernel_name}") + logger.debug(f"Creating new kernel {kernel_name}") data = {} if kernel_name: @@ -125,10 +127,10 @@ def shutdown_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Shutting down a kernel with id {kernel_id}") - kernel_id = kernel_id or DEFAULT_KERNEL_ID + logger.debug(f"Shutting down a kernel with id {kernel_id}") + try: response = self._client.delete( url=f"{self._url}/contexts/{kernel_id}", @@ -145,9 +147,10 @@ def restart_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: - logger.debug(f"Creating new kernel for language: {kernel_id}") - kernel_id = kernel_id or DEFAULT_KERNEL_ID + + logger.debug(f"Restarting kernel {kernel_id}") + try: response = self._client.post( f"{self._url}/contexts/{kernel_id}/restart", @@ -164,6 +167,8 @@ def list_kernels( self, request_timeout: Optional[float] = None, ) -> List[Kernel]: + logger.debug("Listing kernels") + try: response = self._client.get( f"{self._url}/contexts", @@ -192,6 +197,7 @@ def __init__( template: Optional[str] = None, timeout: Optional[int] = None, metadata: Optional[Dict[str, str]] = None, + envs: Optional[Dict[str, str]] = None, api_key: Optional[str] = None, domain: Optional[str] = None, debug: Optional[bool] = None, @@ -202,6 +208,7 @@ def __init__( template=template, timeout=timeout, metadata=metadata, + envs=envs, api_key=api_key, domain=domain, debug=debug, @@ -214,4 +221,5 @@ def __init__( jupyter_url, self._transport, self.connection_config, + envs, ) diff --git a/python/poetry.lock b/python/poetry.lock index ad07be89..c5fd6e8e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -43,33 +43,33 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "black" -version = "24.4.2" +version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a43" +version = "0.17.2a44" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a43-py3-none-any.whl", hash = "sha256:7af0c2f1c9df2457e01458a5409973572a92ef8bf94de0ebcb0e038510760cb4"}, - {file = "e2b-0.17.2a43.tar.gz", hash = "sha256:50586fa5171feb6cca51b020ad3b4e0bcba65d0ab8e1a71ce73b1528b37cd5c0"}, + {file = "e2b-0.17.2a44-py3-none-any.whl", hash = "sha256:c5477391dde6693e0e65bb510b0fae3967a2915387b7e79a27d3e7ea0d7b4e61"}, + {file = "e2b-0.17.2a44.tar.gz", hash = "sha256:0218a62687a01aec96df1421638b107f2348c50e286f336eb609e2dc99b2866e"}, ] [package.dependencies] @@ -145,13 +145,13 @@ typing-extensions = ">=4.12.2,<5.0.0" [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -315,22 +315,22 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.27.2" +version = "5.27.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.2-cp310-abi3-win32.whl", hash = "sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38"}, - {file = "protobuf-5.27.2-cp310-abi3-win_amd64.whl", hash = "sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505"}, - {file = "protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5"}, - {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b"}, - {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e"}, - {file = "protobuf-5.27.2-cp38-cp38-win32.whl", hash = "sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863"}, - {file = "protobuf-5.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6"}, - {file = "protobuf-5.27.2-cp39-cp39-win32.whl", hash = "sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca"}, - {file = "protobuf-5.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce"}, - {file = "protobuf-5.27.2-py3-none-any.whl", hash = "sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470"}, - {file = "protobuf-5.27.2.tar.gz", hash = "sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714"}, + {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, + {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, + {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, + {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, + {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, + {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, + {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, + {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, + {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, ] [[package]] @@ -357,13 +357,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-asyncio" -version = "0.23.7" +version = "0.23.8" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, - {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, + {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, + {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, ] [package.dependencies] @@ -483,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e51b240c5c43093191f28cab6a23284a8aaa940e359a8de72985428bea67b71f" +content-hash = "82554d389c2da922d01959e0512d43d5a2756e2fccf1232962f649d6e38590c5" diff --git a/python/pyproject.toml b/python/pyproject.toml index d9238b9b..2f7dc5e5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "0.17.2a43" +e2b = "0.17.2a44" [tool.poetry.group.dev.dependencies] black = "^24.3.0" diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py new file mode 100644 index 00000000..0d607f9b --- /dev/null +++ b/python/tests/async/test_async_env_vars.py @@ -0,0 +1,32 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_env_vars_sandbox(): + sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar"}) + result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") + assert result.text == "bar" + await sbx.kill() + + +async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "bar"}) + assert result.text == "bar" + + +async def test_env_vars_override(): + sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) + await sbx.notebook.exec_cell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) + assert result.text == "baz" + + result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") + assert result.text == "value" + + result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") + assert result.text == "value" + + result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") + assert result.text == "bar" + + await sbx.kill() + diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py new file mode 100644 index 00000000..3d66551e --- /dev/null +++ b/python/tests/sync/test_env_vars.py @@ -0,0 +1,16 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_env_vars(): + sbx = CodeInterpreter(envs={"FOO": "bar"}) + result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") + assert result.text == "bar" + sbx.kill() + + +def test_env_vars_in_new_context(): + sbx = CodeInterpreter(envs={"FOO": "bar"}) + context_id = sbx.notebook.create_kernel() + result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", kernel_id=context_id) + assert result.text == "bar" + sbx.kill() From fe0cf2c0f147ce7311166809825de9b2c0d2ec51 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 11:37:53 +0200 Subject: [PATCH 222/722] Add missing sync test --- python/tests/sync/test_env_vars.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 3d66551e..6f7f1def 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -1,16 +1,31 @@ from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter -def test_env_vars(): +async def test_env_vars_sandbox(): sbx = CodeInterpreter(envs={"FOO": "bar"}) result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" sbx.kill() -def test_env_vars_in_new_context(): - sbx = CodeInterpreter(envs={"FOO": "bar"}) - context_id = sbx.notebook.create_kernel() - result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", kernel_id=context_id) +async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): + result = sandbox.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "bar"}) assert result.text == "bar" + + +async def test_env_vars_override(): + sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) + sbx.notebook.exec_cell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) + assert result.text == "baz" + + result = sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") + assert result.text == "value" + + result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") + assert result.text == "value" + + result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") + assert result.text == "bar" + sbx.kill() From 11c98b33b203566db59fa93323e16b1e2e37a3d4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 11:41:21 +0200 Subject: [PATCH 223/722] Add env vars to JS SDK --- js/package.json | 2 +- js/src/codeInterpreter.ts | 4 +- js/tests/envVars.test.ts | 35 +++++++++ js/tsconfig.json | 2 +- pnpm-lock.yaml | 149 +++++++++++++++++++++++++++++++++++--- 5 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 js/tests/envVars.test.ts diff --git a/js/package.json b/js/package.json index c1c5bbd3..4dfc67be 100644 --- a/js/package.json +++ b/js/package.json @@ -63,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.35" + "e2b": "0.16.2-beta.37" }, "engines": { "node": ">=18" diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index c3812fc3..5be91c17 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,4 +1,4 @@ -import { ConnectionConfig, Sandbox, TimeoutError } from 'e2b' +import { ConnectionConfig, Sandbox, SandboxOpts, TimeoutError } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' @@ -65,6 +65,7 @@ export class JupyterExtension { onStdout?: (output: OutputMessage) => (Promise | any), onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), + envs?: Record, timeoutMs?: number, requestTimeoutMs?: number, }, @@ -87,6 +88,7 @@ export class JupyterExtension { body: JSON.stringify({ code, context_id: opts?.kernelID, + env_vars: opts?.envs, }), signal: controller.signal, keepalive: true, diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts new file mode 100644 index 00000000..eef410a0 --- /dev/null +++ b/js/tests/envVars.test.ts @@ -0,0 +1,35 @@ +import { expect } from 'vitest' + +import { sandboxTest } from './setup' +import { CodeInterpreter } from "../src"; + +// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. +sandboxTest('env vars', async () => { + const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { TEST_ENV_VAR: "supertest" } }) + const result = await sandbox.notebook.execCell(`import os; x = os.getenv('TEST_ENV_VAR'); x`) + + expect(result.results[0].text.trim()).toEqual('supertest') +}) + +sandboxTest('env vars on sandbox', async ({sandbox}) => { + const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "bar"}}) + + expect(result.results[0].text.trim()).toEqual('bar') +}) + +sandboxTest('env vars on sandbox override', async () => { + const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { FOO: "bar", SBX: "value" } }) + await sandbox.notebook.execCell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "baz"}}) + + expect(result.results[0].text.trim()).toEqual('baz') + + const result2 = await sandbox.notebook.execCell("import os; os.getenv('RUNTIME_ENV')") + expect(result2.results[0].text.trim()).toEqual('value') + + const result3 = await sandbox.notebook.execCell("import os; os.getenv('SBX')") + expect(result3.results[0].text.trim()).toEqual('value') + + const result4 = await sandbox.notebook.execCell("import os; os.getenv('FOO')") + expect(result4.results[0].text.trim()).toEqual('bar') +}) diff --git a/js/tsconfig.json b/js/tsconfig.json index 56772c4b..a9615e84 100644 --- a/js/tsconfig.json +++ b/js/tsconfig.json @@ -27,4 +27,4 @@ "node_modules", "tsup.config.js" ] -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 914b83c5..903b632f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.35 - version: 0.16.2-beta.35 + specifier: 0.16.2-beta.37 + version: 0.16.2-beta.37 devDependencies: '@types/node': specifier: ^18.18.6 @@ -41,7 +41,7 @@ importers: version: 16.14.20 tsup: specifier: ^8.1.0 - version: 8.1.0(postcss@8.4.38)(typescript@5.5.3) + version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -161,6 +161,10 @@ packages: peerDependencies: '@bufbuild/protobuf': ^1.4.2 + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -466,6 +470,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -635,6 +642,18 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tufjs/canonical-json@1.0.0': resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -691,6 +710,15 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -749,6 +777,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -961,6 +992,9 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -1061,6 +1095,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1073,8 +1111,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.35: - resolution: {integrity: sha512-owt+GXdUliIS6O41QRsDXMyL1hx7MprbP64arxKplGnDNoOD81W8MTkd7/Z61UbSC0q0tLltOU9oatVu24gnww==} + e2b@0.16.2-beta.37: + resolution: {integrity: sha512-7fzUuOOcJUmw/1udp06ZtKDlrvgeSjcdDpuvvRaiFLJA36GylVyX5eJ+n4VpyLu44EetiD0RDXb2wE/VveXYmQ==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -1744,6 +1782,9 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2597,6 +2638,20 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -2720,6 +2775,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -2890,6 +2948,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3126,6 +3188,11 @@ snapshots: dependencies: '@bufbuild/protobuf': 1.10.0 + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@esbuild/aix-ppc64@0.20.2': optional: true @@ -3296,6 +3363,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + optional: true + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.4 @@ -3464,6 +3537,18 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@tufjs/canonical-json@1.0.0': {} '@tufjs/models@1.0.4': @@ -3525,6 +3610,14 @@ snapshots: abbrev@1.1.1: {} + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + optional: true + + acorn@8.12.1: + optional: true + agent-base@6.0.2: dependencies: debug: 4.3.4 @@ -3576,6 +3669,9 @@ snapshots: delegates: 1.0.0 readable-stream: 3.6.2 + arg@4.1.3: + optional: true + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -3839,6 +3935,9 @@ snapshots: console-control-strings@1.1.0: {} + create-require@1.1.1: + optional: true + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 @@ -3933,6 +4032,9 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: + optional: true + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3943,7 +4045,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.35: + e2b@0.16.2-beta.37: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) @@ -4700,6 +4802,9 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + make-error@1.3.6: + optional: true + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 @@ -5148,12 +5253,13 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3)): dependencies: lilconfig: 3.1.2 yaml: 2.4.5 optionalDependencies: postcss: 8.4.38 + ts-node: 10.9.2(@types/node@18.18.6)(typescript@5.5.3) postcss@8.4.38: dependencies: @@ -5641,13 +5747,32 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.18.6 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - tsup@8.1.0(postcss@8.4.38)(typescript@5.5.3): + tsup@8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3): dependencies: bundle-require: 4.0.2(esbuild@0.21.5) cac: 6.7.14 @@ -5657,7 +5782,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3)) resolve-from: 5.0.0 rollup: 4.13.0 source-map: 0.8.0-beta.0 @@ -5792,6 +5917,9 @@ snapshots: util-deprecate@1.0.2: {} + v8-compile-cache-lib@3.0.1: + optional: true + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -5988,6 +6116,9 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} zod-validation-error@3.3.0(zod@3.22.4): From 6714a83ef411381713dad9b490e5173a8e122247 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 13:27:24 +0200 Subject: [PATCH 224/722] Fix tests --- js/src/codeInterpreter.ts | 2 +- js/src/messaging.ts | 2 +- js/tests/envVars.test.ts | 2 +- python/e2b_code_interpreter/code_interpreter_sync.py | 1 - python/tests/async/test_async_env_vars.py | 2 +- python/tests/sync/test_env_vars.py | 2 +- template/server/api/models/execution_request.py | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 5be91c17..442bd2a6 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -1,4 +1,4 @@ -import { ConnectionConfig, Sandbox, SandboxOpts, TimeoutError } from 'e2b' +import { ConnectionConfig, Sandbox, TimeoutError } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' diff --git a/js/src/messaging.ts b/js/src/messaging.ts index a86c2ae7..8c22a897 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -329,4 +329,4 @@ export async function parseOutput( execution.executionCount = msg.execution_count break } -} \ No newline at end of file +} diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index eef410a0..90e5f111 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -19,7 +19,7 @@ sandboxTest('env vars on sandbox', async ({sandbox}) => { sandboxTest('env vars on sandbox override', async () => { const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { FOO: "bar", SBX: "value" } }) - await sandbox.notebook.execCell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + await sandbox.notebook.execCell("import os; os.environ['FOO'] = 'bar'); os.environ['RUNTIME_ENV'] = 'value'") const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "baz"}}) expect(result.results[0].text.trim()).toEqual('baz') diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index b5d3b6a7..2631944b 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -221,5 +221,4 @@ def __init__( jupyter_url, self._transport, self.connection_config, - envs, ) diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 0d607f9b..bd5a16ba 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): async def test_env_vars_override(): sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) - await sbx.notebook.exec_cell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + await sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'baz'; os.environ['RUNTIME_ENV'] = 'value'") result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 6f7f1def..8701f332 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): async def test_env_vars_override(): sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) - sbx.notebook.exec_cell("import os; os.setenv('FOO', 'baz'); os.setenv('RUNTIME_ENV', 'value')") + sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'baz'; os.environ['RUNTIME_ENV'] = 'value'") result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index 595f12f5..2682c33f 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -8,4 +8,4 @@ class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") context_id: Optional[StrictStr] = Field(default="default", description="Context ID") - env_vars: Optional[EnvVars] = Field(description="Environment variables") + env_vars: Optional[EnvVars] = Field(description="Environment variables", default=None) From 082bd93f73ecf817212178c3a65d36fd95798cf5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 13:34:07 +0200 Subject: [PATCH 225/722] Fix tests --- js/tests/envVars.test.ts | 2 +- python/tests/async/test_async_env_vars.py | 2 +- python/tests/sync/test_env_vars.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index 90e5f111..62af21a8 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -19,7 +19,7 @@ sandboxTest('env vars on sandbox', async ({sandbox}) => { sandboxTest('env vars on sandbox override', async () => { const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { FOO: "bar", SBX: "value" } }) - await sandbox.notebook.execCell("import os; os.environ['FOO'] = 'bar'); os.environ['RUNTIME_ENV'] = 'value'") + await sandbox.notebook.execCell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "baz"}}) expect(result.results[0].text.trim()).toEqual('baz') diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index bd5a16ba..411ce163 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): async def test_env_vars_override(): sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) - await sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'baz'; os.environ['RUNTIME_ENV'] = 'value'") + await sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 8701f332..38e87f92 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): async def test_env_vars_override(): sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) - sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'baz'; os.environ['RUNTIME_ENV'] = 'value'") + sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" From c9d6a5d991e2c35f252f1c1ff72b46d9d194ea67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Aug 2024 11:34:59 +0000 Subject: [PATCH 226/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 4dfc67be..2e517d89 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.30", + "version": "0.0.9-beta.31", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 2f7dc5e5..162d8337 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a30" +version = "0.0.11a31" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From eca1a5b0b159bab0f0cdb5be1d0b52719e0b126f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 15 Aug 2024 15:16:03 +0200 Subject: [PATCH 227/722] Fix cwd --- template/server/main.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/template/server/main.py b/template/server/main.py index 7b8bee7e..24b0ee88 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -123,16 +123,6 @@ async def create_context(request: CreateContext) -> Context: session_id = session_data["id"] kernel_id = session_data["kernel"]["id"] - response = await client.patch( - f"{JUPYTER_BASE_URL}/api/sessions/{session_id}", - json={"path": request.cwd}, - ) - if not response.is_success: - raise HTTPException( - status_code=500, - detail=f"Failed to create kernel: {response.text}", - ) - logger.debug(f"Created kernel {kernel_id}") ws = JupyterKernelWebSocket( @@ -145,6 +135,13 @@ async def create_context(request: CreateContext) -> Context: websockets[kernel_id] = ws + async for item in ws.execute(f"%cd {request.cwd}", background=True): + if item["type"] == "error": + raise HTTPException( + status_code=500, + detail=f"Failed to set working directory: {item}", + ) + return Context(name=request.name, id=kernel_id, cwd=request.cwd) From 96b0ac4f7e47b4a0ecc31b7b8430bf804888508e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Aug 2024 13:18:09 +0000 Subject: [PATCH 228/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 2e517d89..993d1a4a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.31", + "version": "0.0.9-beta.32", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 162d8337..40d35387 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a31" +version = "0.0.11a32" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 941d56e144e2e24428f728f083b3290ea9c75380 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 16 Aug 2024 10:41:29 +0200 Subject: [PATCH 229/722] Fix local testing --- Makefile | 2 +- template/server/envs.py | 12 ++++++++++++ template/server/main.py | 5 ++--- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 template/server/envs.py diff --git a/Makefile b/Makefile index ea1bc454..dc06c640 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ start-template-server: - docker run --rm -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) + docker run --rm -e LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) diff --git a/template/server/envs.py b/template/server/envs.py new file mode 100644 index 00000000..3074efb7 --- /dev/null +++ b/template/server/envs.py @@ -0,0 +1,12 @@ +import os + +import requests + +LOCAL = os.getenv("LOCAL", False) +ENVD_PORT = 49983 + + +def get_envs() -> dict: + if LOCAL: + return {} + return requests.get(f"http://localhost:{ENVD_PORT}/envs").json() diff --git a/template/server/main.py b/template/server/main.py index 24b0ee88..d835e4cb 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -4,7 +4,6 @@ from typing import Dict, Union, Literal, List -import requests from pydantic import StrictStr from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException @@ -12,6 +11,7 @@ from api.models.context import Context from api.models.create_context import CreateContext from api.models.execution_request import ExecutionRequest +from envs import get_envs from messaging import JupyterKernelWebSocket from stream import StreamingListJsonResponse @@ -23,7 +23,6 @@ JUPYTER_BASE_URL = "http://localhost:8888" -ENVD_PORT = 49983 websockets: Dict[Union[StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} global default_kernel_id @@ -74,7 +73,7 @@ async def health(): async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") - global_env_vars: dict = requests.get(f"http://localhost:{ENVD_PORT}/envs").json() + global_env_vars = get_envs() if request.context_id: ws = websockets.get(request.context_id) From 4ec5ace0a5f2d582a4ca93856a1d9512c4c9a291 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Aug 2024 08:45:09 +0000 Subject: [PATCH 230/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 993d1a4a..c38c7702 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.32", + "version": "0.0.9-beta.33", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 40d35387..f838ee8e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a32" +version = "0.0.11a33" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 6856877b2f006d82d32dc4aa015e6fe33e1fdeea Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 16 Aug 2024 10:45:21 +0200 Subject: [PATCH 231/722] Rename the env variable --- Makefile | 2 +- template/server/envs.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index dc06c640..30e4016f 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ start-template-server: - docker run --rm -e LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) + docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) diff --git a/template/server/envs.py b/template/server/envs.py index 3074efb7..a8f882af 100644 --- a/template/server/envs.py +++ b/template/server/envs.py @@ -2,7 +2,7 @@ import requests -LOCAL = os.getenv("LOCAL", False) +LOCAL = os.getenv("E2B_LOCAL", False) ENVD_PORT = 49983 From 97b5aaf129e90e2635173c02b30237fa755446d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Aug 2024 08:46:25 +0000 Subject: [PATCH 232/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c38c7702..624d627e 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.33", + "version": "0.0.9-beta.34", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index f838ee8e..6636bf4d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a33" +version = "0.0.11a34" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 7f13e50e8cf1c4e7980e4518261268a45fdc18a2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 19 Aug 2024 14:34:37 +0200 Subject: [PATCH 233/722] Update core package --- js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/package.json b/js/package.json index 624d627e..a58642f5 100644 --- a/js/package.json +++ b/js/package.json @@ -63,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.37" + "e2b": "0.16.2-beta.40" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 903b632f..3e76d779 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.37 - version: 0.16.2-beta.37 + specifier: 0.16.2-beta.40 + version: 0.16.2-beta.40 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1111,8 +1111,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.37: - resolution: {integrity: sha512-7fzUuOOcJUmw/1udp06ZtKDlrvgeSjcdDpuvvRaiFLJA36GylVyX5eJ+n4VpyLu44EetiD0RDXb2wE/VveXYmQ==} + e2b@0.16.2-beta.40: + resolution: {integrity: sha512-tWZiNUxuadG5S8nl/Yya29ZBojISzGxt9E+W6bhbJA/zB5iHI78u/bRRVueHL9FiCNVi1gviR+9O/IRpnmfSpA==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -4045,7 +4045,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.37: + e2b@0.16.2-beta.40: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) From ff8f220a192b6bbf367eddb735447f1b84bda209 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Aug 2024 12:35:35 +0000 Subject: [PATCH 234/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index a58642f5..f71d0519 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.34", + "version": "0.0.9-beta.35", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 6636bf4d..93e4d743 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a34" +version = "0.0.11a35" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From d9c315edac596c3eed9d8f91080c06514267f085 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 19 Aug 2024 15:36:21 +0200 Subject: [PATCH 235/722] Update e2b core --- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index c5fd6e8e..3ea97f34 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a44" +version = "0.17.2a48" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a44-py3-none-any.whl", hash = "sha256:c5477391dde6693e0e65bb510b0fae3967a2915387b7e79a27d3e7ea0d7b4e61"}, - {file = "e2b-0.17.2a44.tar.gz", hash = "sha256:0218a62687a01aec96df1421638b107f2348c50e286f336eb609e2dc99b2866e"}, + {file = "e2b-0.17.2a48-py3-none-any.whl", hash = "sha256:4ac5f0d5cc39845d7baab47d22f5129d112a9014f5a14af3e931d3f359361ebd"}, + {file = "e2b-0.17.2a48.tar.gz", hash = "sha256:7ec26476f3f6cc509d6a47179fdba6007fc33b3387abaf5480baf5c788b26113"}, ] [package.dependencies] @@ -483,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "82554d389c2da922d01959e0512d43d5a2756e2fccf1232962f649d6e38590c5" +content-hash = "57fa070cc686d290fae29611900eca7c8f497c8102ea703a336e12193883f575" diff --git a/python/pyproject.toml b/python/pyproject.toml index 93e4d743..709364b0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "0.17.2a44" +e2b = "^0.17.2a48" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 9f7f72f90cb31aa1ea7ab0c2b5df9d945d48ca7e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Aug 2024 13:37:23 +0000 Subject: [PATCH 236/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index f71d0519..d3856a45 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.35", + "version": "0.0.9-beta.36", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 709364b0..ad7e6727 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a35" +version = "0.0.11a36" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From c37617ccebe13c6fdddea49b88e71521a4fc2a0c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 19 Aug 2024 17:48:06 +0200 Subject: [PATCH 237/722] Update core --- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 3ea97f34..f4dc0128 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a48" +version = "0.17.2a50" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a48-py3-none-any.whl", hash = "sha256:4ac5f0d5cc39845d7baab47d22f5129d112a9014f5a14af3e931d3f359361ebd"}, - {file = "e2b-0.17.2a48.tar.gz", hash = "sha256:7ec26476f3f6cc509d6a47179fdba6007fc33b3387abaf5480baf5c788b26113"}, + {file = "e2b-0.17.2a50-py3-none-any.whl", hash = "sha256:ff60a96df5df4fc2fe3bf104218f3c36f2ab98f21db0cddb29ac74f1922fcc02"}, + {file = "e2b-0.17.2a50.tar.gz", hash = "sha256:14989853ddee5f75d4b651a275ff2445f2c3cc24f53fb061921c12823f7d81de"}, ] [package.dependencies] @@ -483,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "57fa070cc686d290fae29611900eca7c8f497c8102ea703a336e12193883f575" +content-hash = "29a10c991245e83e5aa9c70076b288e0d80cb6b7fe4b8e0611b051099a6757f2" diff --git a/python/pyproject.toml b/python/pyproject.toml index ad7e6727..ffa21ab1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "^0.17.2a48" +e2b = "^0.17.2a50" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 423ab550ab5b62980dc21a62c827426263fdf76a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Aug 2024 15:48:55 +0000 Subject: [PATCH 238/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index d3856a45..806c49e8 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.36", + "version": "0.0.9-beta.37", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index ffa21ab1..33c2cf01 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a36" +version = "0.0.11a37" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 359a4fd6fc1bc3a20d4397cd2ceaf4005b69a4b3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 13:36:19 +0200 Subject: [PATCH 239/722] Fix Result if no text is present --- template/server/api/models/result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 118d563d..6e1f833b 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -46,7 +46,7 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.is_main_result = is_main_result self.text = data.pop("text/plain", None) - if self.text.startswith("'") and self.text.endswith("'"): + if self.text and self.text.startswith("'") and self.text.endswith("'"): self.text = self.text[1:-1] self.html = data.pop("text/html", None) From 659ba60bc33ac852f98b0f13a61b8c15f0210643 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Aug 2024 11:37:14 +0000 Subject: [PATCH 240/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 806c49e8..29ee2cf1 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.37", + "version": "0.0.9-beta.38", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 33c2cf01..d63cab69 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a37" +version = "0.0.11a38" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 764b389de4724865499d5610c181a729904ab8c5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 17:07:19 +0200 Subject: [PATCH 241/722] Add test --- python/tests/sync/test_custom_repr_object.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 python/tests/sync/test_custom_repr_object.py diff --git a/python/tests/sync/test_custom_repr_object.py b/python/tests/sync/test_custom_repr_object.py new file mode 100644 index 00000000..ba35fca9 --- /dev/null +++ b/python/tests/sync/test_custom_repr_object.py @@ -0,0 +1,12 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + +code = """ +from IPython.display import display + +display({'text/latex': r'\text{CustomReprObject}'}, raw=True) +""" + + +def test_bash(sandbox: CodeInterpreter): + execution = sandbox.notebook.exec_cell(code) + assert execution.results[0].formats() == ["latex"] From 2a449892efb5cf17691f89d3e97744e98bd51074 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 17:07:54 +0200 Subject: [PATCH 242/722] Change base template --- js/src/codeInterpreter.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 442bd2a6..38e6a278 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -245,7 +245,7 @@ export class JupyterExtension { } export class CodeInterpreter extends Sandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-stateful' + protected static override readonly defaultTemplate: string = 'code-interpreter-beta' protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index f0fb9124..b0f4ec93 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ -DEFAULT_TEMPLATE = "code-interpreter-stateful" +DEFAULT_TEMPLATE = "code-interpreter-beta" JUPYTER_PORT = 49999 DEFAULT_KERNEL_ID = "default" From 1248b829cb6e72cdd141b2f4e0d69ddd567e4350 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 17:08:47 +0200 Subject: [PATCH 243/722] Add test for non text results --- python/tests/async/test_custom_repr_object.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 python/tests/async/test_custom_repr_object.py diff --git a/python/tests/async/test_custom_repr_object.py b/python/tests/async/test_custom_repr_object.py new file mode 100644 index 00000000..0e88da0d --- /dev/null +++ b/python/tests/async/test_custom_repr_object.py @@ -0,0 +1,12 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + +code = """ +from IPython.display import display + +display({'text/latex': r'\text{CustomReprObject}'}, raw=True) +""" + + +async def test_bash(sandbox: AsyncCodeInterpreter): + execution = await sandbox.notebook.exec_cell(code) + assert execution.results[0].formats() == ["latex"] From 82c463ab3cae95dbbb17304ae5a57d1a4daf5735 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Aug 2024 15:09:36 +0000 Subject: [PATCH 244/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 29ee2cf1..efdf53e3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.38", + "version": "0.0.9-beta.39", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index d63cab69..a06f9b69 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a38" +version = "0.0.11a39" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 54134ba200ecd8764282984aaacc059936ad88ad Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 30 Jul 2024 18:48:24 +0200 Subject: [PATCH 245/722] Extract data from dataframe --- python/e2b_code_interpreter/models.py | 3 +++ template/e2b.Dockerfile | 3 +++ template/e2b.toml | 10 +++++----- template/ipython_startup_script.py | 18 ++++++++++++++++++ template/server/api/models/result.py | 2 ++ 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 template/ipython_startup_script.py diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index a759b7d0..5667a635 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -88,6 +88,7 @@ def __getitem__(self, item): latex: Optional[str] = None json: Optional[dict] = None javascript: Optional[str] = None + data: Optional[dict] = None is_main_result: bool = False """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" extra: Optional[dict] = None @@ -120,6 +121,8 @@ def formats(self) -> Iterable[str]: formats.append("json") if self.javascript: formats.append("javascript") + if self.data: + formats.append("data") if self.extra: for key in self.extra: diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 3856852d..0583b94f 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -52,5 +52,8 @@ COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup +COPY ./ipython_startup_script.py $IPYTHON_CONFIG_PATH/profile_default/startup/00-startup.py + # Setup entrypoint for local development ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/e2b.toml b/template/e2b.toml index 68c8bbfc..de9fb679 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,16 +1,16 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: +# You can use 'template_id' (se2g25klhfixqis2b57f) or 'template_name (ci-df) from this config to spawn a sandbox: # Python SDK # from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-beta') +# sandbox = Sandbox(template='ci-df') # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) +# const sandbox = await Sandbox.create({ template: 'ci-df' }) memory_mb = 1_024 start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-beta" -template_id = "3e4rngfa34txe0gxc1zf" +template_name = "ci-df" +template_id = "se2g25klhfixqis2b57f" diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py new file mode 100644 index 00000000..6565d692 --- /dev/null +++ b/template/ipython_startup_script.py @@ -0,0 +1,18 @@ +import pandas as pd + + +def _repr_mimebundle_(self, include=None, exclude=None): + data = { + 'text/html': self.to_html(), + 'text/plain': self.to_string(), + 'e2b/df': self.to_dict(orient='list'), + } + + if include: + data = {k: v for (k, v) in data.items() if k in include} + if exclude: + data = {k: v for (k, v) in data.items() if k not in exclude} + return data + + +setattr(pd.DataFrame, '_repr_mimebundle_', _repr_mimebundle_) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 6e1f833b..178f891a 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -35,6 +35,7 @@ class Result(BaseModel): latex: Optional[str] = None json: Optional[dict] = None javascript: Optional[str] = None + data: Optional[dict] = None extra: Optional[dict] = None "Extra data that can be included. Not part of the standard types." @@ -58,6 +59,7 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.latex = data.pop("text/latex", None) self.json = data.pop("application/json", None) self.javascript = data.pop("application/javascript", None) + self.data = data.pop("e2b/df", None) self.extra = data def formats(self) -> Iterable[str]: From c596e043ece8a7877657e363641eb895403468b5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 30 Jul 2024 19:02:00 +0200 Subject: [PATCH 246/722] Do beta release --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index a06f9b69..f00d669e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11a39" +version = "0.0.11b0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e8e1fe427462d6f26ba80688119ecf9fe5d8a6f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jul 2024 17:19:41 +0000 Subject: [PATCH 247/722] [skip ci] Release new versions --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index f00d669e..d677b0f0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b0" +version = "0.0.11b1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 93adec43d6bf1054769afb3bf0d8a7bfe07dd9a7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 30 Jul 2024 19:22:38 +0200 Subject: [PATCH 248/722] Implement javascript part --- js/src/messaging.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 8c22a897..9ce6584f 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -116,6 +116,10 @@ export class Result { * JavaScript representation of the data. */ readonly javascript?: string + /** + * Contains the data from DataFrame. + */ + readonly data: object /** * Extra data that can be included. Not part of the standard types. */ @@ -155,7 +159,8 @@ export class Result { 'pdf', 'latex', 'json', - 'javascript' + 'javascript', + 'data', ].includes(key) ) { this.extra[key] = data[key] @@ -197,6 +202,9 @@ export class Result { if (this.javascript) { formats.push('javascript') } + if (this.data) { + formats.push('data') + } for (const key of Object.keys(this.extra)) { formats.push(key) From cda01a6cf87b8cd5afacd21a7b30e7dba8843c90 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 30 Jul 2024 19:26:35 +0200 Subject: [PATCH 249/722] Change template name --- js/src/codeInterpreter.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 38e6a278..f3ef95d2 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -245,7 +245,7 @@ export class JupyterExtension { } export class CodeInterpreter extends Sandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-beta' + protected static override readonly defaultTemplate: string = 'ci-df' protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index b0f4ec93..267d73ad 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ -DEFAULT_TEMPLATE = "code-interpreter-beta" +DEFAULT_TEMPLATE = "ci-df" JUPYTER_PORT = 49999 DEFAULT_KERNEL_ID = "default" From e7dcb231fa58424aff399623b82af3ab5b83d469 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jul 2024 17:31:09 +0000 Subject: [PATCH 250/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index efdf53e3..f0a578e8 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.39", + "version": "0.0.9-beta-df.0", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index d677b0f0..cc03ba4b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b1" +version = "0.0.11b2" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From f5215ec84012c150a42bb167becac21127a01b7a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 17:20:27 +0200 Subject: [PATCH 251/722] Bump to release --- python/async_example.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/async_example.py b/python/async_example.py index 5f038b1e..76e9ec92 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -6,7 +6,6 @@ load_dotenv() - code = """ import matplotlib.pyplot as plt import numpy as np From 0e964dd876d0847a5bfca94a4d7c30dc7ab47de3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Aug 2024 15:21:09 +0000 Subject: [PATCH 252/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index f0a578e8..e5bc9c4a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.0", + "version": "0.0.9-beta-df.1", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index cc03ba4b..2daa93f0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b2" +version = "0.0.11b3" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From b7713c9a1e73389d9fd1dc2e823b5e67038974ce Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 20 Aug 2024 17:21:30 +0200 Subject: [PATCH 253/722] Build template --- .github/workflows/template.yml | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index a18b9fdf..a5b05540 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -6,7 +6,7 @@ on: - 'template/**' - '.github/workflows/template.yml' branches: - - beta + - beta-df permissions: contents: read @@ -32,19 +32,10 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push to DockerHub - run: | - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true - docker buildx build \ - --file e2b.Dockerfile \ - --platform linux/amd64 \ - --push \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . - - name: Install E2B CLI run: npm install -g @e2b/cli - name: Build e2b run: e2b template build env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} \ No newline at end of file + E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} From c6593e192f674e17238787ec37ecd2f36d0f5719 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Aug 2024 15:22:17 +0000 Subject: [PATCH 254/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index e5bc9c4a..fbfcad5d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.1", + "version": "0.0.9-beta-df.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 2daa93f0..d06640f5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b3" +version = "0.0.11b4" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From aaae6cf567af025b32c79f73c808258351616fbe Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:01:34 +0200 Subject: [PATCH 255/722] Fix type and add test --- js/src/messaging.ts | 12 +++++++++--- js/tests/data.test.ts | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 js/tests/data.test.ts diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 9ce6584f..960ef661 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -59,12 +59,16 @@ export class ExecutionError { */ export type MIMEType = string +type Data = { + data: Record +} + /** - * Dictionary that maps MIME types to their corresponding string representations of the data. + * Dictionary that maps MIME types to their corresponding representations of the data. */ export type RawData = { [key: MIMEType]: string -} +} & Data /** * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. @@ -119,7 +123,7 @@ export class Result { /** * Contains the data from DataFrame. */ - readonly data: object + readonly data?: Record /** * Extra data that can be included. Not part of the standard types. */ @@ -142,6 +146,7 @@ export class Result { this.latex = data['latex'] this.json = data['json'] this.javascript = data['javascript'] + this.data = data['data'] this.isMainResult = isMainResult this.raw = data @@ -161,6 +166,7 @@ export class Result { 'json', 'javascript', 'data', + 'extra' ].includes(key) ) { this.extra[key] = data[key] diff --git a/js/tests/data.test.ts b/js/tests/data.test.ts new file mode 100644 index 00000000..8a638ed3 --- /dev/null +++ b/js/tests/data.test.ts @@ -0,0 +1,10 @@ +import { expect } from 'vitest' + +import { sandboxTest } from './setup' + +sandboxTest('get data', async ({ sandbox }) => { + const execution = await sandbox.notebook.execCell('pd.DataFrame({"a": [1, 2, 3]})') + + const result = execution.results[0] + expect(result.data).toBeDefined() +}) From 3fa33838bee8e5b4197896221f33406c96fe1102 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 14:08:13 +0000 Subject: [PATCH 256/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index fbfcad5d..a6c42b7f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.2", + "version": "0.0.9-beta-df.3", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index d06640f5..a5f7cb9b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b4" +version = "0.0.11b5" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5b9f5821e920aca4da04f0838d091b6c4a302619 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:33:17 +0200 Subject: [PATCH 257/722] Revert changes in GitHub action --- .github/workflows/template.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index a5b05540..80a84f57 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -6,7 +6,7 @@ on: - 'template/**' - '.github/workflows/template.yml' branches: - - beta-df + - beta permissions: contents: read @@ -32,6 +32,15 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push to DockerHub + run: | + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true + docker buildx build \ + --file e2b.Dockerfile \ + --platform linux/amd64 \ + --push \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . + - name: Install E2B CLI run: npm install -g @e2b/cli From aa283894a8514347b0805c62290af89d5fb34255 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:39:00 +0200 Subject: [PATCH 258/722] Revert changes --- js/example.mts | 26 +++--------------------- js/src/codeInterpreter.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- template/e2b.toml | 10 ++++----- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/js/example.mts b/js/example.mts index 4afc07d0..4f185d08 100644 --- a/js/example.mts +++ b/js/example.mts @@ -5,34 +5,14 @@ import { CodeInterpreter } from './dist' dotenv.config() const code = ` -import matplotlib.pyplot as plt -import numpy as np - -x = np.linspace(0, 20, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.show() - -x = np.linspace(0, 10, 100) - -plt.plot(x, y) -plt.show() - -import pandas -pandas.DataFrame({"a": [1, 2, 3]}) +pd.DataFrame({"a": [1, 2, 3]}) ` -const sandbox = await CodeInterpreter.connect("", { debug: true }) +const sandbox = await CodeInterpreter.create("ci-df") console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { - onStdout(msg) { - console.log('stdout', msg) - }, - onStderr(msg) { - console.log('stderr', msg) - }, }) console.log(execution.results[0].formats()) +console.log(execution.results[0].data) console.log(execution.results.length) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index f3ef95d2..38e6a278 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -245,7 +245,7 @@ export class JupyterExtension { } export class CodeInterpreter extends Sandbox { - protected static override readonly defaultTemplate: string = 'ci-df' + protected static override readonly defaultTemplate: string = 'code-interpreter-beta' protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index 267d73ad..b0f4ec93 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ -DEFAULT_TEMPLATE = "ci-df" +DEFAULT_TEMPLATE = "code-interpreter-beta" JUPYTER_PORT = 49999 DEFAULT_KERNEL_ID = "default" diff --git a/template/e2b.toml b/template/e2b.toml index de9fb679..68c8bbfc 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,16 +1,16 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (se2g25klhfixqis2b57f) or 'template_name (ci-df) from this config to spawn a sandbox: +# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: # Python SDK # from e2b import Sandbox -# sandbox = Sandbox(template='ci-df') +# sandbox = Sandbox(template='code-interpreter-beta') # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'ci-df' }) +# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) memory_mb = 1_024 start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" -template_name = "ci-df" -template_id = "se2g25klhfixqis2b57f" +template_name = "code-interpreter-beta" +template_id = "3e4rngfa34txe0gxc1zf" From 9af7869185e895012b661a03b8a85753cfb2690d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 14:44:57 +0000 Subject: [PATCH 259/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index a6c42b7f..6ae58709 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.3", + "version": "0.0.9-beta-df.4", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index a5f7cb9b..34deff08 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b5" +version = "0.0.11b6" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5fa873135534183f2a9f05cf2c8b04bfe768d90e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:46:08 +0200 Subject: [PATCH 260/722] Add python tests --- js/example.mts | 14 ++++++++++++-- python/async_example.py | 1 + python/tests/async/test_async_data.py | 14 ++++++++++++++ python/tests/sync/test_data.py | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 python/tests/async/test_async_data.py create mode 100644 python/tests/sync/test_data.py diff --git a/js/example.mts b/js/example.mts index 4f185d08..efc7e6fe 100644 --- a/js/example.mts +++ b/js/example.mts @@ -5,10 +5,20 @@ import { CodeInterpreter } from './dist' dotenv.config() const code = ` -pd.DataFrame({"a": [1, 2, 3]}) +import matplotlib.pyplot as plt +import numpy as np +x = np.linspace(0, 20, 100) +y = np.sin(x) +plt.plot(x, y) +plt.show() +x = np.linspace(0, 10, 100) +plt.plot(x, y) +plt.show() +import pandas +pandas.DataFrame({"a": [1, 2, 3]}) ` -const sandbox = await CodeInterpreter.create("ci-df") +const sandbox = await CodeInterpreter.create() console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { diff --git a/python/async_example.py b/python/async_example.py index 76e9ec92..5f038b1e 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -6,6 +6,7 @@ load_dotenv() + code = """ import matplotlib.pyplot as plt import numpy as np diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py new file mode 100644 index 00000000..81f508d1 --- /dev/null +++ b/python/tests/async/test_async_data.py @@ -0,0 +1,14 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +async def test_data(async_sandbox: AsyncCodeInterpreter): + # plot random graph + result = await async_sandbox.notebook.exec_cell( + """ + pd.DataFrame({"a": [1, 2, 3]}) + """ + ) + + # there's your image + data = result.results[0] + assert data.data diff --git a/python/tests/sync/test_data.py b/python/tests/sync/test_data.py new file mode 100644 index 00000000..0352de48 --- /dev/null +++ b/python/tests/sync/test_data.py @@ -0,0 +1,16 @@ +from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + + +def test_data(sandbox: CodeInterpreter): + # plot random graph + result = sandbox.notebook.exec_cell( + """ + pd.DataFrame({"a": [1, 2, 3]}) + """ + ) + + # there's your image + data = result.results[0] + assert data.data + assert "a" in data.data + assert len(data.data["a"]) == 3 From 341705e63f9f538104a3d721be42ec39b18e9d9b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:47:58 +0200 Subject: [PATCH 261/722] Improve example readability --- js/example.mts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/js/example.mts b/js/example.mts index efc7e6fe..e87708e8 100644 --- a/js/example.mts +++ b/js/example.mts @@ -7,13 +7,17 @@ dotenv.config() const code = ` import matplotlib.pyplot as plt import numpy as np + x = np.linspace(0, 20, 100) y = np.sin(x) + plt.plot(x, y) plt.show() + x = np.linspace(0, 10, 100) plt.plot(x, y) plt.show() + import pandas pandas.DataFrame({"a": [1, 2, 3]}) ` @@ -22,6 +26,12 @@ const sandbox = await CodeInterpreter.create() console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { + onStdout(msg) { + console.log('stdout', msg) + }, + onStderr(msg) { + console.log('stderr', msg) + }, }) console.log(execution.results[0].formats()) console.log(execution.results[0].data) From 1cec2acfad5fcd1a9b0fbe8eeb7f72e0e96809c7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:49:25 +0200 Subject: [PATCH 262/722] Improve test --- python/tests/async/test_async_data.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py index 81f508d1..f02d9a69 100644 --- a/python/tests/async/test_async_data.py +++ b/python/tests/async/test_async_data.py @@ -12,3 +12,5 @@ async def test_data(async_sandbox: AsyncCodeInterpreter): # there's your image data = result.results[0] assert data.data + assert "a" in data.data + assert len(data.data["a"]) == 3 From 6244813a85f401bc0edae34719f2bc94d843ca7a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:49:53 +0200 Subject: [PATCH 263/722] Lint --- js/example.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/example.mts b/js/example.mts index e87708e8..3fe5d652 100644 --- a/js/example.mts +++ b/js/example.mts @@ -26,7 +26,7 @@ const sandbox = await CodeInterpreter.create() console.log(sandbox.sandboxId) const execution = await sandbox.notebook.execCell(code, { - onStdout(msg) { + onStdout(msg) { console.log('stdout', msg) }, onStderr(msg) { From d1b4cfa5157fbd0061e569281f5fd4c2065b58b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 14:52:46 +0000 Subject: [PATCH 264/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 6ae58709..7eb8183d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.4", + "version": "0.0.9-beta-df.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 34deff08..8b070ecf 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b6" +version = "0.0.11b7" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e0f7e73d8dd10d3bbf1dca5ea8da33ee5e8fbec9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 14:55:36 +0000 Subject: [PATCH 265/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 7eb8183d..4309accb 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta-df.5", + "version": "0.0.9-beta.0", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 8b070ecf..f6aabfb5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b7" +version = "0.0.11b8" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From bbec62167355d330be86721393d5254db738eec4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 16:56:39 +0200 Subject: [PATCH 266/722] Fix test --- ...custom_repr_object.py => test_async_custom_repr_object.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename python/tests/async/{test_custom_repr_object.py => test_async_custom_repr_object.py} (67%) diff --git a/python/tests/async/test_custom_repr_object.py b/python/tests/async/test_async_custom_repr_object.py similarity index 67% rename from python/tests/async/test_custom_repr_object.py rename to python/tests/async/test_async_custom_repr_object.py index 0e88da0d..c4b7f9a9 100644 --- a/python/tests/async/test_custom_repr_object.py +++ b/python/tests/async/test_async_custom_repr_object.py @@ -7,6 +7,6 @@ """ -async def test_bash(sandbox: AsyncCodeInterpreter): - execution = await sandbox.notebook.exec_cell(code) +async def test_bash(async_sandbox: AsyncCodeInterpreter): + execution = await async_sandbox.notebook.exec_cell(code) assert execution.results[0].formats() == ["latex"] From 39dee51edb2315e1ac75044d9f4b68461a1a6926 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 14:58:03 +0000 Subject: [PATCH 267/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 4309accb..6e855160 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.0", + "version": "0.0.9-beta.1", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index f6aabfb5..9c10f6aa 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b8" +version = "0.0.11b9" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From a3817032f9facc827d95934bf759f3d1fe104729 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 21 Aug 2024 17:00:51 +0200 Subject: [PATCH 268/722] Trigger build --- template/ipython_startup_script.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py index 6565d692..e76d612b 100644 --- a/template/ipython_startup_script.py +++ b/template/ipython_startup_script.py @@ -1,7 +1,7 @@ import pandas as pd -def _repr_mimebundle_(self, include=None, exclude=None): +def _repr_mime_bundle_(self, include=None, exclude=None): data = { 'text/html': self.to_html(), 'text/plain': self.to_string(), @@ -15,4 +15,4 @@ def _repr_mimebundle_(self, include=None, exclude=None): return data -setattr(pd.DataFrame, '_repr_mimebundle_', _repr_mimebundle_) +setattr(pd.DataFrame, '_repr_mimebundle_', _repr_mime_bundle_) From 19e289f6d96e6e28ab82951113f1dc7fcd94392a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Aug 2024 15:01:56 +0000 Subject: [PATCH 269/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 6e855160..36508154 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.1", + "version": "0.0.9-beta.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9c10f6aa..5ab585e1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b9" +version = "0.0.11b10" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 37db477a6f810326feafab6747a8bfbe300325a3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 27 Aug 2024 16:41:12 +0300 Subject: [PATCH 270/722] Add support for "native" e2b/data in jupyter server --- Makefile | 3 ++ python/async_example.py | 31 +++++++++++------- template/ipython_startup_script.py | 49 ++++++++++++++++++++++------ template/server/api/models/result.py | 2 +- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 30e4016f..493cc9cf 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,5 @@ start-template-server: docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) + +kill-template-server: + docker kill $(shell docker ps --filter expose=49999 --format {{.ID}}) diff --git a/python/async_example.py b/python/async_example.py index 5f038b1e..1da955ea 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -8,29 +8,38 @@ code = """ +import matplotlib import matplotlib.pyplot as plt import numpy as np -import time +from matplotlib.figure import Figure -print("1") -time.sleep(10) +x = np.linspace(0, 20, 100) +y = np.sin(x) -import pandas -pandas.DataFrame({"a": [1, 2, 3]}) +plt.plot(x, y) +plt.show() + + +class Test(): + def _repr_e2b_data_(self): + return {"a": 1} + +Test() """ async def run(): sandbox = await AsyncCodeInterpreter.connect("", debug=True) print(sandbox.sandbox_id) - execution = await sandbox.notebook.exec_cell( - code, - on_stdout=lambda msg: print("stdout", msg), - on_stderr=lambda msg: print("stderr", msg), - ) + execution = await sandbox.notebook.exec_cell(code) - print(execution.results[0].formats()) + print('\n'.join(execution.logs.stdout)) + print('\n'.join(execution.logs.stderr)) + if execution.error: + print(execution.error.traceback) print(len(execution.results)) + print(execution.results[0].formats()) + print(execution.results[1].formats()) asyncio.run(run()) diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py index e76d612b..7f75882f 100644 --- a/template/ipython_startup_script.py +++ b/template/ipython_startup_script.py @@ -1,18 +1,47 @@ -import pandas as pd +import pandas +from matplotlib.pyplot import Figure, gca +import IPython +from IPython.core.formatters import BaseFormatter +from traitlets.traitlets import Unicode, ObjectName -def _repr_mime_bundle_(self, include=None, exclude=None): + +def _figure_repr_e2b_data_(self: Figure): + """ + This method is used to extract data from the figure object to a dictionary + """ + ax = gca() + lines = ax.get_lines() data = { - 'text/html': self.to_html(), - 'text/plain': self.to_string(), - 'e2b/df': self.to_dict(orient='list'), + 'lines': [ + { + 'x': line.get_xdata().tolist(), + 'y': line.get_ydata().tolist(), + } + for line in lines if line.figure == self] } - if include: - data = {k: v for (k, v) in data.items() if k in include} - if exclude: - data = {k: v for (k, v) in data.items() if k not in exclude} return data -setattr(pd.DataFrame, '_repr_mimebundle_', _repr_mime_bundle_) +def _data_frame_repr_e2b_data_(self: pandas.DataFrame): + return self.to_dict(orient='list') + + +class E2BFormatter(BaseFormatter): + format_type = Unicode('e2b/data') + + print_method = ObjectName('_repr_e2b_data_') + _return_type = (dict, str) + + type_printers = {pandas.DataFrame: _data_frame_repr_e2b_data_} + + def __call__(self, obj): + if isinstance(obj, Figure): + # Figure object is for some reason removed from type_printers + return _figure_repr_e2b_data_(obj) + return super().__call__(obj) + + +ip = IPython.get_ipython() +ip.display_formatter.formatters["e2b/data"] = E2BFormatter(parent=ip.display_formatter) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 178f891a..9b701bfa 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -59,7 +59,7 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.latex = data.pop("text/latex", None) self.json = data.pop("application/json", None) self.javascript = data.pop("application/javascript", None) - self.data = data.pop("e2b/df", None) + self.data = data.pop("e2b/data", None) self.extra = data def formats(self) -> Iterable[str]: From 43fd2ffc02f841ba06620d6e4a5a92b510d2b1b1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 27 Aug 2024 20:24:44 +0300 Subject: [PATCH 271/722] Improve extraction of data --- template/ipython_startup_script.py | 99 ++++++++++++++++--- .../server/api/models/execution_request.py | 4 +- template/server/api/models/result.py | 13 ++- template/server/main.py | 4 +- template/server/messaging.py | 34 +++++-- 5 files changed, 126 insertions(+), 28 deletions(-) diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py index 7f75882f..6943a483 100644 --- a/template/ipython_startup_script.py +++ b/template/ipython_startup_script.py @@ -1,37 +1,106 @@ +import enum + import pandas -from matplotlib.pyplot import Figure, gca +from matplotlib.axes import Axes +from matplotlib.collections import PathCollection +from matplotlib.lines import Line2D +from matplotlib.patches import Rectangle +from matplotlib.pyplot import Figure import IPython from IPython.core.formatters import BaseFormatter from traitlets.traitlets import Unicode, ObjectName +class PlotType(enum.Enum): + LINE = "line" + SCATTER = "scatter" + BAR = "bar" + UNKNOWN = "unknown" + + +def get_type_of_plot(ax: Axes) -> PlotType: + # Check for Line plots + if any(isinstance(line, Line2D) for line in ax.get_lines()): + return PlotType.LINE + + # Check for Bar plots (Rectangle objects with height > 0) + if any(isinstance(rect, Rectangle) for rect in ax.get_children()): + return PlotType.BAR + + # Check for Scatter plots + if any(isinstance(collection, PathCollection) for collection in ax.collections): + return PlotType.SCATTER + + return PlotType.UNKNOWN + + def _figure_repr_e2b_data_(self: Figure): """ This method is used to extract data from the figure object to a dictionary """ - ax = gca() - lines = ax.get_lines() - data = { - 'lines': [ - { - 'x': line.get_xdata().tolist(), - 'y': line.get_ydata().tolist(), - } - for line in lines if line.figure == self] - } + # Get all Axes objects from the Figure + axes = self.get_axes() + + data = [] + # Iterate through all Axes to extract data + for ax in axes: + ax_data = { + "title": ax.get_title(), + "x_label": ax.get_xlabel(), + "x_ticks": [line.get_text() for line in ax.get_xticklabels()], + "y_label": ax.get_ylabel(), + "y_ticks": [line.get_text() for line in ax.get_yticklabels()], + "data": [], + } + + plot_type = get_type_of_plot(ax) + ax_data["type"] = plot_type.value + + if plot_type == PlotType.LINE: + for line in ax.get_lines(): + line_data = { + "x": line.get_xdata().tolist(), + "y": line.get_ydata().tolist(), + "label": line.get_label(), + } + ax_data["data"].append(line_data) + + if plot_type == PlotType.SCATTER: + for collection in ax.collections: + offsets = collection.get_offsets() + scatter_data = { + "label": collection.get_label(), + "x": offsets[:, 0].tolist(), + "y": offsets[:, 1].tolist(), + } + + ax_data["data"].append(scatter_data) + + if plot_type == PlotType.BAR: + for container in ax.containers: + container_data = { + "label": container.get_label(), + "x": [rect.get_x() for rect in container], + "y": [rect.get_height() for rect in container], + "width": [rect.get_width() for rect in container], + } + ax_data["data"].append(container_data) + + # If there are other types of plots (like bar plots), you can access them similarly + data.append(ax_data) - return data + return {'graphs': data} def _data_frame_repr_e2b_data_(self: pandas.DataFrame): - return self.to_dict(orient='list') + return self.to_dict(orient="list") class E2BFormatter(BaseFormatter): - format_type = Unicode('e2b/data') + format_type = Unicode("e2b/data") - print_method = ObjectName('_repr_e2b_data_') + print_method = ObjectName("_repr_e2b_data_") _return_type = (dict, str) type_printers = {pandas.DataFrame: _data_frame_repr_e2b_data_} diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index 2682c33f..ba49f2a8 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -8,4 +8,6 @@ class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") context_id: Optional[StrictStr] = Field(default="default", description="Context ID") - env_vars: Optional[EnvVars] = Field(description="Environment variables", default=None) + env_vars: Optional[EnvVars] = Field( + description="Environment variables", default=None + ) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 9b701bfa..09c45819 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -65,7 +65,18 @@ def __init__(self, is_main_result: bool, data: [str, str]): def formats(self) -> Iterable[str]: formats = [] - for key in ["text", "html", "markdown", "svg", "png", "jpeg", "pdf", "latex", "json", "javascript"]: + for key in [ + "text", + "html", + "markdown", + "svg", + "png", + "jpeg", + "pdf", + "latex", + "json", + "javascript", + ]: if getattr(self, key): formats.append(key) diff --git a/template/server/main.py b/template/server/main.py index d835e4cb..c8eb98c5 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -95,7 +95,9 @@ async def execute(request: ExecutionRequest): revert_env_vars = {**global_env_vars, **current_env_vars} - return StreamingListJsonResponse(ws.execute(request.code, revert_env_vars=revert_env_vars)) + return StreamingListJsonResponse( + ws.execute(request.code, revert_env_vars=revert_env_vars) + ) @app.post("/contexts") diff --git a/template/server/messaging.py b/template/server/messaging.py index 44760538..e030d2aa 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -15,7 +15,12 @@ from api.models.error import Error from api.models.logs import Stdout, Stderr from api.models.result import Result -from api.models.output import EndOfExecution, NumberOfExecutions, OutputType, UnexpectedEndOfExecution +from api.models.output import ( + EndOfExecution, + NumberOfExecutions, + OutputType, + UnexpectedEndOfExecution, +) logger = logging.getLogger(__name__) @@ -30,7 +35,7 @@ def __init__(self, in_background: bool = False): Stderr, EndOfExecution, NumberOfExecutions, - UnexpectedEndOfExecution + UnexpectedEndOfExecution, ] ]() self.input_accepted = False @@ -74,7 +79,9 @@ async def connect(self): name="receive_message", ) - def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr], background: bool) -> str: + def _get_execute_request( + self, msg_id: str, code: Union[str, StrictStr], background: bool + ) -> str: return json.dumps( { "header": { @@ -96,7 +103,12 @@ def _get_execute_request(self, msg_id: str, code: Union[str, StrictStr], backgro } ) - async def execute(self, code: Union[str, StrictStr], background: bool = False, revert_env_vars: Dict[StrictStr, str] = None): + async def execute( + self, + code: Union[str, StrictStr], + background: bool = False, + revert_env_vars: Dict[StrictStr, str] = None, + ): message_id = str(uuid.uuid4()) logger.debug(f"Sending execution for code ({message_id}): {code}") @@ -128,7 +140,9 @@ async def execute(self, code: Union[str, StrictStr], background: bool = False, r if revert_env_vars: code = "%reset" - code += "\n" + "\n".join([f"%set_env {key} {value}" for key, value in revert_env_vars.items()]) + code += "\n" + "\n".join( + [f"%set_env {key} {value}" for key, value in revert_env_vars.items()] + ) async for _ in self.execute(code): pass @@ -142,14 +156,14 @@ async def set_env_vars(self, env_vars: Dict[StrictStr, str]): async def get_env_vars(self) -> Dict[StrictStr, str]: env_vars = {} async for output in self.execute("%env"): - if output['type'] == OutputType.RESULT: - env_vars = json.loads(output['text'].replace("'", '"')) + if output["type"] == OutputType.RESULT: + env_vars = json.loads(output["text"].replace("'", '"')) for key in env_vars: - if any(s in key.lower() for s in ('key', 'token', 'secret')): + if any(s in key.lower() for s in ("key", "token", "secret")): async for output in self.execute(f"%env {key}"): - if output['type'] == OutputType.RESULT: - env_vars[key] = output['text'] + if output["type"] == OutputType.RESULT: + env_vars[key] = output["text"] return env_vars From 5f2be115b876d78b36e1a68ffd78cc1c5086055c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 27 Aug 2024 17:25:38 +0000 Subject: [PATCH 272/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 36508154..b316ecd4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.2", + "version": "0.0.9-beta.3", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 5ab585e1..9ec4c8c2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b10" +version = "0.0.11b11" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5bda38a7e661d3084b4fed39a6137d3b67d06315 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 28 Aug 2024 13:37:22 +0200 Subject: [PATCH 273/722] Fix JS tests --- js/tests/envVars.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index 62af21a8..cfe12942 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -5,7 +5,7 @@ import { CodeInterpreter } from "../src"; // Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. sandboxTest('env vars', async () => { - const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { TEST_ENV_VAR: "supertest" } }) + const sandbox = await CodeInterpreter.create({ envs: { TEST_ENV_VAR: "supertest" } }) const result = await sandbox.notebook.execCell(`import os; x = os.getenv('TEST_ENV_VAR'); x`) expect(result.results[0].text.trim()).toEqual('supertest') @@ -18,7 +18,7 @@ sandboxTest('env vars on sandbox', async ({sandbox}) => { }) sandboxTest('env vars on sandbox override', async () => { - const sandbox = await CodeInterpreter.create('g0zptwsuemevq896f2u3', { envs: { FOO: "bar", SBX: "value" } }) + const sandbox = await CodeInterpreter.create({ envs: { FOO: "bar", SBX: "value" } }) await sandbox.notebook.execCell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "baz"}}) From 713dc8547c480af5e5e0356169b9e1475c0ad444 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Aug 2024 11:38:20 +0000 Subject: [PATCH 274/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index b316ecd4..d45194fa 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.3", + "version": "0.0.9-beta.4", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9ec4c8c2..389be970 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b11" +version = "0.0.11b12" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From df9b5f645278e2554351c017a8f3abb031690faf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 28 Aug 2024 14:23:32 +0200 Subject: [PATCH 275/722] Update js package --- js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/package.json b/js/package.json index d45194fa..efdf53e3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.4", + "version": "0.0.9-beta.39", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From 8e117bc298a45daf49d57e7318b08d112c51d006 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Aug 2024 12:24:19 +0000 Subject: [PATCH 276/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index efdf53e3..c16b211b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.39", + "version": "0.0.9-beta.40", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 389be970..17560ff5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b12" +version = "0.0.11b13" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 6e041b9eccbeac056bf064a9ee6ab6eef95ca152 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 28 Aug 2024 15:52:25 +0200 Subject: [PATCH 277/722] Fix data tests --- python/tests/async/test_async_data.py | 1 + python/tests/sync/test_data.py | 1 + 2 files changed, 2 insertions(+) diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py index f02d9a69..25a09fc0 100644 --- a/python/tests/async/test_async_data.py +++ b/python/tests/async/test_async_data.py @@ -5,6 +5,7 @@ async def test_data(async_sandbox: AsyncCodeInterpreter): # plot random graph result = await async_sandbox.notebook.exec_cell( """ + import pandas as pd pd.DataFrame({"a": [1, 2, 3]}) """ ) diff --git a/python/tests/sync/test_data.py b/python/tests/sync/test_data.py index 0352de48..99e02ce5 100644 --- a/python/tests/sync/test_data.py +++ b/python/tests/sync/test_data.py @@ -5,6 +5,7 @@ def test_data(sandbox: CodeInterpreter): # plot random graph result = sandbox.notebook.exec_cell( """ + import pandas as pd pd.DataFrame({"a": [1, 2, 3]}) """ ) From 14dce4c3b5f56cf03068f142ed7066d9b8734ac7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 28 Aug 2024 16:03:56 +0200 Subject: [PATCH 278/722] Fix Figure import bug --- python/tests/async/test_async_env_vars.py | 13 +++++++++---- python/tests/sync/test_env_vars.py | 8 ++++++-- template/ipython_startup_script.py | 5 ++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 411ce163..8cdc0662 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -9,14 +9,20 @@ async def test_env_vars_sandbox(): async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): - result = await async_sandbox.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "bar"}) + result = await async_sandbox.notebook.exec_cell( + "import os; os.getenv('FOO')", envs={"FOO": "bar"} + ) assert result.text == "bar" async def test_env_vars_override(): sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) - await sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") - result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) + await sbx.notebook.exec_cell( + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + ) + result = await sbx.notebook.exec_cell( + "import os; os.getenv('FOO')", envs={"FOO": "baz"} + ) assert result.text == "baz" result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") @@ -29,4 +35,3 @@ async def test_env_vars_override(): assert result.text == "bar" await sbx.kill() - diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 38e87f92..a6738928 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -9,13 +9,17 @@ async def test_env_vars_sandbox(): async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): - result = sandbox.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "bar"}) + result = sandbox.notebook.exec_cell( + "import os; os.getenv('FOO')", envs={"FOO": "bar"} + ) assert result.text == "bar" async def test_env_vars_override(): sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) - sbx.notebook.exec_cell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") + sbx.notebook.exec_cell( + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + ) result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py index 6943a483..7c2fe32e 100644 --- a/template/ipython_startup_script.py +++ b/template/ipython_startup_script.py @@ -106,8 +106,11 @@ class E2BFormatter(BaseFormatter): type_printers = {pandas.DataFrame: _data_frame_repr_e2b_data_} def __call__(self, obj): + # Figure object is for some reason removed on execution of the cell, + # so it can't be used in type_printers or with top-level import + from matplotlib.pyplot import Figure + if isinstance(obj, Figure): - # Figure object is for some reason removed from type_printers return _figure_repr_e2b_data_(obj) return super().__call__(obj) From a474640a7f301603e6d2804c323bcc6858340bf3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Aug 2024 14:04:59 +0000 Subject: [PATCH 279/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c16b211b..2765a6a4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.40", + "version": "0.0.9-beta.41", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 17560ff5..cc9fdff4 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b13" +version = "0.0.11b14" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 08c2420bd6fa37141253fe9c52c211ac20debf34 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 28 Aug 2024 16:05:01 +0200 Subject: [PATCH 280/722] Fix missing import in JS test --- js/tests/data.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/tests/data.test.ts b/js/tests/data.test.ts index 8a638ed3..aede4587 100644 --- a/js/tests/data.test.ts +++ b/js/tests/data.test.ts @@ -3,7 +3,10 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('get data', async ({ sandbox }) => { - const execution = await sandbox.notebook.execCell('pd.DataFrame({"a": [1, 2, 3]})') + const execution = await sandbox.notebook.execCell(` +import pandas as pd +pd.DataFrame({"a": [1, 2, 3]}) +`) const result = execution.results[0] expect(result.data).toBeDefined() From 5d63d501ad1a902258b4dde4fe5dc76339b5fd45 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 Aug 2024 14:05:57 +0000 Subject: [PATCH 281/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 2765a6a4..1cc8ab28 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.41", + "version": "0.0.9-beta.42", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index cc9fdff4..8bbdfb14 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b14" +version = "0.0.11b15" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From a799cec048c415fa3b79c83ec93b6cac74186e9b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 4 Sep 2024 10:11:37 +0200 Subject: [PATCH 282/722] Improve logs and improvements --- template/server/api/models/result.py | 2 +- template/server/messaging.py | 29 ++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 09c45819..12610289 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -40,7 +40,7 @@ class Result(BaseModel): "Extra data that can be included. Not part of the standard types." is_main_result: Optional[bool] = None - "Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell." + "Whether this data is the result of the execetution. Data can be produced by display calls of which can be multiple in a cell." def __init__(self, is_main_result: bool, data: [str, str]): super().__init__() diff --git a/template/server/messaging.py b/template/server/messaging.py index e030d2aa..bafa749f 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -44,6 +44,7 @@ def __init__(self, in_background: bool = False): class JupyterKernelWebSocket: _ws: Optional[WebSocketClientProtocol] = None + _receive_task: Optional[asyncio.Task] = None def __init__( self, @@ -110,7 +111,7 @@ async def execute( revert_env_vars: Dict[StrictStr, str] = None, ): message_id = str(uuid.uuid4()) - logger.debug(f"Sending execution for code ({message_id}): {code}") + logger.debug(f"Sending code for the execution ({message_id}): {code}") self._executions[message_id] = Execution(in_background=background) request = self._get_execute_request(message_id, code, background) @@ -135,7 +136,6 @@ async def execute( ) break - logger.debug(f"Got result for code ({message_id}): {output}") yield output.model_dump(exclude_none=True) if revert_env_vars: @@ -174,7 +174,6 @@ async def _receive_message(self): try: async for message in self._ws: - logger.debug(f"WebSocket received message: {message}".strip()) await self._process_message(json.loads(message)) except Exception as e: logger.error(f"WebSocket received error while receiving messages: {e}") @@ -194,15 +193,13 @@ async def _process_message(self, data: dict): logger.warning("Parent message ID not found. %s", data) return - logger.debug(f"Received message {data['msg_type']} for {parent_msg_ig}") - execution = self._executions.get(parent_msg_ig) if not execution: return queue = execution.queue if data["msg_type"] == "error": - logger.debug(f"Cell {parent_msg_ig} finished execution with error") + logger.debug(f"Execution {parent_msg_ig} finished execution with error") await queue.put( Error( name=data["content"]["ename"], @@ -213,6 +210,7 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": + logger.debug(f"Execution {parent_msg_ig} received stdout") await queue.put( Stdout( text=data["content"]["text"], timestamp=data["header"]["date"] @@ -220,6 +218,7 @@ async def _process_message(self, data: dict): ) elif data["content"]["name"] == "stderr": + logger.debug(f"Execution {parent_msg_ig} received stderr") await queue.put( Stderr( text=data["content"]["text"], timestamp=data["header"]["date"] @@ -227,21 +226,27 @@ async def _process_message(self, data: dict): ) elif data["msg_type"] in "display_data": - await queue.put(Result(is_main_result=False, data=data["content"]["data"])) + result = Result(is_main_result=False, data=data["content"]["data"]) + logger.debug(f"Execution {parent_msg_ig} received display data with following formats: {result.formats()}") + await queue.put(result) + elif data["msg_type"] == "execute_result": - await queue.put(Result(is_main_result=True, data=data["content"]["data"])) + result = Result(is_main_result=True, data=data["content"]["data"]) + logger.debug(f"Execution {parent_msg_ig} received execution result with following formats: {result.formats()}") + await queue.put(result) + elif data["msg_type"] == "status": if data["content"]["execution_state"] == "busy" and execution.in_background: - logger.debug(f"Cell {parent_msg_ig} started execution") + logger.debug(f"Execution {parent_msg_ig} started execution") execution.input_accepted = True if data["content"]["execution_state"] == "idle": if execution.input_accepted: - logger.debug(f"Cell {parent_msg_ig} finished execution") + logger.debug(f"Execution {parent_msg_ig} finished execution") await queue.put(EndOfExecution()) elif data["content"]["execution_state"] == "error": - logger.debug(f"Cell {parent_msg_ig} finished execution with error") + logger.debug(f"Execution {parent_msg_ig} finished execution with error") await queue.put( Error( name=data["content"]["ename"], @@ -253,7 +258,7 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "execute_reply": if data["content"]["status"] == "error": - logger.debug(f"Cell {parent_msg_ig} finished execution with error") + logger.debug(f"Execution {parent_msg_ig} finished execution with error") await queue.put( Error( name=data["content"]["ename"], From e3a7ab28b017f90423b3a40386247c024ddc7433 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Sep 2024 08:12:29 +0000 Subject: [PATCH 283/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 1cc8ab28..31f7b901 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.42", + "version": "0.0.9-beta.43", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 8bbdfb14..75ae95ea 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b15" +version = "0.0.11b16" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 655b55b5da9c2eec05208ae3cf175a1a3588de0a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 4 Sep 2024 15:33:04 +0200 Subject: [PATCH 284/722] Create separate venv for server --- template/e2b.Dockerfile | 5 ++++- template/server/requirements.txt | 3 ++- template/start-up.sh | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 0583b94f..9e3f8c28 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -37,10 +37,13 @@ RUN ijsinstall --install=global RUN pip install bash_kernel RUN python -m bash_kernel.install +# Create separate virtual environment for server +RUN python -m venv $SERVER_PATH/.venv + # Copy server and its requirements RUN mkdir -p $SERVER_PATH/ COPY ./server/requirements.txt $SERVER_PATH -RUN pip install --no-cache-dir -r $SERVER_PATH/requirements.txt +RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt COPY ./server $SERVER_PATH # Copy Jupyter configuration diff --git a/template/server/requirements.txt b/template/server/requirements.txt index ea4e389d..b6138de5 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -1,4 +1,5 @@ fastapi==0.111.0 httpx==0.27.0 websockets==12.0 -uvicorn[standard]==0.30.1 \ No newline at end of file +uvicorn[standard]==0.30.1 +requests==2.32.3 diff --git a/template/start-up.sh b/template/start-up.sh index ec9e8116..5e149d00 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -26,7 +26,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null cd /root/.server/ - uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors + /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors } export PATH="/opt/java/openjdk/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" From 97eb3629573f8448e47ec14761de18cc7afb5586 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Sep 2024 13:34:02 +0000 Subject: [PATCH 285/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 31f7b901..d8c35a0b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.43", + "version": "0.0.9-beta.44", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 75ae95ea..50c44b4f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b16" +version = "0.0.11b17" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 1e5aacb5abf9c1b1a51b156ec02569cf2191efdd Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 4 Sep 2024 20:54:05 +0200 Subject: [PATCH 286/722] Fix bar type --- template/ipython_startup_script.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/template/ipython_startup_script.py b/template/ipython_startup_script.py index 7c2fe32e..5be0a228 100644 --- a/template/ipython_startup_script.py +++ b/template/ipython_startup_script.py @@ -24,14 +24,14 @@ def get_type_of_plot(ax: Axes) -> PlotType: if any(isinstance(line, Line2D) for line in ax.get_lines()): return PlotType.LINE - # Check for Bar plots (Rectangle objects with height > 0) - if any(isinstance(rect, Rectangle) for rect in ax.get_children()): - return PlotType.BAR - # Check for Scatter plots if any(isinstance(collection, PathCollection) for collection in ax.collections): return PlotType.SCATTER + # Check for Bar plots (Rectangle objects with height > 0) + if any(isinstance(rect, Rectangle) for rect in ax.get_children()): + return PlotType.BAR + return PlotType.UNKNOWN From 64e465000a587430b545f3cd972a1e98bf6873fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Sep 2024 18:55:02 +0000 Subject: [PATCH 287/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index d8c35a0b..cc46d58d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.44", + "version": "0.0.9-beta.45", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 50c44b4f..b5248ea7 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b17" +version = "0.0.11b18" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5c07ba80e126d17ca7919dfa8a24acf285ae8c55 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 4 Sep 2024 21:07:50 +0200 Subject: [PATCH 288/722] Speed up build process --- .github/workflows/template.yml | 2 +- template/Dockerfile | 62 +++++++++++++++++++++++++++++++++ template/e2b.Dockerfile | 63 +--------------------------------- 3 files changed, 64 insertions(+), 63 deletions(-) create mode 100644 template/Dockerfile diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 80a84f57..f96b41e5 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -36,7 +36,7 @@ jobs: run: | docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true docker buildx build \ - --file e2b.Dockerfile \ + --file Dockerfile \ --platform linux/amd64 \ --push \ --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . diff --git a/template/Dockerfile b/template/Dockerfile new file mode 100644 index 00000000..9e3f8c28 --- /dev/null +++ b/template/Dockerfile @@ -0,0 +1,62 @@ +FROM python:3.10.14 + +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" + +RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ + build-essential curl git util-linux jq sudo nodejs npm + +ENV PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + JUPYTER_CONFIG_PATH="/root/.jupyter" \ + IPYTHON_CONFIG_PATH="/root/.ipython" \ + SERVER_PATH="/root/.server" + +# Install Jupyter +COPY ./requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user + +# R Kernel +RUN apt-get update && apt-get install -y r-base +RUN R -e "install.packages('IRkernel')" +RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" + +# Java Kernel +RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ + unzip ijava-1.3.0.zip && \ + python install.py --sys-prefix + +# Javascript Kernel +RUN npm install -g node-gyp +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + +# Bash Kernel +RUN pip install bash_kernel +RUN python -m bash_kernel.install + +# Create separate virtual environment for server +RUN python -m venv $SERVER_PATH/.venv + +# Copy server and its requirements +RUN mkdir -p $SERVER_PATH/ +COPY ./server/requirements.txt $SERVER_PATH +RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt +COPY ./server $SERVER_PATH + +# Copy Jupyter configuration +COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ +RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh + +COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ + +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default +COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ + +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup +COPY ./ipython_startup_script.py $IPYTHON_CONFIG_PATH/profile_default/startup/00-startup.py + +# Setup entrypoint for local development +ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile index 9e3f8c28..47fb7712 100644 --- a/template/e2b.Dockerfile +++ b/template/e2b.Dockerfile @@ -1,62 +1 @@ -FROM python:3.10.14 - -ENV JAVA_HOME=/opt/java/openjdk -COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME -ENV PATH="${JAVA_HOME}/bin:${PATH}" - -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo nodejs npm - -ENV PIP_DEFAULT_TIMEOUT=100 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PIP_NO_CACHE_DIR=1 \ - JUPYTER_CONFIG_PATH="/root/.jupyter" \ - IPYTHON_CONFIG_PATH="/root/.ipython" \ - SERVER_PATH="/root/.server" - -# Install Jupyter -COPY ./requirements.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user - -# R Kernel -RUN apt-get update && apt-get install -y r-base -RUN R -e "install.packages('IRkernel')" -RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" - -# Java Kernel -RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ - unzip ijava-1.3.0.zip && \ - python install.py --sys-prefix - -# Javascript Kernel -RUN npm install -g node-gyp -RUN npm install -g --unsafe-perm ijavascript -RUN ijsinstall --install=global - -# Bash Kernel -RUN pip install bash_kernel -RUN python -m bash_kernel.install - -# Create separate virtual environment for server -RUN python -m venv $SERVER_PATH/.venv - -# Copy server and its requirements -RUN mkdir -p $SERVER_PATH/ -COPY ./server/requirements.txt $SERVER_PATH -RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt -COPY ./server $SERVER_PATH - -# Copy Jupyter configuration -COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ -RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh - -COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default -COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup -COPY ./ipython_startup_script.py $IPYTHON_CONFIG_PATH/profile_default/startup/00-startup.py - -# Setup entrypoint for local development -ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh +FROM e2bdev/code-interpreter:latest From 5568cde565d495a535a12fceabad8e36da901045 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Sep 2024 19:09:03 +0000 Subject: [PATCH 289/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index cc46d58d..7699a1e5 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.45", + "version": "0.0.9-beta.46", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index b5248ea7..ed046b21 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b18" +version = "0.0.11b19" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From dd7f8a430401f00ad61920bc7384b472cc143061 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 12:48:19 +0200 Subject: [PATCH 290/722] Skip test which doesn't work for local testing --- python/tests/async/test_async_execution_count.py | 3 +++ python/tests/async/test_async_kernels.py | 5 +++++ python/tests/sync/test_execution_count.py | 3 +++ python/tests/sync/test_kernels.py | 5 +++++ 4 files changed, 16 insertions(+) diff --git a/python/tests/async/test_async_execution_count.py b/python/tests/async/test_async_execution_count.py index 01337f6e..6192fa76 100644 --- a/python/tests/async/test_async_execution_count.py +++ b/python/tests/async/test_async_execution_count.py @@ -1,6 +1,9 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +@pytest.mark.skip_debug() async def test_execution_count(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = await async_sandbox.notebook.exec_cell("!pwd") diff --git a/python/tests/async/test_async_kernels.py b/python/tests/async/test_async_kernels.py index 9acddd89..6d97ccee 100644 --- a/python/tests/async/test_async_kernels.py +++ b/python/tests/async/test_async_kernels.py @@ -1,3 +1,5 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter @@ -14,6 +16,7 @@ async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest.mark.skip_debug() async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("x = 1") await async_sandbox.notebook.restart_kernel() @@ -23,6 +26,7 @@ async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest.mark.skip_debug() async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): kernels = await async_sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -33,6 +37,7 @@ async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): assert len(kernels) == 2 +@pytest.mark.skip_debug() async def test_shutdown(async_sandbox: AsyncCodeInterpreter): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() diff --git a/python/tests/sync/test_execution_count.py b/python/tests/sync/test_execution_count.py index ede25a56..9d474929 100644 --- a/python/tests/sync/test_execution_count.py +++ b/python/tests/sync/test_execution_count.py @@ -1,6 +1,9 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +@pytest.mark.skip_debug() def test_execution_count(sandbox: CodeInterpreter): sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = sandbox.notebook.exec_cell("!pwd") diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index 2dde711c..f48ff062 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -1,3 +1,5 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter @@ -14,6 +16,7 @@ def test_independence_of_kernels(sandbox: CodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest.mark.skip_debug() def test_restart_kernel(sandbox: CodeInterpreter): sandbox.notebook.exec_cell("x = 1") sandbox.notebook.restart_kernel() @@ -23,6 +26,7 @@ def test_restart_kernel(sandbox: CodeInterpreter): assert r.error.value == "name 'x' is not defined" +@pytest.mark.skip_debug() def test_list_kernels(sandbox: CodeInterpreter): kernels = sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -33,6 +37,7 @@ def test_list_kernels(sandbox: CodeInterpreter): assert len(kernels) == 2 +@pytest.mark.skip_debug() def test_shutdown(sandbox: CodeInterpreter): kernel_id = sandbox.notebook.create_kernel() kernels = sandbox.notebook.list_kernels() From 457f670bb10416b0c2ba14a60073e5704732c7a4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 12:54:33 +0200 Subject: [PATCH 291/722] Add dockerfile for testing --- Makefile | 2 +- template/Dockerfile | 2 +- template/test.Dockerfile | 63 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 template/test.Dockerfile diff --git a/Makefile b/Makefile index 493cc9cf..251a98db 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ start-template-server: - docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/e2b.Dockerfile) + docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/test.Dockerfile) kill-template-server: docker kill $(shell docker ps --filter expose=49999 --format {{.ID}}) diff --git a/template/Dockerfile b/template/Dockerfile index 9e3f8c28..91a43a4a 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -56,7 +56,7 @@ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup -COPY ./ipython_startup_script.py $IPYTHON_CONFIG_PATH/profile_default/startup/00-startup.py +COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup # Setup entrypoint for local development ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/test.Dockerfile b/template/test.Dockerfile new file mode 100644 index 00000000..edc50968 --- /dev/null +++ b/template/test.Dockerfile @@ -0,0 +1,63 @@ +FROM python:3.10.14 + +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" + +RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ + build-essential curl git util-linux jq sudo nodejs npm + +ENV PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + JUPYTER_CONFIG_PATH="/root/.jupyter" \ + IPYTHON_CONFIG_PATH="/root/.ipython" \ + SERVER_PATH="/root/.server" + +# Install Jupyter +COPY ./requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user + +# R Kernel +RUN apt-get update && apt-get install -y r-base +RUN R -e "install.packages('IRkernel')" +RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" + +# Java Kernel +RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ + unzip ijava-1.3.0.zip && \ + python install.py --sys-prefix + +# Javascript Kernel +RUN npm install -g node-gyp +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + +# Bash Kernel +RUN pip install bash_kernel +RUN python -m bash_kernel.install + +# Create separate virtual environment for server +RUN python -m venv $SERVER_PATH/.venv + +# Copy server and its requirements +RUN mkdir -p $SERVER_PATH/ +COPY ./server/requirements.txt $SERVER_PATH +RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt +COPY ./server $SERVER_PATH + +# Copy Jupyter configuration +COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ +RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh + +COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ + +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default +COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ + +RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup +COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup + +# Setup entrypoint for local development +WORKDIR /home/user +ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh From 5b7c3d478bafd40e543476100467b3f55e09d051 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 12:59:16 +0200 Subject: [PATCH 292/722] Refactor env variables + add lock to keep the execution order --- template/server/errors.py | 2 + template/server/main.py | 26 ++--- template/server/messaging.py | 94 ++++++++++--------- template/startup_scripts/0001_envs.py | 56 +++++++++++ .../0002_data.py} | 10 +- 5 files changed, 123 insertions(+), 65 deletions(-) create mode 100644 template/server/errors.py create mode 100644 template/startup_scripts/0001_envs.py rename template/{ipython_startup_script.py => startup_scripts/0002_data.py} (94%) diff --git a/template/server/errors.py b/template/server/errors.py new file mode 100644 index 00000000..ab4b43bc --- /dev/null +++ b/template/server/errors.py @@ -0,0 +1,2 @@ +class ExecutionError(Exception): + pass diff --git a/template/server/main.py b/template/server/main.py index c8eb98c5..202a6dc6 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -11,7 +11,7 @@ from api.models.context import Context from api.models.create_context import CreateContext from api.models.execution_request import ExecutionRequest -from envs import get_envs +from errors import ExecutionError from messaging import JupyterKernelWebSocket from stream import StreamingListJsonResponse @@ -73,7 +73,6 @@ async def health(): async def execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") - global_env_vars = get_envs() if request.context_id: ws = websockets.get(request.context_id) @@ -85,18 +84,8 @@ async def execute(request: ExecutionRequest): else: ws = websockets["default"] - revert_env_vars = None - env_vars = {**global_env_vars, **(request.env_vars or {})} - if env_vars: - current_env_vars = await ws.get_env_vars() - - env_vars = {**global_env_vars, **current_env_vars, **(request.env_vars or {})} - await ws.set_env_vars(env_vars) - - revert_env_vars = {**global_env_vars, **current_env_vars} - return StreamingListJsonResponse( - ws.execute(request.code, revert_env_vars=revert_env_vars) + ws.execute(request.code, env_vars=request.env_vars) ) @@ -136,12 +125,15 @@ async def create_context(request: CreateContext) -> Context: websockets[kernel_id] = ws - async for item in ws.execute(f"%cd {request.cwd}", background=True): - if item["type"] == "error": + if request.cwd: + logger.info(f"Setting working directory to {request.cwd}") + try: + await ws.change_current_directory(request.cwd) + except ExecutionError as e: raise HTTPException( status_code=500, - detail=f"Failed to set working directory: {item}", - ) + detail="Failed to set working directory", + ) from e return Context(name=request.name, id=kernel_id, cwd=request.cwd) diff --git a/template/server/messaging.py b/template/server/messaging.py index bafa749f..53c265eb 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -4,6 +4,7 @@ import asyncio from asyncio import Queue +from envs import get_envs from typing import ( Dict, Optional, @@ -21,6 +22,7 @@ OutputType, UnexpectedEndOfExecution, ) +from errors import ExecutionError logger = logging.getLogger(__name__) @@ -60,6 +62,7 @@ def __init__( self.session_id = session_id self._executions: Dict[str, Execution] = {} + self._lock = asyncio.Lock() async def connect(self): logger.debug(f"WebSocket connecting to {self.url}") @@ -104,24 +107,9 @@ def _get_execute_request( } ) - async def execute( - self, - code: Union[str, StrictStr], - background: bool = False, - revert_env_vars: Dict[StrictStr, str] = None, - ): - message_id = str(uuid.uuid4()) - logger.debug(f"Sending code for the execution ({message_id}): {code}") - - self._executions[message_id] = Execution(in_background=background) - request = self._get_execute_request(message_id, code, background) - - if self._ws is None: - raise Exception("WebSocket not connected") - - await self._ws.send(request) - + async def _wait_for_result(self, message_id: str): queue = self._executions[message_id].queue + while True: output = await queue.get() if output.type == OutputType.END_OF_EXECUTION: @@ -138,34 +126,48 @@ async def execute( yield output.model_dump(exclude_none=True) - if revert_env_vars: - code = "%reset" - code += "\n" + "\n".join( - [f"%set_env {key} {value}" for key, value in revert_env_vars.items()] - ) - async for _ in self.execute(code): - pass + async def change_current_directory(self, path: Union[str, StrictStr]): + message_id = str(uuid.uuid4()) + self._executions[message_id] = Execution(in_background=True) + request = self._get_execute_request(message_id, f"%cd {path}", True) - del self._executions[message_id] + await self._ws.send(request) - async def set_env_vars(self, env_vars: Dict[StrictStr, str]): - code = "\n".join([f"%set_env {key} {value}" for key, value in env_vars.items()]) - async for _ in self.execute(code): - pass + async for item in self._wait_for_result(message_id): + if item["type"] == "error": + raise ExecutionError(f"Error during execution: {item}") - async def get_env_vars(self) -> Dict[StrictStr, str]: - env_vars = {} - async for output in self.execute("%env"): - if output["type"] == OutputType.RESULT: - env_vars = json.loads(output["text"].replace("'", '"')) + async def execute( + self, + code: Union[str, StrictStr], + env_vars: Dict[StrictStr, str] = None, + ): + message_id = str(uuid.uuid4()) + logger.debug(f"Sending code for the execution ({message_id}): {code}") - for key in env_vars: - if any(s in key.lower() for s in ("key", "token", "secret")): - async for output in self.execute(f"%env {key}"): - if output["type"] == OutputType.RESULT: - env_vars[key] = output["text"] + self._executions[message_id] = Execution() - return env_vars + if self._ws is None: + raise Exception("WebSocket not connected") + + global_env_vars = get_envs() + env_vars = {**global_env_vars, **env_vars} if env_vars else global_env_vars + async with self._lock: + if env_vars: + vars_to_set = {**global_env_vars, **env_vars} + code = f"os.environ.set_envs_for_execution({vars_to_set})\n" + code + + logger.info(code) + request = self._get_execute_request(message_id, code, False) + + # Send the code for execution + await self._ws.send(request) + + # Stream the results + async for item in self._wait_for_result(message_id): + yield item + + del self._executions[message_id] async def _receive_message(self): if not self._ws: @@ -199,7 +201,9 @@ async def _process_message(self, data: dict): queue = execution.queue if data["msg_type"] == "error": - logger.debug(f"Execution {parent_msg_ig} finished execution with error") + logger.debug( + f"Execution {parent_msg_ig} finished execution with error: {data['content']['ename']}: {data['content']['evalue']}" + ) await queue.put( Error( name=data["content"]["ename"], @@ -227,12 +231,16 @@ async def _process_message(self, data: dict): elif data["msg_type"] in "display_data": result = Result(is_main_result=False, data=data["content"]["data"]) - logger.debug(f"Execution {parent_msg_ig} received display data with following formats: {result.formats()}") + logger.debug( + f"Execution {parent_msg_ig} received display data with following formats: {result.formats()}" + ) await queue.put(result) elif data["msg_type"] == "execute_result": result = Result(is_main_result=True, data=data["content"]["data"]) - logger.debug(f"Execution {parent_msg_ig} received execution result with following formats: {result.formats()}") + logger.debug( + f"Execution {parent_msg_ig} received execution result with following formats: {result.formats()}" + ) await queue.put(result) elif data["msg_type"] == "status": diff --git a/template/startup_scripts/0001_envs.py b/template/startup_scripts/0001_envs.py new file mode 100644 index 00000000..b813df88 --- /dev/null +++ b/template/startup_scripts/0001_envs.py @@ -0,0 +1,56 @@ +import os +import IPython + + +class E2BEnviron(os._Environ): + return_values = {} + keys_to_remove = set() + + def __setitem__(self, key, value): + super().__setitem__(key, value) + self.return_values.pop(key, None) + self.keys_to_remove.discard(key) + + def __delitem__(self, key): + super().__delitem__(key) + self.return_values.pop(key, None) + self.keys_to_remove.discard(key) + + def set_envs_for_execution(self, update=None): + update = update or {} + + return_values = { + key: self[key] for key in set(self.keys()).intersection(update.keys()) + } + keys_to_remove = set(update.keys()).difference(self.keys()) + + self.update(update) + + self.return_values = return_values + self.keys_to_remove = keys_to_remove + + def reset_envs_for_execution(self): + for key in self.keys_to_remove: + self.pop(key) + self.update(self.return_values) + self.keys_to_remove.clear() + self.return_values.clear() + + +e2b_environ = E2BEnviron( + {}, + os.environ.encodekey, + os.environ.decodekey, + os.environ.encodekey, + os.environ.decodekey, +) +e2b_environ.update(os.environ) +os.environ = e2b_environ + + +def reset_envs(_): + os.environ.reset_envs_for_execution() + + +ip = IPython.get_ipython() +ip.events.register("post_run_cell", reset_envs) diff --git a/template/ipython_startup_script.py b/template/startup_scripts/0002_data.py similarity index 94% rename from template/ipython_startup_script.py rename to template/startup_scripts/0002_data.py index 5be0a228..9f2afae6 100644 --- a/template/ipython_startup_script.py +++ b/template/startup_scripts/0002_data.py @@ -70,10 +70,10 @@ def _figure_repr_e2b_data_(self: Figure): for collection in ax.collections: offsets = collection.get_offsets() scatter_data = { - "label": collection.get_label(), - "x": offsets[:, 0].tolist(), - "y": offsets[:, 1].tolist(), - } + "label": collection.get_label(), + "x": offsets[:, 0].tolist(), + "y": offsets[:, 1].tolist(), + } ax_data["data"].append(scatter_data) @@ -90,7 +90,7 @@ def _figure_repr_e2b_data_(self: Figure): # If there are other types of plots (like bar plots), you can access them similarly data.append(ax_data) - return {'graphs': data} + return {"graphs": data} def _data_frame_repr_e2b_data_(self: pandas.DataFrame): From 8553e90df3fa8f18bc6068fb45e3ca09c5040a57 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 5 Sep 2024 11:00:13 +0000 Subject: [PATCH 293/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 7699a1e5..c28f32cc 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.46", + "version": "0.0.9-beta.47", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index ed046b21..02910fad 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b19" +version = "0.0.11b20" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 8bb6bf7517a6c350571cd367341f9dc45efe6a89 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 13:19:20 +0200 Subject: [PATCH 294/722] Fix bug with code indentation --- template/server/messaging.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/template/server/messaging.py b/template/server/messaging.py index 53c265eb..1656ae96 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -155,7 +155,16 @@ async def execute( async with self._lock: if env_vars: vars_to_set = {**global_env_vars, **env_vars} - code = f"os.environ.set_envs_for_execution({vars_to_set})\n" + code + + # if there is an indent in the code, we need to add the env vars at the beginning of the code + lines = code.split('\n') + indent = 0 + for i, line in enumerate(lines): + if line.strip() != "": + indent = len(line) - len(line.lstrip()) + break + + code = indent * " " + f"os.environ.set_envs_for_execution({vars_to_set})\n" + code logger.info(code) request = self._get_execute_request(message_id, code, False) From 9eb07a9ce6d1074d75daacef9c213f82863a60a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 5 Sep 2024 11:20:18 +0000 Subject: [PATCH 295/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c28f32cc..8b5c5207 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.47", + "version": "0.0.9-beta.48", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 02910fad..34ec3b20 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b20" +version = "0.0.11b21" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 3cc466e0b5a60b8a596a2180feb0cecb3155889a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 14:09:42 +0200 Subject: [PATCH 296/722] Fix resetting envs --- template/startup_scripts/0001_envs.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/template/startup_scripts/0001_envs.py b/template/startup_scripts/0001_envs.py index b813df88..b58a7bba 100644 --- a/template/startup_scripts/0001_envs.py +++ b/template/startup_scripts/0001_envs.py @@ -1,3 +1,4 @@ +import copy import os import IPython @@ -30,9 +31,13 @@ def set_envs_for_execution(self, update=None): self.keys_to_remove = keys_to_remove def reset_envs_for_execution(self): - for key in self.keys_to_remove: + keys_to_remove = copy.copy(self.keys_to_remove) + for key in keys_to_remove: self.pop(key) - self.update(self.return_values) + + return_values = copy.copy(self.return_values) + self.update(return_values) + self.keys_to_remove.clear() self.return_values.clear() @@ -48,8 +53,12 @@ def reset_envs_for_execution(self): os.environ = e2b_environ -def reset_envs(_): - os.environ.reset_envs_for_execution() +def reset_envs(*args, **kwargs): + try: + if isinstance(os.environ, E2BEnviron): + os.environ.reset_envs_for_execution() + except Exception as e: + print(f"Failed to reset envs: {e}") ip = IPython.get_ipython() From 5be1706a99845d35727e1e3b359df20973c17a58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 5 Sep 2024 12:10:44 +0000 Subject: [PATCH 297/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 8b5c5207..bab4bbc6 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.48", + "version": "0.0.9-beta.49", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 34ec3b20..2eacbea2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b21" +version = "0.0.11b22" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e2cf32fafa53d02da90bacd3ff3073a961167463 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Sep 2024 15:26:05 +0200 Subject: [PATCH 298/722] Add scales --- template/startup_scripts/0002_data.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 9f2afae6..2e5cd747 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,4 +1,5 @@ import enum +from typing import Literal, Union import pandas from matplotlib.axes import Axes @@ -9,6 +10,7 @@ import IPython from IPython.core.formatters import BaseFormatter +from matplotlib import ticker from traitlets.traitlets import Unicode, ObjectName @@ -35,6 +37,15 @@ def get_type_of_plot(ax: Axes) -> PlotType: return PlotType.UNKNOWN +def _get_ticks(ax: Axes, axes: Literal['x'] | Literal['y']) -> list: + formatter = getattr(ax, f"{axes}axis").get_major_formatter() + if isinstance(formatter, Union[ticker.ScalarFormatter, ticker.LogFormatter]): + return getattr(ax, f"get_{axes}ticks")() + + labels = getattr(ax, f"get_{axes}ticklabels")() + return [line.get_text() for line in labels] + + def _figure_repr_e2b_data_(self: Figure): """ This method is used to extract data from the figure object to a dictionary @@ -49,8 +60,10 @@ def _figure_repr_e2b_data_(self: Figure): "title": ax.get_title(), "x_label": ax.get_xlabel(), "x_ticks": [line.get_text() for line in ax.get_xticklabels()], + "x_scale": ax.get_xscale(), "y_label": ax.get_ylabel(), "y_ticks": [line.get_text() for line in ax.get_yticklabels()], + "y_scale": ax.get_yscale(), "data": [], } From 116e81effa426d1e323dea0f05f4768b11f07662 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 6 Sep 2024 11:05:22 +0200 Subject: [PATCH 299/722] Add tests for basic graphs --- python/tests/graphs/test_bar.py | 56 +++++++++++++++++++++++++ python/tests/graphs/test_line.py | 63 +++++++++++++++++++++++++++++ python/tests/graphs/test_scatter.py | 59 +++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 python/tests/graphs/test_bar.py create mode 100644 python/tests/graphs/test_line.py create mode 100644 python/tests/graphs/test_scatter.py diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py new file mode 100644 index 00000000..3acdd7d7 --- /dev/null +++ b/python/tests/graphs/test_bar.py @@ -0,0 +1,56 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +code = """ +import matplotlib.pyplot as plt + +# Prepare data +authors = ['Author A', 'Author B', 'Author C', 'Author D'] +sales = [100, 200, 300, 400] + +# Create and customize the bar graph +plt.figure(figsize=(10, 6)) +plt.bar(authors, sales) +plt.xlabel('Authors') +plt.ylabel('Number of Books Sold') +plt.title('Book Sales by Authors') + +# Display the graph +plt.tight_layout() +plt.show() +""" + + +async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + data = result.results[0].data + assert data + + graphs = data.get("graphs") + assert graphs + + assert graphs[0]['type'] == "bar" + assert graphs[0]['title'] == "Book Sales by Authors" + + assert graphs[0]['x_label'] == "Authors" + assert graphs[0]['y_label'] == "Number of Books Sold" + + assert all(isinstance(x, int) for x in graphs[0]['x_ticks']) + assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + + assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) + assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + + assert len(graphs[0]['data']) == 1 + + data = graphs[0]['data'][0] + assert len(data['x']) == 4 + assert len(data['y']) == 4 + assert data['orientation'] == "horizontal" + + assert all(isinstance(x, (int, float)) for x in data['widths']) + assert all(isinstance(x, (int, float)) for x in data['heights']) + assert all(isinstance(y, (int, float)) for y in data['x']) + assert all(isinstance(y, (int, float)) for y in data['y']) + diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py new file mode 100644 index 00000000..5986469d --- /dev/null +++ b/python/tests/graphs/test_line.py @@ -0,0 +1,63 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + +code = """ +import numpy as np +import matplotlib.pyplot as plt + +# Generate x values +x = np.linspace(0, 2*np.pi, 100) + +# Calculate y values +y_sin = np.sin(x) +y_cos = np.cos(x) + +# Create the plot +plt.figure(figsize=(10, 6)) +plt.plot(x, y_sin, label='sin(x)') +plt.plot(x, y_cos, label='cos(x)') + +# Add labels and title +plt.xlabel('x') +plt.ylabel('y') +plt.title('Plot of sin(x) and cos(x)') + +# Display the plot +plt.show() +""" + + +async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + data = result.results[0].data + assert data + + graphs = data.get("graphs") + assert graphs + + assert graphs[0]['type'] == "line" + assert graphs[0]['title'] == "Plot of sin(x) and cos(x)" + assert graphs[0]['x_label'] == "x" + assert graphs[0]['y_label'] == "y" + + assert all(isinstance(x, float) for x in graphs[0]['x_ticks']) + assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + + assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) + assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + + assert len(graphs[0]['data']) == 2 + + first_data = graphs[0]['data'][0] + assert first_data['label'] == 'sin(x)' + assert len(first_data['x']) == 100 + assert len(first_data['y']) == 100 + assert all(isinstance(x, float) for x in first_data['x']) + assert all(isinstance(y, float) for y in first_data['y']) + + second_data = graphs[0]['data'][1] + assert second_data['label'] == 'cos(x)' + assert len(second_data['x']) == 100 + assert len(second_data['y']) == 100 + assert all(isinstance(x, float) for x in second_data['x']) + assert all(isinstance(y, float) for y in second_data['y']) diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py new file mode 100644 index 00000000..4d933b8a --- /dev/null +++ b/python/tests/graphs/test_scatter.py @@ -0,0 +1,59 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Create data +N = 5 +x1 = np.random.rand(N) +y1 = np.random.rand(N) +x2 = np.random.rand(2*N) +y2 = np.random.rand(2*N) + +plt.xlabel("A") +plt.ylabel("B") + +plt.scatter(x1, y1, c='blue', label='Dataset 1') +plt.scatter(x2, y2, c='red', label='Dataset 2') + +plt.show() +""" + + +async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + data = result.results[0].data + assert data + + graphs = data.get("graphs") + assert graphs + + assert graphs[0]['type'] == "scatter" + + assert graphs[0]['x_label'] == "A" + assert graphs[0]['y_label'] == "B" + + assert all(isinstance(x, float) for x in graphs[0]['x_ticks']) + assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + + assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) + assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + + assert len(graphs[0]['data']) == 2 + + first_data = graphs[0]['data'][0] + assert first_data['label'] == 'Dataset 1' + assert len(first_data['x']) == 5 + assert len(first_data['y']) == 5 + assert all(isinstance(x, float) for x in first_data['x']) + assert all(isinstance(y, float) for y in first_data['y']) + + second_data = graphs[0]['data'][1] + assert second_data['label'] == 'Dataset 2' + assert len(second_data['x']) == 10 + assert len(second_data['y']) == 10 + assert all(isinstance(x, float) for x in second_data['x']) + assert all(isinstance(y, float) for y in second_data['y']) From f9e4915665994438b9de0d82b932e5798aaf47e1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 6 Sep 2024 11:08:47 +0200 Subject: [PATCH 300/722] Add tick labels + orientation for Bar graphs --- template/startup_scripts/0002_data.py | 34 +++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 2e5cd747..f50222b1 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,5 +1,4 @@ import enum -from typing import Literal, Union import pandas from matplotlib.axes import Axes @@ -10,7 +9,6 @@ import IPython from IPython.core.formatters import BaseFormatter -from matplotlib import ticker from traitlets.traitlets import Unicode, ObjectName @@ -37,15 +35,6 @@ def get_type_of_plot(ax: Axes) -> PlotType: return PlotType.UNKNOWN -def _get_ticks(ax: Axes, axes: Literal['x'] | Literal['y']) -> list: - formatter = getattr(ax, f"{axes}axis").get_major_formatter() - if isinstance(formatter, Union[ticker.ScalarFormatter, ticker.LogFormatter]): - return getattr(ax, f"get_{axes}ticks")() - - labels = getattr(ax, f"get_{axes}ticklabels")() - return [line.get_text() for line in labels] - - def _figure_repr_e2b_data_(self: Figure): """ This method is used to extract data from the figure object to a dictionary @@ -59,10 +48,12 @@ def _figure_repr_e2b_data_(self: Figure): ax_data = { "title": ax.get_title(), "x_label": ax.get_xlabel(), - "x_ticks": [line.get_text() for line in ax.get_xticklabels()], + "x_ticks": ax.get_xticks(), + "x_tick_labels": [label.get_text() for label in ax.get_xticklabels()], "x_scale": ax.get_xscale(), "y_label": ax.get_ylabel(), - "y_ticks": [line.get_text() for line in ax.get_yticklabels()], + "y_ticks": ax.get_yticks(), + "y_tick_labels": [label.get_text() for label in ax.get_yticklabels()], "y_scale": ax.get_yscale(), "data": [], } @@ -92,12 +83,25 @@ def _figure_repr_e2b_data_(self: Figure): if plot_type == PlotType.BAR: for container in ax.containers: + orientation = "unknown" + + widths = [rect.get_width() for rect in container] + heights = [rect.get_height() for rect in container] + if all(height == heights[0] for height in heights): + orientation = "vertical" + + if all(width == widths[0] for width in widths): + orientation = "horizontal" + container_data = { "label": container.get_label(), "x": [rect.get_x() for rect in container], - "y": [rect.get_height() for rect in container], - "width": [rect.get_width() for rect in container], + "y": [rect.get_y() for rect in container], + "widths": widths, + "heights": heights, + "orientation": orientation, } + ax_data["data"].append(container_data) # If there are other types of plots (like bar plots), you can access them similarly From 5e4747a5637d362bb9cfe5f6d417573b42c2b84a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 6 Sep 2024 09:10:09 +0000 Subject: [PATCH 301/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index bab4bbc6..986ba97b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.49", + "version": "0.0.9-beta.50", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 2eacbea2..6fd7744d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b22" +version = "0.0.11b23" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 49641ece77e313b9c22e3f79b08f443af9fcb7c6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 6 Sep 2024 12:07:10 +0200 Subject: [PATCH 302/722] Add pie chart --- python/tests/graphs/test_bar.py | 2 +- python/tests/graphs/test_line.py | 2 +- python/tests/graphs/test_pie.py | 56 +++++++++++++++++++++++++++ python/tests/graphs/test_scatter.py | 2 +- template/startup_scripts/0002_data.py | 23 +++++++++-- 5 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 python/tests/graphs/test_pie.py diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 3acdd7d7..2d57f22e 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -21,7 +21,7 @@ """ -async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): +async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) data = result.results[0].data diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 5986469d..7f211413 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -26,7 +26,7 @@ """ -async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): +async def test_line_graph(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) data = result.results[0].data diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py new file mode 100644 index 00000000..f2b74b73 --- /dev/null +++ b/python/tests/graphs/test_pie.py @@ -0,0 +1,56 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Step 1: Define the data for the pie chart +categories = ["No", "No, in blue"] +sizes = [90, 10] + +# Step 2: Create the figure and axis objects +fig, ax = plt.subplots(figsize=(8, 8)) + +plt.xlabel("x") +plt.ylabel("y") + +# Step 3: Create the pie chart +ax.pie(sizes, labels=categories, autopct='%1.1f%%', startangle=90, colors=plt.cm.Pastel1.colors[:len(categories)]) + +# Step 4: Add title and legend +ax.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle +plt.title('Will I wake up early tomorrow?') + +# Step 5: Show the plot +plt.show() +""" + + +async def test_pie_graph(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + data = result.results[0].data + assert data + + graphs = data.get("graphs") + assert graphs + + assert graphs[0]['type'] == "pie" + assert graphs[0]['title'] == "Will I wake up early tomorrow?" + assert graphs[0]['x_label'] == "x" + assert graphs[0]['y_label'] == "y" + + assert len(graphs[0]['x_ticks']) == 0 + assert len(graphs[0]['y_ticks']) == 0 + + assert len(graphs[0]['data']) == 2 + + first_data = graphs[0]['data'][0] + assert first_data['label'] == 'No' + assert round(first_data['theta']) == 324 + assert first_data['r'] == 1 + + second_data = graphs[0]['data'][1] + assert second_data['label'] == 'No, in blue' + assert round(second_data['theta']) == 36 + assert second_data['r'] == 1 diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index 4d933b8a..8e08e56d 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -22,7 +22,7 @@ """ -async def test_scatter_plot(async_sandbox: AsyncCodeInterpreter): +async def test_scatter_graph(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) data = result.results[0].data diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index f50222b1..745c004f 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -4,7 +4,7 @@ from matplotlib.axes import Axes from matplotlib.collections import PathCollection from matplotlib.lines import Line2D -from matplotlib.patches import Rectangle +from matplotlib.patches import Rectangle, Wedge from matplotlib.pyplot import Figure import IPython @@ -16,6 +16,7 @@ class PlotType(enum.Enum): LINE = "line" SCATTER = "scatter" BAR = "bar" + PIE = "pie" UNKNOWN = "unknown" @@ -28,8 +29,12 @@ def get_type_of_plot(ax: Axes) -> PlotType: if any(isinstance(collection, PathCollection) for collection in ax.collections): return PlotType.SCATTER - # Check for Bar plots (Rectangle objects with height > 0) - if any(isinstance(rect, Rectangle) for rect in ax.get_children()): + # Check for Pie plots + if any(isinstance(artist, Wedge) for artist in ax.patches): + return PlotType.PIE + + # Check for Bar plots + if any(isinstance(rect, Rectangle) for rect in ax.patches): return PlotType.BAR return PlotType.UNKNOWN @@ -104,7 +109,17 @@ def _figure_repr_e2b_data_(self: Figure): ax_data["data"].append(container_data) - # If there are other types of plots (like bar plots), you can access them similarly + if plot_type == PlotType.PIE: + for wedge in ax.patches: + pie_data = { + "label": wedge.get_label(), + "theta": abs(wedge.theta2 - wedge.theta1), + "center": wedge.center, + "r": wedge.r, + } + + ax_data["data"].append(pie_data) + data.append(ax_data) return {"graphs": data} From b536b3280b00b21034c2caa2f3671c4e01dbd497 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 6 Sep 2024 10:09:09 +0000 Subject: [PATCH 303/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 986ba97b..be71b4ef 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.50", + "version": "0.0.9-beta.51", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 6fd7744d..783e5425 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b23" +version = "0.0.11b24" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From d8831bd50f9bbb9ca1876112fedf3a132591cb12 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 9 Sep 2024 17:18:55 +0200 Subject: [PATCH 304/722] Propagate kernel restarts to users --- template/e2b.toml | 16 ---------------- template/server/messaging.py | 6 ++++++ 2 files changed, 6 insertions(+), 16 deletions(-) delete mode 100644 template/e2b.toml diff --git a/template/e2b.toml b/template/e2b.toml deleted file mode 100644 index 68c8bbfc..00000000 --- a/template/e2b.toml +++ /dev/null @@ -1,16 +0,0 @@ -# This is a config for E2B sandbox template. -# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: - -# Python SDK -# from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-beta') - -# JS SDK -# import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) - -memory_mb = 1_024 -start_cmd = "/root/.jupyter/start-up.sh" -dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-beta" -template_id = "3e4rngfa34txe0gxc1zf" diff --git a/template/server/messaging.py b/template/server/messaging.py index 1656ae96..a14a0e06 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -198,6 +198,12 @@ async def _process_message(self, data: dict): :param data: The message data """ + if data["msg_type"] == "status" and data['content']['execution_state'] == 'restarting': + logger.error("Kernel is restarting") + for execution in self._executions.values(): + await execution.queue.put(Error(name="KernelRestarting", value="Kernel was restarted", traceback="")) + await execution.queue.put(EndOfExecution()) + return parent_msg_ig = data["parent_header"].get("msg_id", None) if parent_msg_ig is None: From f853217beabfef8b7ee233251fcbcc6f61509b34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Sep 2024 15:20:40 +0000 Subject: [PATCH 305/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index be71b4ef..3086c8f5 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.51", + "version": "0.0.9-beta.52", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 783e5425..4e805e21 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b24" +version = "0.0.11b25" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From d5b5c9f30a55dfca85ad8c3c822d3926530f8c9d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 10 Sep 2024 10:49:30 +0200 Subject: [PATCH 306/722] Add units + improve graph type detection --- python/tests/graphs/test_bar.py | 4 +++- python/tests/graphs/test_line.py | 10 +++++---- python/tests/graphs/test_pie.py | 2 ++ template/startup_scripts/0002_data.py | 32 +++++++++++++++++++++------ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 2d57f22e..570ee012 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -36,6 +36,9 @@ async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): assert graphs[0]['x_label'] == "Authors" assert graphs[0]['y_label'] == "Number of Books Sold" + assert graphs[0]['x_unit'] is None + assert graphs[0]['y_unit'] is None + assert all(isinstance(x, int) for x in graphs[0]['x_ticks']) assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) @@ -53,4 +56,3 @@ async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): assert all(isinstance(x, (int, float)) for x in data['heights']) assert all(isinstance(y, (int, float)) for y in data['x']) assert all(isinstance(y, (int, float)) for y in data['y']) - diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 7f211413..ee165549 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -17,8 +17,8 @@ plt.plot(x, y_cos, label='cos(x)') # Add labels and title -plt.xlabel('x') -plt.ylabel('y') +plt.xlabel("Time (s)") +plt.ylabel("Amplitude (Hz)") plt.title('Plot of sin(x) and cos(x)') # Display the plot @@ -37,8 +37,10 @@ async def test_line_graph(async_sandbox: AsyncCodeInterpreter): assert graphs[0]['type'] == "line" assert graphs[0]['title'] == "Plot of sin(x) and cos(x)" - assert graphs[0]['x_label'] == "x" - assert graphs[0]['y_label'] == "y" + assert graphs[0]['x_label'] == "Time (s)" + assert graphs[0]['y_label'] == "Amplitude (Hz)" + assert graphs[0]['x_unit'] == "s" + assert graphs[0]['y_unit'] == "Hz" assert all(isinstance(x, float) for x in graphs[0]['x_ticks']) assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py index f2b74b73..d9258d6c 100644 --- a/python/tests/graphs/test_pie.py +++ b/python/tests/graphs/test_pie.py @@ -39,6 +39,8 @@ async def test_pie_graph(async_sandbox: AsyncCodeInterpreter): assert graphs[0]['title'] == "Will I wake up early tomorrow?" assert graphs[0]['x_label'] == "x" assert graphs[0]['y_label'] == "y" + assert graphs[0]['x_unit'] is None + assert graphs[0]['y_unit'] is None assert len(graphs[0]['x_ticks']) == 0 assert len(graphs[0]['y_ticks']) == 0 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 745c004f..cd6dbdb5 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,14 +1,17 @@ import enum +import re +from typing import Optional import pandas from matplotlib.axes import Axes from matplotlib.collections import PathCollection from matplotlib.lines import Line2D -from matplotlib.patches import Rectangle, Wedge +from matplotlib.patches import Rectangle, Wedge, PathPatch from matplotlib.pyplot import Figure import IPython from IPython.core.formatters import BaseFormatter +from matplotlib.text import Text from traitlets.traitlets import Unicode, ObjectName @@ -20,21 +23,34 @@ class PlotType(enum.Enum): UNKNOWN = "unknown" -def get_type_of_plot(ax: Axes) -> PlotType: +def _extract_units(label: str) -> Optional[str]: + """ + Function to extract units from labels + """ + # Look for units in parentheses or brackets + match = re.search(r"\s\((.*?)\)|\[(.*?)\]", label) + if match: + return match.group(1) or match.group(2) # return the matched unit + return None # No units found + + +def _get_type_of_plot(ax: Axes) -> PlotType: + objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) + # Check for Line plots - if any(isinstance(line, Line2D) for line in ax.get_lines()): + if all(isinstance(line, Line2D) for line in objects): return PlotType.LINE # Check for Scatter plots - if any(isinstance(collection, PathCollection) for collection in ax.collections): + if all(isinstance(path, PathCollection) for path in objects): return PlotType.SCATTER # Check for Pie plots - if any(isinstance(artist, Wedge) for artist in ax.patches): + if all(isinstance(artist, Wedge) for artist in objects): return PlotType.PIE # Check for Bar plots - if any(isinstance(rect, Rectangle) for rect in ax.patches): + if all(isinstance(rect, Rectangle) for rect in objects): return PlotType.BAR return PlotType.UNKNOWN @@ -53,17 +69,19 @@ def _figure_repr_e2b_data_(self: Figure): ax_data = { "title": ax.get_title(), "x_label": ax.get_xlabel(), + "x_unit": _extract_units(ax.get_xlabel()), "x_ticks": ax.get_xticks(), "x_tick_labels": [label.get_text() for label in ax.get_xticklabels()], "x_scale": ax.get_xscale(), "y_label": ax.get_ylabel(), + "y_unit": _extract_units(ax.get_ylabel()), "y_ticks": ax.get_yticks(), "y_tick_labels": [label.get_text() for label in ax.get_yticklabels()], "y_scale": ax.get_yscale(), "data": [], } - plot_type = get_type_of_plot(ax) + plot_type = _get_type_of_plot(ax) ax_data["type"] = plot_type.value if plot_type == PlotType.LINE: From 871bb2bcd65bc84943adc1df1329ecabb35657c0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 10 Sep 2024 10:50:52 +0200 Subject: [PATCH 307/722] Return e2b.toml --- template/e2b.toml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 template/e2b.toml diff --git a/template/e2b.toml b/template/e2b.toml new file mode 100644 index 00000000..68c8bbfc --- /dev/null +++ b/template/e2b.toml @@ -0,0 +1,16 @@ +# This is a config for E2B sandbox template. +# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: + +# Python SDK +# from e2b import Sandbox +# sandbox = Sandbox(template='code-interpreter-beta') + +# JS SDK +# import { Sandbox } from 'e2b' +# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) + +memory_mb = 1_024 +start_cmd = "/root/.jupyter/start-up.sh" +dockerfile = "e2b.Dockerfile" +template_name = "code-interpreter-beta" +template_id = "3e4rngfa34txe0gxc1zf" From a1dcb0126f91f890f5f516d430b56ad5b0009458 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 10 Sep 2024 10:02:05 +0000 Subject: [PATCH 308/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 3086c8f5..08e7ad3a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.52", + "version": "0.0.9-beta.53", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 4e805e21..94d3f4a1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b25" +version = "0.0.11b26" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 0031ebf5115abbdd53602ff67db5f73fc2598dcd Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 12 Sep 2024 19:16:42 +0200 Subject: [PATCH 309/722] Add graphs as separate result attribute, improve schema, add typing, add supergraph --- js/README.md | 6 +- js/src/graphs.ts | 114 +++++ js/src/index.ts | 26 +- js/src/messaging.ts | 42 +- js/tests/displayData.test.ts | 1 - js/tests/envVars.test.ts | 34 +- js/tests/graphs/bar.test.ts | 48 +++ js/tests/graphs/boxAndWhisker.test.ts | 63 +++ js/tests/graphs/line.test.ts | 78 ++++ js/tests/graphs/pie.test.ts | 49 +++ js/tests/graphs/scatter.test.ts | 70 ++++ js/tests/graphs/supergraph.test.ts | 64 +++ js/tests/kernels.test.ts | 2 +- js/tests/runtimes/deno/run.test.ts | 1 - js/tests/setup.ts | 7 +- js/tests/streaming.test.ts | 6 +- js/tsconfig.json | 17 +- js/tsup.config.js | 4 +- js/vitest.config.ts | 10 +- python/async_example.py | 75 +++- python/e2b_code_interpreter/graphs.py | 178 ++++++++ python/e2b_code_interpreter/models.py | 8 + python/example.py | 104 +++-- python/tests/graphs/test_bar.py | 47 +-- python/tests/graphs/test_box_and_whiskers.py | 62 +++ python/tests/graphs/test_line.py | 53 ++- python/tests/graphs/test_pie.py | 36 +- python/tests/graphs/test_scatter.py | 47 +-- python/tests/graphs/test_supergraph.py | 61 +++ template/server/api/models/result.py | 5 +- template/server/messaging.py | 21 +- template/server/requirements.txt | 1 + template/startup_scripts/0002_data.py | 417 ++++++++++++++----- 33 files changed, 1429 insertions(+), 328 deletions(-) create mode 100644 js/src/graphs.ts create mode 100644 js/tests/graphs/bar.test.ts create mode 100644 js/tests/graphs/boxAndWhisker.test.ts create mode 100644 js/tests/graphs/line.test.ts create mode 100644 js/tests/graphs/pie.test.ts create mode 100644 js/tests/graphs/scatter.test.ts create mode 100644 js/tests/graphs/supergraph.test.ts create mode 100644 python/e2b_code_interpreter/graphs.py create mode 100644 python/tests/graphs/test_box_and_whiskers.py create mode 100644 python/tests/graphs/test_supergraph.py diff --git a/js/README.md b/js/README.md index e42b464c..1ef22070 100644 --- a/js/README.md +++ b/js/README.md @@ -24,7 +24,7 @@ const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell('x = 1') const execution = await sandbox.notebook.execCell('x+=1; x') -console.log(execution.text) // outputs 2 +console.log(execution.text) // outputs 2 await sandbox.close() ``` @@ -48,7 +48,7 @@ plt.show() ` // you can install dependencies in "jupyter notebook style" -await sandbox.notebook.execCell("!pip install matplotlib") +await sandbox.notebook.execCell('!pip install matplotlib') const execution = await sandbox.notebook.execCell(code) @@ -80,7 +80,7 @@ const sandbox = await CodeInterpreter.create() await sandbox.notebook.execCell(code, { onStdout: (out) => console.log(out), onStderr: (outErr) => console.error(outErr), - onResult: (result) => console.log(result.text) + onResult: (result) => console.log(result.text), }) await sandbox.close() diff --git a/js/src/graphs.ts b/js/src/graphs.ts new file mode 100644 index 00000000..4524b1d5 --- /dev/null +++ b/js/src/graphs.ts @@ -0,0 +1,114 @@ +export enum GraphType { + LINE = 'line', + SCATTER = 'scatter', + BAR = 'bar', + PIE = 'pie', + BOX_AND_WHISKER = 'box_and_whisker', + SUPERGRAPH = 'supergraph', + UNKNOWN = 'unknown', +} + +export type Graph = { + type: GraphType + title: string + elements: any[] +} + +type Graph2D = Graph & { + x_label?: string + y_label?: string + x_unit?: string + y_unit?: string +} + +export type PointData = { + label: string + points: [number, number][] +} + +type PointGraph = Graph2D & { + x_ticks: number[] + x_tick_labels: string[] + y_ticks: number[] + y_tick_labels: string[] + elements: PointData[] +} + +export type LineGraph = PointGraph & { + type: GraphType.LINE +} + +export type ScatterGraph = PointGraph & { + type: GraphType.SCATTER +} + +export type BarData = { + label: string + value: string +} + +export type BarGraph = Graph2D & { + type: GraphType.BAR + elements: BarData[] +} + +export type PieData = { + label: string + angle: number + radius: number +} + +export type PieGraph = Graph & { + type: GraphType.PIE + elements: PieData[] +} + +export type BoxAndWhiskerData = { + label: string + min: number + first_quartile: number + median: number + third_quartile: number + max: number +} + +export type BoxAndWhiskerGraph = Graph2D & { + type: GraphType.BOX_AND_WHISKER + elements: BoxAndWhiskerData[] +} + +export type SuperGraph = Graph & { + type: GraphType.SUPERGRAPH + elements: Graph[] +} + +export type GraphTypes = + | LineGraph + | ScatterGraph + | BarGraph + | PieGraph + | BoxAndWhiskerGraph + | SuperGraph +export function deserializeGraph(data: any): Graph { + switch (data.type) { + case GraphType.LINE: + return { ...data } as LineGraph + case GraphType.SCATTER: + return { ...data } as ScatterGraph + case GraphType.BAR: + return { ...data } as BarGraph + case GraphType.PIE: + return { ...data } as PieGraph + case GraphType.BOX_AND_WHISKER: + return { ...data } as BoxAndWhiskerGraph + case GraphType.SUPERGRAPH: + const graphs = data.data.map((g: any) => deserializeGraph(g)) + delete data.data + return { + ...data, + data: graphs, + } as SuperGraph + default: + return { ...data, type: GraphType.UNKNOWN } as Graph + } +} diff --git a/js/src/index.ts b/js/src/index.ts index 05fd35b9..9c74ab08 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -2,8 +2,30 @@ export * from 'e2b' export { CodeInterpreter, JupyterExtension } from './codeInterpreter' -export type { Logs, ExecutionError, Result, Execution, MIMEType, RawData, OutputMessage } from './messaging' - +export type { + Logs, + ExecutionError, + Result, + Execution, + MIMEType, + RawData, + OutputMessage, +} from './messaging' +export type { + GraphType, + GraphTypes, + Graph, + BarGraph, + BarData, + LineGraph, + ScatterGraph, + BoxAndWhiskerGraph, + BoxAndWhiskerData, + PieGraph, + PieData, + SuperGraph, + PointData, +} from './graphs' import { CodeInterpreter } from './codeInterpreter' export default CodeInterpreter diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 960ef661..0272cdd7 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,4 +1,5 @@ import { NotFoundError, SandboxError, TimeoutError } from 'e2b' +import { GraphTypes } from './graphs' export async function extractError(res: Response) { if (res.ok) { @@ -24,9 +25,8 @@ export class OutputMessage { * Unix epoch in nanoseconds */ public readonly timestamp: number, - public readonly error: boolean, - ) { - } + public readonly error: boolean + ) {} public toString() { return this.line @@ -50,8 +50,8 @@ export class ExecutionError { /** * The raw traceback of the error. **/ - public traceback: string, - ) { } + public traceback: string + ) {} } /** @@ -59,8 +59,9 @@ export class ExecutionError { */ export type MIMEType = string -type Data = { +type E2BData = { data: Record + graph: GraphTypes } /** @@ -68,7 +69,7 @@ type Data = { */ export type RawData = { [key: MIMEType]: string -} & Data +} & E2BData /** * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. @@ -124,6 +125,10 @@ export class Result { * Contains the data from DataFrame. */ readonly data?: Record + /** + * Contains the graph data. + */ + readonly graph?: GraphTypes /** * Extra data that can be included. Not part of the standard types. */ @@ -146,10 +151,12 @@ export class Result { this.latex = data['latex'] this.json = data['json'] this.javascript = data['javascript'] - this.data = data['data'] this.isMainResult = isMainResult this.raw = data + this.data = data['data'] + this.graph = data['graph'] + this.extra = {} for (const key of Object.keys(data)) { @@ -166,7 +173,7 @@ export class Result { 'json', 'javascript', 'data', - 'extra' + 'extra', ].includes(key) ) { this.extra[key] = data[key] @@ -234,7 +241,7 @@ export class Result { latex: this.latex, json: this.json, javascript: this.javascript, - ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}) + ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}), } } } @@ -274,7 +281,7 @@ export class Execution { * Execution count of the cell. */ public executionCount?: number - ) { } + ) {} /** * Returns the text representation of the main result of the cell. @@ -294,7 +301,7 @@ export class Execution { return { results: this.results, logs: this.logs, - error: this.error + error: this.error, } } } @@ -302,15 +309,18 @@ export class Execution { export async function parseOutput( execution: Execution, line: string, - onStdout?: (output: OutputMessage) => (Promise | any), - onStderr?: (output: OutputMessage) => (Promise | any), - onResult?: (data: Result) => (Promise | any), + onStdout?: (output: OutputMessage) => Promise | any, + onStderr?: (output: OutputMessage) => Promise | any, + onResult?: (data: Result) => Promise | any ) { const msg = JSON.parse(line) switch (msg.type) { case 'result': - const result = new Result({ ...msg, type: undefined, is_main_result: undefined }, msg.is_main_result) + const result = new Result( + { ...msg, type: undefined, is_main_result: undefined }, + msg.is_main_result + ) execution.results.push(result) if (onResult) { await onResult(result) diff --git a/js/tests/displayData.test.ts b/js/tests/displayData.test.ts index dfde1a61..6c145c0b 100644 --- a/js/tests/displayData.test.ts +++ b/js/tests/displayData.test.ts @@ -3,7 +3,6 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('display data', async ({ sandbox }) => { - // plot random graph const result = await sandbox.notebook.execCell(` import matplotlib.pyplot as plt diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index cfe12942..44b6b3c3 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -1,30 +1,46 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' -import { CodeInterpreter } from "../src"; +import { CodeInterpreter } from '../src' // Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. sandboxTest('env vars', async () => { - const sandbox = await CodeInterpreter.create({ envs: { TEST_ENV_VAR: "supertest" } }) - const result = await sandbox.notebook.execCell(`import os; x = os.getenv('TEST_ENV_VAR'); x`) + const sandbox = await CodeInterpreter.create({ + envs: { TEST_ENV_VAR: 'supertest' }, + }) + const result = await sandbox.notebook.execCell( + `import os; x = os.getenv('TEST_ENV_VAR'); x` + ) expect(result.results[0].text.trim()).toEqual('supertest') }) -sandboxTest('env vars on sandbox', async ({sandbox}) => { - const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "bar"}}) +sandboxTest('env vars on sandbox', async ({ sandbox }) => { + const result = await sandbox.notebook.execCell( + "import os; os.getenv('FOO')", + { envs: { FOO: 'bar' } } + ) expect(result.results[0].text.trim()).toEqual('bar') }) sandboxTest('env vars on sandbox override', async () => { - const sandbox = await CodeInterpreter.create({ envs: { FOO: "bar", SBX: "value" } }) - await sandbox.notebook.execCell("import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'") - const result = await sandbox.notebook.execCell("import os; os.getenv('FOO')", {envs: {FOO: "baz"}}) + const sandbox = await CodeInterpreter.create({ + envs: { FOO: 'bar', SBX: 'value' }, + }) + await sandbox.notebook.execCell( + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + ) + const result = await sandbox.notebook.execCell( + "import os; os.getenv('FOO')", + { envs: { FOO: 'baz' } } + ) expect(result.results[0].text.trim()).toEqual('baz') - const result2 = await sandbox.notebook.execCell("import os; os.getenv('RUNTIME_ENV')") + const result2 = await sandbox.notebook.execCell( + "import os; os.getenv('RUNTIME_ENV')" + ) expect(result2.results[0].text.trim()).toEqual('value') const result3 = await sandbox.notebook.execCell("import os; os.getenv('SBX')") diff --git a/js/tests/graphs/bar.test.ts b/js/tests/graphs/bar.test.ts new file mode 100644 index 00000000..b88cda83 --- /dev/null +++ b/js/tests/graphs/bar.test.ts @@ -0,0 +1,48 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. +sandboxTest('bar', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt + +# Prepare data +authors = ['Author A', 'Author B', 'Author C', 'Author D'] +sales = [100, 200, 300, 400] + +# Create and customize the bar graph +plt.figure(figsize=(10, 6)) +plt.bar(authors, sales) +plt.xlabel('Authors') +plt.ylabel('Number of Books Sold') +plt.title('Book Sales by Authors') + +# Display the graph +plt.tight_layout() +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + expect(graph.type).toBe('bar') + expect(graph.title).toBe('Book Sales by Authors') + + expect(graph.x_label).toBe('Authors') + expect(graph.y_label).toBe('Number of Books Sold') + + expect(graph.x_unit).toBeNull() + expect(graph.y_unit).toBeNull() + + const bars = graph.elements + expect(bars.length).toBe(4) + + expect(bars.map((bar) => bar.value)).toEqual([100, 200, 300, 400]) + expect(bars.map((bar) => bar.label)).toEqual([ + 'Author A', + 'Author B', + 'Author C', + 'Author D', + ]) +}) diff --git a/js/tests/graphs/boxAndWhisker.test.ts b/js/tests/graphs/boxAndWhisker.test.ts new file mode 100644 index 00000000..80398965 --- /dev/null +++ b/js/tests/graphs/boxAndWhisker.test.ts @@ -0,0 +1,63 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('box-and-whisker', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Sample data +data = { + 'Class A': [85, 90, 78, 92, 88], + 'Class B': [95, 89, 76, 91, 84, 87], + 'Class C': [75, 82, 88, 79, 86] +} + +# Create figure and axis +fig, ax = plt.subplots(figsize=(10, 6)) + +# Plot box plot +ax.boxplot(data.values(), labels=data.keys()) + +# Customize plot +ax.set_title('Exam Scores Distribution') +ax.set_xlabel('Class') +ax.set_ylabel('Score') + +# Set custom colors +ax.boxplot(data.values(), labels=data.keys(), patch_artist=True) + +# Add legend +ax.legend() + +# Adjust layout and show plot +plt.tight_layout() +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + + expect(graph.type).toBe('box_and_whisker') + expect(graph.title).toBe('Exam Scores Distribution') + + expect(graph.x_label).toBe('Class') + expect(graph.y_label).toBe('Score') + + expect(graph.x_unit).toBeNull() + expect(graph.y_unit).toBeNull() + + const bars = graph.elements + expect(bars.length).toBe(3) + + bars.forEach((bar: any) => { + expect(typeof bar.min).toBe('number') + expect(typeof bar.first_quartile).toBe('number') + expect(typeof bar.median).toBe('number') + expect(typeof bar.third_quartile).toBe('number') + expect(typeof bar.max).toBe('number') + expect(typeof bar.label).toBe('string') + }) +}) diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts new file mode 100644 index 00000000..60694213 --- /dev/null +++ b/js/tests/graphs/line.test.ts @@ -0,0 +1,78 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('line', async ({ sandbox }) => { + const code = ` +import numpy as np +import matplotlib.pyplot as plt + +# Generate x values +x = np.linspace(0, 2*np.pi, 100) + +# Calculate y values +y_sin = np.sin(x) +y_cos = np.cos(x) + +# Create the plot +plt.figure(figsize=(10, 6)) +plt.plot(x, y_sin, label='sin(x)') +plt.plot(x, y_cos, label='cos(x)') + +# Add labels and title +plt.xlabel("Time (s)") +plt.ylabel("Amplitude (Hz)") +plt.title('Plot of sin(x) and cos(x)') + +# Display the plot +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + + expect(graph.title).toBe('Plot of sin(x) and cos(x)') + expect(graph.x_label).toBe('Time (s)') + expect(graph.y_label).toBe('Amplitude (Hz)') + + expect(graph.x_unit).toBe('s') + expect(graph.y_unit).toBe('Hz') + + expect(graph.x_ticks.every((tick: number) => typeof tick === 'number')).toBe( + true + ) + expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( + true + ) + + expect( + graph.y_tick_labels.every((label: string) => typeof label === 'string') + ).toBe(true) + expect( + graph.x_tick_labels.every((label: string) => typeof label === 'string') + ).toBe(true) + + const lines = graph.elements + expect(lines.length).toBe(2) + + const [firstLine, secondLine] = lines + + expect(firstLine.label).toBe('sin(x)') + expect(firstLine.points.length).toBe(100) + expect( + firstLine.points.every( + (point: [number, number]) => + typeof point[0] === 'number' && typeof point[1] === 'number' + ) + ).toBe(true) + + expect(secondLine.label).toBe('cos(x)') + expect(secondLine.points.length).toBe(100) + expect( + secondLine.points.every( + (point: [number, number]) => + typeof point[0] === 'number' && typeof point[1] === 'number' + ) + ).toBe(true) +}) diff --git a/js/tests/graphs/pie.test.ts b/js/tests/graphs/pie.test.ts new file mode 100644 index 00000000..9286a026 --- /dev/null +++ b/js/tests/graphs/pie.test.ts @@ -0,0 +1,49 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('pie', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Step 1: Define the data for the pie chart +categories = ["No", "No, in blue"] +sizes = [90, 10] + +# Step 2: Create the figure and axis objects +fig, ax = plt.subplots(figsize=(8, 8)) + +plt.xlabel("x") +plt.ylabel("y") + +# Step 3: Create the pie chart +ax.pie(sizes, labels=categories, autopct='%1.1f%%', startangle=90, colors=plt.cm.Pastel1.colors[:len(categories)]) + +# Step 4: Add title and legend +ax.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle +plt.title('Will I wake up early tomorrow?') + +# Step 5: Show the plot +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + expect(graph.type).toBe('pie') + + expect(graph.title).toBe('Will I wake up early tomorrow?') + + expect(graph.elements.length).toBe(2) + + const [firstData, secondData] = graph.elements + + expect(firstData.label).toBe('No') + expect(firstData.angle).toBe(324) // 90% of 360 degrees + expect(firstData.radius).toBe(1) + + expect(secondData.label).toBe('No, in blue') + expect(secondData.angle).toBe(36) // 10% of 360 degrees + expect(secondData.radius).toBe(1) +}) diff --git a/js/tests/graphs/scatter.test.ts b/js/tests/graphs/scatter.test.ts new file mode 100644 index 00000000..b9b68b18 --- /dev/null +++ b/js/tests/graphs/scatter.test.ts @@ -0,0 +1,70 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('scatter', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Create data +N = 5 +x1 = np.random.rand(N) +y1 = np.random.rand(N) +x2 = np.random.rand(2*N) +y2 = np.random.rand(2*N) + +plt.xlabel("A") +plt.ylabel("B") + +plt.scatter(x1, y1, c='blue', label='Dataset 1') +plt.scatter(x2, y2, c='red', label='Dataset 2') + +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + expect(graph.type).toBe('scatter') + + expect(graph.title).toBeNull() + expect(graph.x_label).toBe('A') + expect(graph.y_label).toBe('B') + + expect(graph.x_ticks.every((tick: number) => typeof tick === 'number')).toBe( + true + ) + expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( + true + ) + + expect( + graph.x_tick_labels.every((label: string) => typeof label === 'string') + ).toBe(true) + expect( + graph.y_tick_labels.every((label: string) => typeof label === 'string') + ).toBe(true) + + expect(graph.elements.length).toBe(2) + + const [firstData, secondData] = graph.elements + + expect(firstData.label).toBe('Dataset 1') + expect(firstData.points.length).toBe(5) + expect( + firstData.points.every( + (point: [number, number]) => + typeof point[0] === 'number' && typeof point[1] === 'number' + ) + ).toBe(true) + + expect(secondData.label).toBe('Dataset 2') + expect(secondData.points.length).toBe(10) + expect( + secondData.points.every( + (point: [number, number]) => + typeof point[0] === 'number' && typeof point[1] === 'number' + ) + ).toBe(true) +}) diff --git a/js/tests/graphs/supergraph.test.ts b/js/tests/graphs/supergraph.test.ts new file mode 100644 index 00000000..fbaed47d --- /dev/null +++ b/js/tests/graphs/supergraph.test.ts @@ -0,0 +1,64 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('supergraph', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Data for plotting +x1 = np.linspace(0, 10, 100) +y1 = np.sin(x1) + +# Create a figure with multiple subplots +fig, axs = plt.subplots(1, 2, figsize=(10, 8)) +fig.suptitle('Multiple Graphs Example', fontsize=16) + +# Plotting on the different axes +axs[0].plot(x1, y1, 'r') +axs[0].set_title('Sine Wave') +axs[0].grid(True) + +N = 5 +x2 = np.random.rand(N) +y2 = np.random.rand(N) + +axs[1].scatter(x2, y2, c='blue', label='Dataset 1') +axs[1].set_xlabel('X') +axs[1].set_ylabel('Y') +axs[1].set_title('Scatter Plot') +axs[1].grid(True) + +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + expect(graph.type).toBe('supergraph') + expect(graph.title).toBe('Multiple Graphs Example') + + const graphs = graph.elements + expect(graphs.length).toBe(2) + + const [firstGraph, secondGraph] = graphs + + // Check the first graph (LineGraph) + expect(firstGraph.title).toBe('Sine Wave') + expect(firstGraph.type).toBe('line') + + expect(firstGraph.x_label).toBeNull() + expect(firstGraph.y_label).toBeNull() + expect(firstGraph.elements.length).toBe(1) + expect(firstGraph.elements[0].points.length).toBe(100) + + // Check the second graph (ScatterGraph) + expect(secondGraph.title).toBe('Scatter Plot') + expect(secondGraph.type).toBe('scatter') + + expect(secondGraph.x_label).toBe('X') + expect(secondGraph.y_label).toBe('Y') + expect(secondGraph.elements.length).toBe(1) + expect(secondGraph.elements[0].points.length).toBe(5) +}) diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 510c01e1..99518130 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -30,7 +30,7 @@ sandboxTest.skipIf(isDebug)('list kernels', async ({ sandbox }) => { const kernelID = await sandbox.notebook.createKernel() kernels = await sandbox.notebook.listKernels() - expect(kernels.map(kernel => kernel.kernelID)).toContain(kernelID) + expect(kernels.map((kernel) => kernel.kernelID)).toContain(kernelID) expect(kernels.length).toEqual(2) }) diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index d885d5ba..c221b803 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -5,7 +5,6 @@ await load({ envPath: '.env', export: true }) import { CodeInterpreter } from '../../../dist/index.mjs' - Deno.test('Deno test', async () => { const sbx = await CodeInterpreter.create({ timeoutMs: 5_000 }) try { diff --git a/js/tests/setup.ts b/js/tests/setup.ts index b10831a8..51359af1 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -9,17 +9,18 @@ interface SandboxFixture { export const sandboxTest = base.extend({ sandbox: [ - async ({ }, use) => { + async ({}, use) => { const sandbox = await CodeInterpreter.create({ timeoutMs }) try { await use(sandbox) - } finally { try { await sandbox.kill() } catch (err) { if (!isDebug) { - console.warn('Failed to kill sandbox — this is expected if the test runs with local envd.') + console.warn( + 'Failed to kill sandbox — this is expected if the test runs with local envd.' + ) } } } diff --git a/js/tests/streaming.test.ts b/js/tests/streaming.test.ts index a4b8a17b..ac2b8009 100644 --- a/js/tests/streaming.test.ts +++ b/js/tests/streaming.test.ts @@ -7,7 +7,7 @@ import { sandboxTest } from './setup' sandboxTest('streaming output', async ({ sandbox }) => { const out: OutputMessage[] = [] await sandbox.notebook.execCell('print(1)', { - onStdout: (msg) => out.push(msg) + onStdout: (msg) => out.push(msg), }) expect(out.length).toEqual(1) @@ -17,7 +17,7 @@ sandboxTest('streaming output', async ({ sandbox }) => { sandboxTest('streaming error', async ({ sandbox }) => { const out: OutputMessage[] = [] await sandbox.notebook.execCell('import sys;print(1, file=sys.stderr)', { - onStderr: (msg) => out.push(msg) + onStderr: (msg) => out.push(msg), }) expect(out.length).toEqual(1) @@ -39,7 +39,7 @@ sandboxTest('streaming result', async ({ sandbox }) => { x ` await sandbox.notebook.execCell(code, { - onResult: (result) => out.push(result) + onResult: (result) => out.push(result), }) expect(out.length).toEqual(2) diff --git a/js/tsconfig.json b/js/tsconfig.json index a9615e84..d660eae3 100644 --- a/js/tsconfig.json +++ b/js/tsconfig.json @@ -2,10 +2,7 @@ "compilerOptions": { "outDir": "dist", "target": "es6", - "lib": [ - "dom", - "ESNext" - ], + "lib": ["dom", "ESNext"], "sourceMap": true, "allowJs": true, "skipLibCheck": true, @@ -17,14 +14,8 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "declaration": true, + "declaration": true }, - "include": [ - "src" - ], - "exclude": [ - "dist", - "node_modules", - "tsup.config.js" - ] + "include": ["src"], + "exclude": ["dist", "node_modules", "tsup.config.js"] } diff --git a/js/tsup.config.js b/js/tsup.config.js index 846c9008..80616774 100644 --- a/js/tsup.config.js +++ b/js/tsup.config.js @@ -8,10 +8,10 @@ export default defineConfig({ format: ['esm', 'cjs'], clean: true, entry: { - index: './src/index.ts' + index: './src/index.ts', }, esbuildOptions: (options) => { options.legalComments = 'none' return options - } + }, }) diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 3d05b84e..409840e6 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -11,12 +11,8 @@ export default defineConfig({ maxThreads: 4, }, }, - include: [ - 'tests/**/*.test.ts', - ], - exclude: [ - 'tests/runtimes/**', - ], + include: ['tests/**/*.test.ts'], + exclude: ['tests/runtimes/**'], globals: false, testTimeout: 20000, environment: 'node', @@ -26,7 +22,7 @@ export default defineConfig({ interopDefault: true, }, env: { - ...process.env as Record, + ...(process.env as Record), ...env.parsed, }, }, diff --git a/python/async_example.py b/python/async_example.py index 1da955ea..5d9df50b 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -6,40 +6,71 @@ load_dotenv() - code = """ -import matplotlib import matplotlib.pyplot as plt import numpy as np -from matplotlib.figure import Figure -x = np.linspace(0, 20, 100) -y = np.sin(x) +# Data for plotting +x = np.linspace(0, 10, 100) +y1 = np.sin(x) +y2 = np.cos(x) +y3 = x**2 +y4 = np.sqrt(x) -plt.plot(x, y) -plt.show() +# Create a figure with multiple subplots +fig, axs = plt.subplots(2, 2, figsize=(10, 8)) + +# Plotting on the different axes +axs[0, 0].plot(x, y1, 'r') +axs[0, 0].set_title('Sine Wave') +axs[0, 0].grid(True) +axs[0, 1].plot(x, y2, 'b') +axs[0, 1].set_title('Cosine Wave') +axs[0, 1].grid(True) -class Test(): - def _repr_e2b_data_(self): - return {"a": 1} +axs[1, 0].plot(x, y3, 'g') +axs[1, 0].set_title('Quadratic Function') +axs[1, 0].grid(True) -Test() +axs[1, 1].plot(x, y4, 'm') +axs[1, 1].set_title('Square Root Function') +axs[1, 1].grid(True) + +# Adjust layout to prevent overlap +plt.tight_layout() + +# Display the figure +plt.show() """ +async def create_sbx(sbx, i: int): + await asyncio.sleep(i * 0.01) + return ( + await sbx.notebook.exec_cell(f"os.getenv('TEST')", envs={"TEST": str(i)}) + ).text + + async def run(): - sandbox = await AsyncCodeInterpreter.connect("", debug=True) - print(sandbox.sandbox_id) - execution = await sandbox.notebook.exec_cell(code) - - print('\n'.join(execution.logs.stdout)) - print('\n'.join(execution.logs.stderr)) - if execution.error: - print(execution.error.traceback) - print(len(execution.results)) - print(execution.results[0].formats()) - print(execution.results[1].formats()) + sbx = await AsyncCodeInterpreter.create( + debug=True, + ) + result = await sbx.notebook.exec_cell(code) + + print("".join(result.logs.stdout)) + print("".join(result.logs.stderr)) + if result.error: + print(result.error.traceback) + + print(result.results[0].formats()) + print(result.results[0].elements.elements) + # print(result.results[0].data['graphs'][0]['data']) + # print(result.results[0].data['graphs'][0]['data'][0]) + # print(result.results[0].data['graphs'][0]['data'][1]) + # print(result.results[0].data['graphs'][0]['data'][2]) + + await sbx.kill() asyncio.run(run()) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py new file mode 100644 index 00000000..2b4c93b9 --- /dev/null +++ b/python/e2b_code_interpreter/graphs.py @@ -0,0 +1,178 @@ +import enum +from typing import List, Tuple, Any, Optional, Union + + +class GraphType(enum.Enum): + LINE = "line" + SCATTER = "scatter" + BAR = "bar" + PIE = "pie" + BOX_AND_WHISKER = "box_and_whisker" + SUPERGRAPH = "supergraph" + UNKNOWN = "unknown" + + +class Graph: + type: GraphType + title: str + + elements: List[Any] + + def __init__(self, **kwargs): + self.type = GraphType(kwargs["type"]) + self.title = kwargs["title"] + + +class Graph2D(Graph): + x_label: Optional[str] + y_label: Optional[str] + x_unit: Optional[str] + y_unit: Optional[str] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.x_label = kwargs["x_label"] + self.y_label = kwargs["y_label"] + self.x_unit = kwargs["x_unit"] + self.y_unit = kwargs["y_unit"] + + +class PointData: + label: str + points: List[Tuple[float, float]] + + def __init__(self, **kwargs): + self.label = kwargs["label"] + self.points = [(float(x), float(y)) for x, y in kwargs["points"]] + + +class PointGraph(Graph2D): + x_ticks: List[float] + x_tick_labels: List[str] + y_ticks: List[float] + y_tick_labels: List[str] + + elements: List[PointData] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.x_label = kwargs["x_label"] + self.y_label = kwargs["y_label"] + self.x_unit = kwargs["x_unit"] + self.y_unit = kwargs["y_unit"] + self.x_ticks = kwargs["x_ticks"] + self.x_tick_labels = kwargs["x_tick_labels"] + self.y_ticks = kwargs["y_ticks"] + self.y_tick_labels = kwargs["y_tick_labels"] + self.elements = [PointData(**d) for d in kwargs["elements"]] + + +class LineGraph(PointGraph): + type = GraphType.LINE + + +class ScatterGraph(PointGraph): + type = GraphType.SCATTER + + +class BarData: + label: str + value: str + + def __init__(self, **kwargs): + self.label = kwargs["label"] + self.value = kwargs["value"] + + +class BarGraph(Graph2D): + type = GraphType.BAR + + elements: List[BarData] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.elements = [BarData(**d) for d in kwargs["elements"]] + + +class PieData: + label: str + angle: float + radius: float + + def __init__(self, **kwargs): + self.label = kwargs["label"] + self.angle = kwargs["angle"] + self.radius = kwargs["radius"] + + +class PieGraph(Graph): + type = GraphType.PIE + + elements: List[PieData] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.elements = [PieData(**d) for d in kwargs["elements"]] + + +class BoxAndWhiskerData: + label: str + min: float + first_quartile: float + median: float + third_quartile: float + max: float + + def __init__(self, **kwargs): + self.label = kwargs["label"] + self.min = kwargs["min"] + self.first_quartile = kwargs["first_quartile"] + self.median = kwargs["median"] + self.third_quartile = kwargs["third_quartile"] + self.max = kwargs["max"] + + +class BoxAndWhiskerGraph(Graph2D): + type = GraphType.BOX_AND_WHISKER + + elements: List[BoxAndWhiskerData] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.elements = [BoxAndWhiskerData(**d) for d in kwargs["elements"]] + + +class SuperGraph(Graph): + type = GraphType.SUPERGRAPH + + elements: List[ + Union[LineGraph, ScatterGraph, BarGraph, PieGraph, BoxAndWhiskerGraph] + ] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.elements = [deserialize_graph(g) for g in kwargs["elements"]] + + +GraphTypes = Union[ + LineGraph, ScatterGraph, BarGraph, PieGraph, BoxAndWhiskerGraph, SuperGraph +] + + +def deserialize_graph(data: dict) -> GraphTypes: + if data["type"] == GraphType.LINE.value: + graph = LineGraph(**data) + elif data["type"] == GraphType.SCATTER.value: + graph = ScatterGraph(**data) + elif data["type"] == GraphType.BAR.value: + graph = BarGraph(**data) + elif data["type"] == GraphType.PIE.value: + graph = PieGraph(**data) + elif data["type"] == GraphType.BOX_AND_WHISKER.value: + graph = BoxAndWhiskerGraph(**data) + elif data["type"] == GraphType.SUPERGRAPH.value: + graph = SuperGraph(**data) + else: + graph = Graph(**data, type=GraphType.UNKNOWN) + + return graph diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 5667a635..9baee6dc 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -16,6 +16,7 @@ from httpx import Response +from e2b_code_interpreter.graphs import Graph, deserialize_graph T = TypeVar("T") OutputHandler = Union[ @@ -89,6 +90,7 @@ def __getitem__(self, item): json: Optional[dict] = None javascript: Optional[str] = None data: Optional[dict] = None + graph: Optional[Graph] = None is_main_result: bool = False """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" extra: Optional[dict] = None @@ -123,6 +125,8 @@ def formats(self) -> Iterable[str]: formats.append("javascript") if self.data: formats.append("data") + if self.graph: + formats.append("graph") if self.extra: for key in self.extra: @@ -130,6 +134,10 @@ def formats(self) -> Iterable[str]: return formats + def __post_init__(self): + if isinstance(self.graph, dict): + self.graph = deserialize_graph(self.graph) + def __str__(self) -> Optional[str]: """ Returns the text representation of the data. diff --git a/python/example.py b/python/example.py index a3eda3d7..fce868b6 100644 --- a/python/example.py +++ b/python/example.py @@ -1,46 +1,76 @@ +import asyncio +import time +from time import sleep + from dotenv import load_dotenv -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter + +from e2b_code_interpreter import AsyncCodeInterpreter load_dotenv() -python_code = """ -k = 1 -k -""" -java_code = """ -(int) eval("1 + 1") + 3 -""" +code = """ +import psutil +import os -js_code = """ -console.log("Hello World"); -""" +def force_oom(): + # Get current memory usage + mem_before = psutil.virtual_memory().used + + # Start creating large lists + size = 10000000 # Start with 10 million integers + increment = 5000000 # Increase by 5 million integers each iteration + + while True: + # Create a large list of integers + large_list = [i for i in range(size)] + + # Get current memory usage + mem_after = psutil.virtual_memory().used + + # Calculate memory difference + mem_diff = mem_after - mem_before + + print(f"Created list of size {size} MB") + print(f"Memory increase: {mem_diff / (1024 * 1024):.2f} GB") + + # Reset memory usage tracking + mem_before = mem_after + + # Increment size for next iteration + size += increment + + # Sleep briefly to allow OS to respond + import time + time.sleep(0.1) -r_code = """ -x <- 13 -x +# Run the function +force_oom() """ -sandbox = CodeInterpreter("code-interpreter-beta") -execution = sandbox.notebook.exec_cell(python_code) -print(execution) -print(execution.logs) -print(len(execution.results)) - -js_id = sandbox.notebook.create_kernel(kernel_name="javascript") -execution = sandbox.notebook.exec_cell(js_code, kernel_id=js_id) -print(execution) -print(execution.logs) -print(len(execution.results)) - -java_id = sandbox.notebook.create_kernel(kernel_name="java") -execution = sandbox.notebook.exec_cell(java_code, kernel_id=java_id) -print(execution) -print(execution.logs) -print(len(execution.results)) - -r_id = sandbox.notebook.create_kernel(kernel_name="r") -execution = sandbox.notebook.exec_cell(r_code, kernel_id=r_id) -print(execution) -print(execution.logs) -print(len(execution.results)) + +async def create_sbx(i: int): + sbx = await AsyncCodeInterpreter.create(timeout=60, template="rth7a7wt20f3ymyr74zo") + # with open('t2.csv') as f: + # await sbx.files.write("/home/user/t.csv", f) + print("executing cell") + print(f"Created sandbox {sbx.sandbox_id}") + x = time.time() + r = await sbx.notebook.exec_cell(code) + print(f"Executed in {time.time() - x}") + print(r.logs.stdout) + print(r.error) + + +async def run(): + for j in range(1): + print(f"Creating {j}. batch of sandboxes") + futures = [] + for i in range(1): + futures.append(create_sbx(i)) + + sbxs = await asyncio.gather(*futures) + sleep(2) + + +asyncio.run(run()) diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 570ee012..f4afa505 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter - +from e2b_code_interpreter.graphs import GraphType, BarGraph code = """ import matplotlib.pyplot as plt @@ -24,35 +24,26 @@ async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) - data = result.results[0].data - assert data - - graphs = data.get("graphs") - assert graphs - - assert graphs[0]['type'] == "bar" - assert graphs[0]['title'] == "Book Sales by Authors" - - assert graphs[0]['x_label'] == "Authors" - assert graphs[0]['y_label'] == "Number of Books Sold" - - assert graphs[0]['x_unit'] is None - assert graphs[0]['y_unit'] is None + graph = result.results[0].graph + assert graph - assert all(isinstance(x, int) for x in graphs[0]['x_ticks']) - assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + assert isinstance(graph, BarGraph) + assert graph.type == GraphType.BAR + assert graph.title == "Book Sales by Authors" - assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) - assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + assert graph.x_label == "Authors" + assert graph.y_label == "Number of Books Sold" - assert len(graphs[0]['data']) == 1 + assert graph.x_unit is None + assert graph.y_unit is None - data = graphs[0]['data'][0] - assert len(data['x']) == 4 - assert len(data['y']) == 4 - assert data['orientation'] == "horizontal" + bars = graph.elements + assert len(bars) == 4 - assert all(isinstance(x, (int, float)) for x in data['widths']) - assert all(isinstance(x, (int, float)) for x in data['heights']) - assert all(isinstance(y, (int, float)) for y in data['x']) - assert all(isinstance(y, (int, float)) for y in data['y']) + assert [bar.value for bar in bars] == [100, 200, 300, 400] + assert [bar.label for bar in bars] == [ + "Author A", + "Author B", + "Author C", + "Author D", + ] diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/graphs/test_box_and_whiskers.py new file mode 100644 index 00000000..e10e3b5b --- /dev/null +++ b/python/tests/graphs/test_box_and_whiskers.py @@ -0,0 +1,62 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import BoxAndWhiskerGraph, GraphType + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Sample data +data = { + 'Class A': [85, 90, 78, 92, 88], + 'Class B': [95, 89, 76, 91, 84, 87], + 'Class C': [75, 82, 88, 79, 86] +} + +# Create figure and axis +fig, ax = plt.subplots(figsize=(10, 6)) + +# Plot box plot +ax.boxplot(data.values(), labels=data.keys()) + +# Customize plot +ax.set_title('Exam Scores Distribution') +ax.set_xlabel('Class') +ax.set_ylabel('Score') + +# Set custom colors +ax.boxplot(data.values(), labels=data.keys(), patch_artist=True) + +# Add legend +ax.legend() + +# Adjust layout and show plot +plt.tight_layout() +plt.show() +""" + + +async def test_box_and_whiskers(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + graph = result.results[0].graph + assert graph + + assert isinstance(graph, BoxAndWhiskerGraph) + assert graph.type == GraphType.BOX_AND_WHISKER + assert graph.title == "Exam Scores Distribution" + + assert graph.x_label == "Class" + assert graph.y_label == "Score" + + assert graph.x_unit is None + assert graph.y_unit is None + + bars = graph.elements + assert len(bars) == 3 + + assert all(isinstance(bar.min, float) for bar in bars) + assert all(isinstance(bar.first_quartile, float) for bar in bars) + assert all(isinstance(bar.median, float) for bar in bars) + assert all(isinstance(bar.third_quartile, float) for bar in bars) + assert all(isinstance(bar.max, float) for bar in bars) + assert all(isinstance(bar.label, str) for bar in bars) diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index ee165549..45bc8b82 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -1,4 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import LineGraph code = """ import numpy as np @@ -29,37 +30,35 @@ async def test_line_graph(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) - data = result.results[0].data - assert data + graph = result.results[0].graph + assert graph - graphs = data.get("graphs") - assert graphs + assert isinstance(graph, LineGraph) + assert graph.title == "Plot of sin(x) and cos(x)" - assert graphs[0]['type'] == "line" - assert graphs[0]['title'] == "Plot of sin(x) and cos(x)" - assert graphs[0]['x_label'] == "Time (s)" - assert graphs[0]['y_label'] == "Amplitude (Hz)" - assert graphs[0]['x_unit'] == "s" - assert graphs[0]['y_unit'] == "Hz" + assert graph.x_label == "Time (s)" + assert graph.y_label == "Amplitude (Hz)" - assert all(isinstance(x, float) for x in graphs[0]['x_ticks']) - assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + assert graph.x_unit == "s" + assert graph.y_unit == "Hz" - assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) - assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(y, float) for y in graph.y_ticks) - assert len(graphs[0]['data']) == 2 + assert all(isinstance(x, str) for x in graph.y_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) - first_data = graphs[0]['data'][0] - assert first_data['label'] == 'sin(x)' - assert len(first_data['x']) == 100 - assert len(first_data['y']) == 100 - assert all(isinstance(x, float) for x in first_data['x']) - assert all(isinstance(y, float) for y in first_data['y']) + lines = graph.elements + assert len(lines) == 2 - second_data = graphs[0]['data'][1] - assert second_data['label'] == 'cos(x)' - assert len(second_data['x']) == 100 - assert len(second_data['y']) == 100 - assert all(isinstance(x, float) for x in second_data['x']) - assert all(isinstance(y, float) for y in second_data['y']) + first_line = lines[0] + assert first_line.label == "sin(x)" + assert len(first_line.points) == 100 + assert all(isinstance(point, tuple) for point in first_line.points) + assert all( + isinstance(x, float) and isinstance(y, float) for x, y in first_line.points + ) + + second_line = lines[1] + assert second_line.label == "cos(x)" + assert len(second_line.points) == 100 diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py index d9258d6c..d26dd245 100644 --- a/python/tests/graphs/test_pie.py +++ b/python/tests/graphs/test_pie.py @@ -1,4 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import PieGraph code = """ import matplotlib.pyplot as plt @@ -29,30 +30,21 @@ async def test_pie_graph(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) - data = result.results[0].data - assert data + graph = result.results[0].graph + assert graph - graphs = data.get("graphs") - assert graphs + assert isinstance(graph, PieGraph) - assert graphs[0]['type'] == "pie" - assert graphs[0]['title'] == "Will I wake up early tomorrow?" - assert graphs[0]['x_label'] == "x" - assert graphs[0]['y_label'] == "y" - assert graphs[0]['x_unit'] is None - assert graphs[0]['y_unit'] is None + assert graph.title == "Will I wake up early tomorrow?" - assert len(graphs[0]['x_ticks']) == 0 - assert len(graphs[0]['y_ticks']) == 0 + assert len(graph.elements) == 2 - assert len(graphs[0]['data']) == 2 + first_data = graph.elements[0] + assert first_data.label == "No" + assert first_data.angle == 324 + assert first_data.radius == 1 - first_data = graphs[0]['data'][0] - assert first_data['label'] == 'No' - assert round(first_data['theta']) == 324 - assert first_data['r'] == 1 - - second_data = graphs[0]['data'][1] - assert second_data['label'] == 'No, in blue' - assert round(second_data['theta']) == 36 - assert second_data['r'] == 1 + second_data = graph.elements[1] + assert second_data.label == "No, in blue" + assert second_data.angle == 36 + assert second_data.radius == 1 diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index 8e08e56d..80e42aec 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter - +from e2b_code_interpreter.graphs import ScatterGraph code = """ import matplotlib.pyplot as plt @@ -25,35 +25,30 @@ async def test_scatter_graph(async_sandbox: AsyncCodeInterpreter): result = await async_sandbox.notebook.exec_cell(code) - data = result.results[0].data - assert data - - graphs = data.get("graphs") - assert graphs + graph = result.results[0].graph + assert graph - assert graphs[0]['type'] == "scatter" + assert isinstance(graph, ScatterGraph) - assert graphs[0]['x_label'] == "A" - assert graphs[0]['y_label'] == "B" + assert graph.title is None + assert graph.x_label == "A" + assert graph.y_label == "B" - assert all(isinstance(x, float) for x in graphs[0]['x_ticks']) - assert all(isinstance(y, float) for y in graphs[0]['y_ticks']) + assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(y, float) for y in graph.y_ticks) - assert all(isinstance(x, str) for x in graphs[0]['y_tick_labels']) - assert all(isinstance(y, str) for y in graphs[0]['y_tick_labels']) + assert all(isinstance(x, str) for x in graph.y_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) - assert len(graphs[0]['data']) == 2 + assert len(graph.elements) == 2 - first_data = graphs[0]['data'][0] - assert first_data['label'] == 'Dataset 1' - assert len(first_data['x']) == 5 - assert len(first_data['y']) == 5 - assert all(isinstance(x, float) for x in first_data['x']) - assert all(isinstance(y, float) for y in first_data['y']) + first_data = graph.elements[0] + assert first_data.label == "Dataset 1" + assert len(first_data.points) == 5 + print(first_data.points) + assert all(isinstance(x, tuple) for x in first_data.points) - second_data = graphs[0]['data'][1] - assert second_data['label'] == 'Dataset 2' - assert len(second_data['x']) == 10 - assert len(second_data['y']) == 10 - assert all(isinstance(x, float) for x in second_data['x']) - assert all(isinstance(y, float) for y in second_data['y']) + second_data = graph.elements[1] + assert second_data.label == "Dataset 2" + assert len(second_data.points) == 10 + assert all(isinstance(x, tuple) for x in second_data.points) diff --git a/python/tests/graphs/test_supergraph.py b/python/tests/graphs/test_supergraph.py new file mode 100644 index 00000000..5cd8d5b6 --- /dev/null +++ b/python/tests/graphs/test_supergraph.py @@ -0,0 +1,61 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import GraphType, SuperGraph, LineGraph, ScatterGraph + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Data for plotting +x1 = np.linspace(0, 10, 100) +y1 = np.sin(x1) + +# Create a figure with multiple subplots +fig, axs = plt.subplots(1, 2, figsize=(10, 8)) +fig.suptitle('Multiple Graphs Example', fontsize=16) + +# Plotting on the different axes +axs[0].plot(x1, y1, 'r') +axs[0].set_title('Sine Wave') +axs[0].grid(True) + +N = 5 +x2 = np.random.rand(N) +y2 = np.random.rand(N) + +axs[1].scatter(x2, y2, c='blue', label='Dataset 1') +axs[1].set_xlabel('X') +axs[1].set_ylabel('Y') +axs[1].set_title('Scatter Plot') +axs[1].grid(True) + +plt.show() +""" + + +async def test_super_graph(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + graph = result.results[0].graph + assert graph + + assert isinstance(graph, SuperGraph) + assert graph.type == GraphType.SUPERGRAPH + assert graph.title == "Multiple Graphs Example" + + graphs = graph.elements + assert len(graphs) == 2 + + first_graph = graphs[0] + assert first_graph.title == "Sine Wave" + assert isinstance(first_graph, LineGraph) + assert first_graph.x_label is None + assert first_graph.y_label is None + assert len(first_graph.elements) == 1 + assert len(first_graph.elements[0].points) == 100 + + second_graph = graphs[1] + assert second_graph.title == "Scatter Plot" + assert isinstance(second_graph, ScatterGraph) + assert second_graph.x_label == "X" + assert second_graph.y_label == "Y" + assert len(second_graph.elements) == 1 + assert len(second_graph.elements[0].points) == 5 diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 12610289..09247117 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -7,7 +7,6 @@ from api.models.output import OutputType - warnings.filterwarnings("ignore", category=UserWarning) @@ -36,6 +35,7 @@ class Result(BaseModel): json: Optional[dict] = None javascript: Optional[str] = None data: Optional[dict] = None + graph: Optional[dict] = None extra: Optional[dict] = None "Extra data that can be included. Not part of the standard types." @@ -60,6 +60,7 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.json = data.pop("application/json", None) self.javascript = data.pop("application/javascript", None) self.data = data.pop("e2b/data", None) + self.graph = data.pop("e2b/graph", None) self.extra = data def formats(self) -> Iterable[str]: @@ -76,6 +77,8 @@ def formats(self) -> Iterable[str]: "latex", "json", "javascript", + "data", + "graph", ]: if getattr(self, key): formats.append(key) diff --git a/template/server/messaging.py b/template/server/messaging.py index a14a0e06..e5673358 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -157,14 +157,18 @@ async def execute( vars_to_set = {**global_env_vars, **env_vars} # if there is an indent in the code, we need to add the env vars at the beginning of the code - lines = code.split('\n') + lines = code.split("\n") indent = 0 for i, line in enumerate(lines): if line.strip() != "": indent = len(line) - len(line.lstrip()) break - code = indent * " " + f"os.environ.set_envs_for_execution({vars_to_set})\n" + code + code = ( + indent * " " + + f"os.environ.set_envs_for_execution({vars_to_set})\n" + + code + ) logger.info(code) request = self._get_execute_request(message_id, code, False) @@ -198,10 +202,19 @@ async def _process_message(self, data: dict): :param data: The message data """ - if data["msg_type"] == "status" and data['content']['execution_state'] == 'restarting': + if ( + data["msg_type"] == "status" + and data["content"]["execution_state"] == "restarting" + ): logger.error("Kernel is restarting") for execution in self._executions.values(): - await execution.queue.put(Error(name="KernelRestarting", value="Kernel was restarted", traceback="")) + await execution.queue.put( + Error( + name="KernelRestarting", + value="Kernel was restarted", + traceback="", + ) + ) await execution.queue.put(EndOfExecution()) return diff --git a/template/server/requirements.txt b/template/server/requirements.txt index b6138de5..0d327bad 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -3,3 +3,4 @@ httpx==0.27.0 websockets==12.0 uvicorn[standard]==0.30.1 requests==2.32.3 +pydantic==2.9.1 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index cd6dbdb5..cd7c64be 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,6 +1,6 @@ import enum import re -from typing import Optional +from typing import Optional, List, Tuple, Literal, Any import pandas from matplotlib.axes import Axes @@ -12,158 +12,375 @@ from IPython.core.formatters import BaseFormatter from matplotlib.text import Text +from pydantic import BaseModel, Field from traitlets.traitlets import Unicode, ObjectName -class PlotType(enum.Enum): +class GraphType(str, enum.Enum): LINE = "line" SCATTER = "scatter" BAR = "bar" PIE = "pie" + BOX_AND_WHISKER = "box_and_whisker" + SUPERGRAPH = "supergraph" UNKNOWN = "unknown" -def _extract_units(label: str) -> Optional[str]: - """ - Function to extract units from labels - """ - # Look for units in parentheses or brackets - match = re.search(r"\s\((.*?)\)|\[(.*?)\]", label) - if match: - return match.group(1) or match.group(2) # return the matched unit - return None # No units found +class Graph(BaseModel): + type: GraphType + title: Optional[str] = None + + elements: List[Any] = Field(default_factory=list) + + def __init__(self, ax: Optional[Axes] = None, **kwargs): + super().__init__(**kwargs) + if ax: + self._extract_info(ax) + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for Graph + """ + title = ax.get_title() + if title == "": + title = None + + self.title = title + + +class Graph2D(Graph): + x_label: Optional[str] = None + y_label: Optional[str] = None + x_unit: Optional[str] = None + y_unit: Optional[str] = None + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for Graph2D + """ + super()._extract_info(ax) + x_label = ax.get_xlabel() + if x_label == "": + x_label = None + self.x_label = x_label + + y_label = ax.get_ylabel() + if y_label == "": + y_label = None + self.y_label = y_label + + regex = r"\s\((.*?)\)|\[(.*?)\]" + if self.x_label: + match = re.search(regex, self.x_label) + if match: + self.x_unit = match.group(1) or match.group(2) + + if self.y_label: + match = re.search(regex, self.y_label) + if match: + self.y_unit = match.group(1) or match.group(2) + + def _change_orientation(self): + self.x_label, self.y_label = self.y_label, self.x_label + self.x_unit, self.y_unit = self.y_unit, self.x_unit + + +class PointData(BaseModel): + label: str + points: List[Tuple[float, float]] + + +class PointGraph(Graph2D): + x_ticks: List[float] = Field(default_factory=list) + x_tick_labels: List[str] = Field(default_factory=list) + y_ticks: List[float] = Field(default_factory=list) + y_tick_labels: List[str] = Field(default_factory=list) + + elements: List[PointData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for PointGraph + """ + super()._extract_info(ax) + self.x_ticks = [float(tick) for tick in ax.get_xticks()] + self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + + self.y_ticks = [float(tick) for tick in ax.get_yticks()] + self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] + + +class LineGraph(PointGraph): + type: Literal[GraphType.LINE] = GraphType.LINE + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for line in ax.get_lines(): + points = [(x, y) for x, y in zip(line.get_xdata(), line.get_ydata())] + line_data = PointData(label=line.get_label(), points=points) + self.elements.append(line_data) + + +class ScatterGraph(PointGraph): + type: Literal[GraphType.SCATTER] = GraphType.SCATTER + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for collection in ax.collections: + points = [(x, y) for x, y in collection.get_offsets()] + scatter_data = PointData(label=collection.get_label(), points=points) + self.elements.append(scatter_data) + + +class BarData(BaseModel): + label: str + value: float + + +class BarGraph(Graph2D): + type: Literal[GraphType.BAR] = GraphType.BAR + + elements: List[BarData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + for container in ax.containers: + heights = [rect.get_height() for rect in container] + if all(height == heights[0] for height in heights): + # vertical bars + self._change_orientation() + labels = [label.get_text() for label in ax.get_yticklabels()] + values = [rect.get_width() for rect in container] + else: + # horizontal bars + labels = [label.get_text() for label in ax.get_xticklabels()] + values = heights + for label, value in zip(labels, values): + bar = BarData(label=label, value=value) + self.elements.append(bar) + + +class PieData(BaseModel): + label: str + angle: float + radius: float + +class PieGraph(Graph): + type: Literal[GraphType.PIE] = GraphType.PIE -def _get_type_of_plot(ax: Axes) -> PlotType: + elements: List[PieData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for wedge in ax.patches: + pie_data = PieData( + label=wedge.get_label(), + angle=abs(round(wedge.theta2 - wedge.theta1, 4)), + radius=wedge.r, + ) + + self.elements.append(pie_data) + + +class BoxAndWhiskerData(BaseModel): + label: str + min: float + first_quartile: float + median: float + third_quartile: float + max: float + + +class BoxAndWhiskerGraph(Graph2D): + type: Literal[GraphType.BOX_AND_WHISKER] = GraphType.BOX_AND_WHISKER + + elements: List[BoxAndWhiskerData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + boxes = [] + for box in ax.patches: + vertices = box.get_path().vertices + x_vertices = vertices[:, 0] + y_vertices = vertices[:, 1] + x = min(x_vertices) + y = min(y_vertices) + boxes.append( + { + "x": x, + "y": y, + "label": box.get_label(), + "width": round(max(x_vertices) - x, 4), + "height": round(max(y_vertices) - y, 4), + } + ) + + orientation = "horizontal" + if all(box["height"] == boxes[0]["height"] for box in boxes): + orientation = "vertical" + + if orientation == "vertical": + self._change_orientation() + for box in boxes: + box["x"], box["y"] = box["y"], box["x"] + box["width"], box["height"] = box["height"], box["width"] + + for line in ax.lines: + xdata = line.get_xdata() + ydata = line.get_ydata() + + if orientation == "vertical": + xdata, ydata = ydata, xdata + + if len(ydata) != 2: + continue + for box in boxes: + if box["x"] <= xdata[0] <= xdata[1] <= box["x"] + box["width"]: + break + else: + continue + + if ( + ydata[0] == ydata[1] + and box["y"] <= ydata[0] <= box["y"] + box["height"] + ): + box["median"] = ydata[0] + continue + + lower_value = min(ydata) + upper_value = max(ydata) + if upper_value == box["y"]: + box["whisker_lower"] = lower_value + elif lower_value == box["y"] + box["height"]: + box["whisker_upper"] = upper_value + + self.elements = [ + BoxAndWhiskerData( + label=box["label"], + min=box["whisker_lower"], + first_quartile=box["y"], + median=box["median"], + third_quartile=box["y"] + box["height"], + max=box["whisker_upper"], + ) + for box in boxes + ] + + +class SuperGraph(Graph): + type: Literal[GraphType.SUPERGRAPH] = GraphType.SUPERGRAPH + elements: List[ + LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph + ] = Field(default_factory=list) + + def __init__(self, figure: Figure): + title = figure.get_suptitle() + super().__init__(title=title) + + self.elements = [get_graph_from_ax(ax) for ax in figure.axes] + + +def _get_type_of_graph(ax: Axes) -> GraphType: objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) # Check for Line plots if all(isinstance(line, Line2D) for line in objects): - return PlotType.LINE + return GraphType.LINE # Check for Scatter plots if all(isinstance(path, PathCollection) for path in objects): - return PlotType.SCATTER + return GraphType.SCATTER # Check for Pie plots if all(isinstance(artist, Wedge) for artist in objects): - return PlotType.PIE + return GraphType.PIE # Check for Bar plots if all(isinstance(rect, Rectangle) for rect in objects): - return PlotType.BAR + return GraphType.BAR - return PlotType.UNKNOWN + if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): + return GraphType.BOX_AND_WHISKER + return GraphType.UNKNOWN -def _figure_repr_e2b_data_(self: Figure): - """ - This method is used to extract data from the figure object to a dictionary - """ - # Get all Axes objects from the Figure - axes = self.get_axes() - data = [] - # Iterate through all Axes to extract data - for ax in axes: - ax_data = { - "title": ax.get_title(), - "x_label": ax.get_xlabel(), - "x_unit": _extract_units(ax.get_xlabel()), - "x_ticks": ax.get_xticks(), - "x_tick_labels": [label.get_text() for label in ax.get_xticklabels()], - "x_scale": ax.get_xscale(), - "y_label": ax.get_ylabel(), - "y_unit": _extract_units(ax.get_ylabel()), - "y_ticks": ax.get_yticks(), - "y_tick_labels": [label.get_text() for label in ax.get_yticklabels()], - "y_scale": ax.get_yscale(), - "data": [], - } - - plot_type = _get_type_of_plot(ax) - ax_data["type"] = plot_type.value - - if plot_type == PlotType.LINE: - for line in ax.get_lines(): - line_data = { - "x": line.get_xdata().tolist(), - "y": line.get_ydata().tolist(), - "label": line.get_label(), - } - ax_data["data"].append(line_data) - - if plot_type == PlotType.SCATTER: - for collection in ax.collections: - offsets = collection.get_offsets() - scatter_data = { - "label": collection.get_label(), - "x": offsets[:, 0].tolist(), - "y": offsets[:, 1].tolist(), - } - - ax_data["data"].append(scatter_data) +def get_graph_from_ax( + ax: Axes, +) -> LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph | Graph: + graph_type = _get_type_of_graph(ax) - if plot_type == PlotType.BAR: - for container in ax.containers: - orientation = "unknown" + if graph_type == GraphType.LINE: + graph = LineGraph(ax=ax) + elif graph_type == GraphType.SCATTER: + graph = ScatterGraph(ax=ax) + elif graph_type == GraphType.BAR: + graph = BarGraph(ax=ax) + elif graph_type == GraphType.PIE: + graph = PieGraph(ax=ax) + elif graph_type == GraphType.BOX_AND_WHISKER: + graph = BoxAndWhiskerGraph(ax=ax) + else: + graph = Graph(ax=ax) - widths = [rect.get_width() for rect in container] - heights = [rect.get_height() for rect in container] - if all(height == heights[0] for height in heights): - orientation = "vertical" + return graph - if all(width == widths[0] for width in widths): - orientation = "horizontal" - container_data = { - "label": container.get_label(), - "x": [rect.get_x() for rect in container], - "y": [rect.get_y() for rect in container], - "widths": widths, - "heights": heights, - "orientation": orientation, - } +def _figure_repr_e2b_graph_(self: Figure): + """ + This method is used to extract data from the figure object to a dictionary + """ + # Get all Axes objects from the Figure + axes = self.get_axes() - ax_data["data"].append(container_data) + if not axes: + return {} + elif len(axes) > 1: + graph = SuperGraph(figure=self) + else: + ax = axes[0] + graph = get_graph_from_ax(ax) + return graph.model_dump() - if plot_type == PlotType.PIE: - for wedge in ax.patches: - pie_data = { - "label": wedge.get_label(), - "theta": abs(wedge.theta2 - wedge.theta1), - "center": wedge.center, - "r": wedge.r, - } - ax_data["data"].append(pie_data) +def _dataframe_repr_e2b_data_(self: pandas.DataFrame): + return self.to_dict(orient="list") - data.append(ax_data) - return {"graphs": data} +class E2BDataFormatter(BaseFormatter): + format_type = Unicode("e2b/data") + print_method = ObjectName("_repr_e2b_data_") + _return_type = (dict, str) -def _data_frame_repr_e2b_data_(self: pandas.DataFrame): - return self.to_dict(orient="list") + type_printers = {pandas.DataFrame: _dataframe_repr_e2b_data_} -class E2BFormatter(BaseFormatter): - format_type = Unicode("e2b/data") +class E2BGraphFormatter(BaseFormatter): + format_type = Unicode("e2b/graph") print_method = ObjectName("_repr_e2b_data_") _return_type = (dict, str) - type_printers = {pandas.DataFrame: _data_frame_repr_e2b_data_} - def __call__(self, obj): # Figure object is for some reason removed on execution of the cell, # so it can't be used in type_printers or with top-level import from matplotlib.pyplot import Figure if isinstance(obj, Figure): - return _figure_repr_e2b_data_(obj) + return _figure_repr_e2b_graph_(obj) return super().__call__(obj) ip = IPython.get_ipython() -ip.display_formatter.formatters["e2b/data"] = E2BFormatter(parent=ip.display_formatter) +ip.display_formatter.formatters["e2b/data"] = E2BDataFormatter( + parent=ip.display_formatter +) +ip.display_formatter.formatters["e2b/graph"] = E2BGraphFormatter( + parent=ip.display_formatter +) From b368750cfedf3231b8772aa4aaaa97de62bf5a9b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 12 Sep 2024 17:17:38 +0000 Subject: [PATCH 310/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 08e7ad3a..9a73acab 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.53", + "version": "0.0.9-beta.54", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 94d3f4a1..45b9643c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b26" +version = "0.0.11b27" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From da12e67ab4e2335b084e7f2d1cac5332703b2ba9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 12 Sep 2024 19:21:02 +0200 Subject: [PATCH 311/722] [skip ci] Fix workflow name --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 850b7bc5..3de134d8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,4 +1,4 @@ -name: Test Python package +name: Test package on: push: From 97a3e77dd437f25a5e101a419bd202d19efe5c27 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 12 Sep 2024 21:47:09 +0200 Subject: [PATCH 312/722] Explicitly state all attributes --- python/e2b_code_interpreter/graphs.py | 5 ++++- python/e2b_code_interpreter/models.py | 23 +++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 2b4c93b9..571e4538 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -159,7 +159,10 @@ def __init__(self, **kwargs): ] -def deserialize_graph(data: dict) -> GraphTypes: +def deserialize_graph(data: Optional[dict]) -> Optional[GraphTypes]: + if not data: + return None + if data["type"] == GraphType.LINE.value: graph = LineGraph(**data) elif data["type"] == GraphType.SCATTER.value: diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 9baee6dc..a70f08a8 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -16,7 +16,7 @@ from httpx import Response -from e2b_code_interpreter.graphs import Graph, deserialize_graph +from .graphs import Graph, deserialize_graph T = TypeVar("T") OutputHandler = Union[ @@ -134,10 +134,6 @@ def formats(self) -> Iterable[str]: return formats - def __post_init__(self): - if isinstance(self.graph, dict): - self.graph = deserialize_graph(self.graph) - def __str__(self) -> Optional[str]: """ Returns the text representation of the data. @@ -341,7 +337,22 @@ def parse_output( data_type = data.pop("type") if data_type == "result": - result = Result(**data) + result = Result( + text=data.get("text"), + html=data.get("html"), + markdown=data.get("markdown"), + svg=data.get("svg"), + png=data.get("png"), + jpeg=data.get("jpeg"), + pdf=data.get("pdf"), + latex=data.get("latex"), + json=data.get("json"), + javascript=data.get("javascript"), + data=data.get("data"), + graph=deserialize_graph(data.get("graph")), + is_main_result=data.get("is_main_result", False), + extra=data.get("extra"), + ) execution.results.append(result) if on_result: on_result(result) From f7838c9dd8df80657c2d539ed9cc5b9c071e0279 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 13 Sep 2024 09:28:01 +0200 Subject: [PATCH 313/722] Fix tests for debug mode --- python/tests/async/test_async_env_vars.py | 7 ++++--- python/tests/async/test_async_statefulness.py | 4 ++-- python/tests/sync/test_env_vars.py | 7 ++++--- python/tests/sync/test_statefulness.py | 4 ++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 8cdc0662..039fb48f 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): assert result.text == "bar" -async def test_env_vars_override(): +async def test_env_vars_override(debug: bool): sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) await sbx.notebook.exec_cell( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" @@ -28,8 +28,9 @@ async def test_env_vars_override(): result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") assert result.text == "value" - result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") - assert result.text == "value" + if not debug: + result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") + assert result.text == "value" result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" diff --git a/python/tests/async/test_async_statefulness.py b/python/tests/async/test_async_statefulness.py index bae8e301..97ef0d13 100644 --- a/python/tests/async/test_async_statefulness.py +++ b/python/tests/async/test_async_statefulness.py @@ -2,7 +2,7 @@ async def test_stateful(async_sandbox: AsyncCodeInterpreter): - await async_sandbox.notebook.exec_cell("x = 1") + await async_sandbox.notebook.exec_cell("async_test_stateful = 1") - result = await async_sandbox.notebook.exec_cell("x+=1; x") + result = await async_sandbox.notebook.exec_cell("async_test_stateful+=1; async_test_stateful") assert result.text == "2" diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index a6738928..183a1cb4 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -15,7 +15,7 @@ async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): assert result.text == "bar" -async def test_env_vars_override(): +async def test_env_vars_override(debug: bool): sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) sbx.notebook.exec_cell( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" @@ -26,8 +26,9 @@ async def test_env_vars_override(): result = sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") assert result.text == "value" - result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") - assert result.text == "value" + if not debug: + result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") + assert result.text == "value" result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" diff --git a/python/tests/sync/test_statefulness.py b/python/tests/sync/test_statefulness.py index d1242c60..8e401b3c 100644 --- a/python/tests/sync/test_statefulness.py +++ b/python/tests/sync/test_statefulness.py @@ -2,7 +2,7 @@ def test_stateful(sandbox: CodeInterpreter): - sandbox.notebook.exec_cell("x = 1") + sandbox.notebook.exec_cell("test_stateful = 1") - result = sandbox.notebook.exec_cell("x+=1; x") + result = sandbox.notebook.exec_cell("test_stateful+=1; test_stateful") assert result.text == "2" From aafc6b9134e15a5d358df511072b9443f3af052f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 13 Sep 2024 09:52:20 +0200 Subject: [PATCH 314/722] [skip ci] Add init methods --- python/e2b_code_interpreter/models.py | 76 +++++++++++++++++++++------ python/pyproject.toml | 2 +- 2 files changed, 61 insertions(+), 17 deletions(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index a70f08a8..3377cdaa 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -49,6 +49,11 @@ class ExecutionError: value: str traceback: str + def __init__(self, name: str, value: str, traceback: str, **kwargs): + self.name = name + self.value = value + self.traceback = traceback + def to_json(self) -> str: """ Returns the JSON representation of the Error object. @@ -96,6 +101,39 @@ def __getitem__(self, item): extra: Optional[dict] = None """Extra data that can be included. Not part of the standard types.""" + def __init__( + self, + text: Optional[str] = None, + html: Optional[str] = None, + markdown: Optional[str] = None, + svg: Optional[str] = None, + png: Optional[str] = None, + jpeg: Optional[str] = None, + pdf: Optional[str] = None, + latex: Optional[str] = None, + json: Optional[dict] = None, + javascript: Optional[str] = None, + data: Optional[dict] = None, + graph: Optional[dict] = None, + is_main_result: bool = False, + extra: Optional[dict] = None, + **kwargs, # Allows for future expansion + ): + self.text = text + self.html = html + self.markdown = markdown + self.svg = svg + self.png = png + self.jpeg = jpeg + self.pdf = pdf + self.latex = latex + self.json = json + self.javascript = javascript + self.data = data + self.graph = deserialize_graph(graph) if graph else None + self.is_main_result = is_main_result + self.extra = extra + def formats(self) -> Iterable[str]: """ Returns all available formats of the result. @@ -232,6 +270,10 @@ class Logs: stderr: List[str] = field(default_factory=list) """List of strings printed to stderr by prints, subprocesses, etc.""" + def __init__(self, stdout: List[str] = None, stderr: List[str] = None, **kwargs): + self.stdout = stdout or [] + self.stderr = stderr or [] + def __repr__(self): return f"Logs(stdout: {self.stdout}, stderr: {self.stderr})" @@ -270,6 +312,19 @@ class Execution: execution_count: Optional[int] = None """Execution count of the cell.""" + def __init__( + self, + results: List[Result] = None, + logs: Logs = None, + error: Optional[ExecutionError] = None, + execution_count: Optional[int] = None, + **kwargs, + ): + self.results = results or [] + self.logs = logs or Logs() + self.error = error + self.execution_count = execution_count + def __repr__(self): return f"Execution(Results: {self.results}, Logs: {self.logs}, Error: {self.error})" @@ -337,22 +392,7 @@ def parse_output( data_type = data.pop("type") if data_type == "result": - result = Result( - text=data.get("text"), - html=data.get("html"), - markdown=data.get("markdown"), - svg=data.get("svg"), - png=data.get("png"), - jpeg=data.get("jpeg"), - pdf=data.get("pdf"), - latex=data.get("latex"), - json=data.get("json"), - javascript=data.get("javascript"), - data=data.get("data"), - graph=deserialize_graph(data.get("graph")), - is_main_result=data.get("is_main_result", False), - extra=data.get("extra"), - ) + result = Result(**data) execution.results.append(result) if on_result: on_result(result) @@ -374,3 +414,7 @@ def parse_output( class Kernel: kernel_id: str name: str + + def __init__(self, kernel_id: str, name: str, **kwargs): + self.kernel_id = kernel_id + self.name = name diff --git a/python/pyproject.toml b/python/pyproject.toml index 45b9643c..e4dc3976 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b27" +version = "0.0.11b29" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From b3e5225a590e79ae93c572dc25fc3a8774eedb6c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 17 Sep 2024 20:19:56 +0200 Subject: [PATCH 315/722] Simplify example --- python/example.py | 76 ++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 54 deletions(-) diff --git a/python/example.py b/python/example.py index fce868b6..b0a89750 100644 --- a/python/example.py +++ b/python/example.py @@ -10,67 +10,35 @@ code = """ -import psutil -import os +import matplotlib.pyplot as plt +import numpy as np -def force_oom(): - # Get current memory usage - mem_before = psutil.virtual_memory().used - - # Start creating large lists - size = 10000000 # Start with 10 million integers - increment = 5000000 # Increase by 5 million integers each iteration - - while True: - # Create a large list of integers - large_list = [i for i in range(size)] - - # Get current memory usage - mem_after = psutil.virtual_memory().used - - # Calculate memory difference - mem_diff = mem_after - mem_before - - print(f"Created list of size {size} MB") - print(f"Memory increase: {mem_diff / (1024 * 1024):.2f} GB") - - # Reset memory usage tracking - mem_before = mem_after - - # Increment size for next iteration - size += increment - - # Sleep briefly to allow OS to respond - import time - time.sleep(0.1) +# Step 1: Define the data for the pie chart +categories = ["No", "No, in blue"] +sizes = [90, 10] -# Run the function -force_oom() -""" +# Step 2: Create the figure and axis objects +fig, ax = plt.subplots(figsize=(8, 8)) +plt.xlabel("x") +plt.ylabel("y") -async def create_sbx(i: int): - sbx = await AsyncCodeInterpreter.create(timeout=60, template="rth7a7wt20f3ymyr74zo") - # with open('t2.csv') as f: - # await sbx.files.write("/home/user/t.csv", f) - print("executing cell") - print(f"Created sandbox {sbx.sandbox_id}") - x = time.time() - r = await sbx.notebook.exec_cell(code) - print(f"Executed in {time.time() - x}") - print(r.logs.stdout) - print(r.error) +# Step 3: Create the pie chart +ax.pie(sizes, labels=categories, autopct='%1.1f%%', startangle=90, colors=plt.cm.Pastel1.colors[:len(categories)]) +# Step 4: Add title and legend +ax.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle +plt.title('Will I wake up early tomorrow?') -async def run(): - for j in range(1): - print(f"Creating {j}. batch of sandboxes") - futures = [] - for i in range(1): - futures.append(create_sbx(i)) +# Step 5: Show the plot +plt.show() +""" - sbxs = await asyncio.gather(*futures) - sleep(2) + +async def run(): + sbx = await AsyncCodeInterpreter.create(timeout=60) + e = await sbx.notebook.exec_cell(code) + print(e.results[0].graph) asyncio.run(run()) From f095a72c0c1114bfc4a1b0fd3fe28aed04d81910 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 17 Sep 2024 18:20:57 +0000 Subject: [PATCH 316/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 9a73acab..f904d30e 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.54", + "version": "0.0.9-beta.55", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index e4dc3976..007f3b4c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b29" +version = "0.0.11b30" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 00084a72c41f671e11e05f6633c9d0a4ecf57b58 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 17 Sep 2024 20:26:54 +0200 Subject: [PATCH 317/722] Don't install multiple language for local testing --- template/test.Dockerfile | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/template/test.Dockerfile b/template/test.Dockerfile index edc50968..91334f98 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -18,25 +18,6 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user -# R Kernel -RUN apt-get update && apt-get install -y r-base -RUN R -e "install.packages('IRkernel')" -RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" - -# Java Kernel -RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ - unzip ijava-1.3.0.zip && \ - python install.py --sys-prefix - -# Javascript Kernel -RUN npm install -g node-gyp -RUN npm install -g --unsafe-perm ijavascript -RUN ijsinstall --install=global - -# Bash Kernel -RUN pip install bash_kernel -RUN python -m bash_kernel.install - # Create separate virtual environment for server RUN python -m venv $SERVER_PATH/.venv From c97562733de942a211cf71bb3ae7bc1868c03b72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 17 Sep 2024 18:27:52 +0000 Subject: [PATCH 318/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index f904d30e..e8c1051c 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.55", + "version": "0.0.9-beta.56", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 007f3b4c..ff1ecd69 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b30" +version = "0.0.11b31" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From ba0ad12119d2af4f6079d8d69b8b33d040044925 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 18 Sep 2024 07:29:01 +0200 Subject: [PATCH 319/722] Fix unknown graphs --- js/tests/graphs/unknown.test.ts | 39 ++++++++++++++++++++++++++ python/e2b_code_interpreter/graphs.py | 5 ++-- python/tests/graphs/test_unknown.py | 40 +++++++++++++++++++++++++++ template/startup_scripts/0002_data.py | 2 +- 4 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 js/tests/graphs/unknown.test.ts create mode 100644 python/tests/graphs/test_unknown.py diff --git a/js/tests/graphs/unknown.test.ts b/js/tests/graphs/unknown.test.ts new file mode 100644 index 00000000..70939c8b --- /dev/null +++ b/js/tests/graphs/unknown.test.ts @@ -0,0 +1,39 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. +sandboxTest('unknown', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Create a figure and an axis +fig, ax = plt.subplots() + +# Create data for two concentric circles +circle1 = plt.Circle((0, 0), 1, color='blue', fill=False, linewidth=2) +circle2 = plt.Circle((0, 0), 2, color='red', fill=False, linewidth=2) + +# Add the circles to the axes +ax.add_artist(circle1) +ax.add_artist(circle2) + +# Set grid +ax.grid(True) + +# Set title +plt.title('Two Concentric Circles') + +# Show the plot +plt.show() +` + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + + expect(graph).toBeDefined() + expect(graph.type).toBe('unknown') + expect(graph.title).toBe('Two Concentric Circles') + + expect(graph.elements.length).toBe(0) +}) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 571e4538..e566ba09 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -19,8 +19,9 @@ class Graph: elements: List[Any] def __init__(self, **kwargs): - self.type = GraphType(kwargs["type"]) + self.type = GraphType(kwargs["type"] or GraphType.UNKNOWN) self.title = kwargs["title"] + self.elements = kwargs["elements"] class Graph2D(Graph): @@ -176,6 +177,6 @@ def deserialize_graph(data: Optional[dict]) -> Optional[GraphTypes]: elif data["type"] == GraphType.SUPERGRAPH.value: graph = SuperGraph(**data) else: - graph = Graph(**data, type=GraphType.UNKNOWN) + graph = Graph(**data) return graph diff --git a/python/tests/graphs/test_unknown.py b/python/tests/graphs/test_unknown.py new file mode 100644 index 00000000..f41ca455 --- /dev/null +++ b/python/tests/graphs/test_unknown.py @@ -0,0 +1,40 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import GraphType, Graph + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Create a figure and an axis +fig, ax = plt.subplots() + +# Create data for two concentric circles +circle1 = plt.Circle((0, 0), 1, color='blue', fill=False, linewidth=2) +circle2 = plt.Circle((0, 0), 2, color='red', fill=False, linewidth=2) + +# Add the circles to the axes +ax.add_artist(circle1) +ax.add_artist(circle2) + +# Set grid +ax.grid(True) + +# Set title +plt.title('Two Concentric Circles') + +# Show the plot +plt.show() +""" + + +async def test_unknown_graphs(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + graph = result.results[0].graph + assert graph + + assert isinstance(graph, Graph) + assert graph.type == GraphType.UNKNOWN + assert graph.title == "Two Concentric Circles" + + assert len(graph.elements) == 0 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index cd7c64be..12b4f144 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -326,7 +326,7 @@ def get_graph_from_ax( elif graph_type == GraphType.BOX_AND_WHISKER: graph = BoxAndWhiskerGraph(ax=ax) else: - graph = Graph(ax=ax) + graph = Graph(ax=ax, type=graph_type) return graph From df6ba6931cd2365b9d0cd80e813a73ed221f7ce7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Sep 2024 05:29:52 +0000 Subject: [PATCH 320/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index e8c1051c..0c999454 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.56", + "version": "0.0.9-beta.57", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index ff1ecd69..df3fe980 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b31" +version = "0.0.11b32" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 6a29cdacf81466d217ad128ac3bd13b3f816192f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 26 Sep 2024 11:58:53 +0200 Subject: [PATCH 321/722] Add tests before release --- .github/workflows/release_candidates.yml | 12 ++++++++++++ python/pytest.ini | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 672b8426..4738616d 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -40,6 +40,12 @@ jobs: if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} run: pnpm install --frozen-lockfile + - name: Test JS SDK + working-directory: js + if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} + run: | + pnpm run test + - name: Release JS Candidate working-directory: js if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} @@ -64,6 +70,12 @@ jobs: virtualenvs-in-project: true installer-parallel: true + - name: Test Python SDK + if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} + working-directory: python + run: | + poetry run pytest -n 4 --verbose -x + - name: Release Candidate if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} working-directory: python diff --git a/python/pytest.ini b/python/pytest.ini index 2b1ebd0a..8c25a4e4 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,4 +4,4 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addopts = "--import-mode=importlib" "--numprocesses=auto" +addopts = "--import-mode=importlib" "--numprocesses=4" From 59e2430ec851fceb1666de3a0de6252e826efa3f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 26 Sep 2024 12:39:03 +0200 Subject: [PATCH 322/722] Add api key to tests --- .github/workflows/release_candidates.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 4738616d..0007b5c7 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -45,6 +45,8 @@ jobs: if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} run: | pnpm run test + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} - name: Release JS Candidate working-directory: js @@ -75,6 +77,8 @@ jobs: working-directory: python run: | poetry run pytest -n 4 --verbose -x + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} - name: Release Candidate if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} From f1bd6e18acc89c26e08142e2f063f079171e7d10 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 26 Sep 2024 12:56:59 +0200 Subject: [PATCH 323/722] Install dependencies --- .github/workflows/release_candidates.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 0007b5c7..154b4208 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -76,6 +76,7 @@ jobs: if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} working-directory: python run: | + poetry install poetry run pytest -n 4 --verbose -x env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} From 0c7f8b75c17e1f936f0a93d1b1212c1914f3d208 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Sep 2024 10:59:41 +0000 Subject: [PATCH 324/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 0c999454..12f7a371 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.57", + "version": "0.0.9-beta.58", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index df3fe980..eda32415 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b32" +version = "0.0.11b33" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e151755a660f6c66e838f28018c74e9df711c573 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 11:37:54 +0200 Subject: [PATCH 325/722] Add groups for bar graphs, improve labels --- js/src/graphs.ts | 1 + python/e2b_code_interpreter/graphs.py | 2 ++ template/startup_scripts/0002_data.py | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/js/src/graphs.ts b/js/src/graphs.ts index 4524b1d5..49fba959 100644 --- a/js/src/graphs.ts +++ b/js/src/graphs.ts @@ -45,6 +45,7 @@ export type ScatterGraph = PointGraph & { export type BarData = { label: string value: string + group: string } export type BarGraph = Graph2D & { diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index e566ba09..048457ee 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -78,11 +78,13 @@ class ScatterGraph(PointGraph): class BarData: label: str + group: str value: str def __init__(self, **kwargs): self.label = kwargs["label"] self.value = kwargs["value"] + self.group = kwargs["group"] class BarGraph(Graph2D): diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 12b4f144..83800aa8 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -117,8 +117,13 @@ def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) for line in ax.get_lines(): + label = line.get_label() + if label.startswith("_child"): + number = int(label[7:]) + label = f"Line {number}" + points = [(x, y) for x, y in zip(line.get_xdata(), line.get_ydata())] - line_data = PointData(label=line.get_label(), points=points) + line_data = PointData(label=label, points=points) self.elements.append(line_data) @@ -136,6 +141,7 @@ def _extract_info(self, ax: Axes) -> None: class BarData(BaseModel): label: str + group: str value: float @@ -147,6 +153,11 @@ class BarGraph(Graph2D): def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) for container in ax.containers: + group_label = container.get_label() + if group_label.startswith("_container"): + number = int(group_label[11:]) + group_label = f"Group {number}" + heights = [rect.get_height() for rect in container] if all(height == heights[0] for height in heights): # vertical bars @@ -158,7 +169,8 @@ def _extract_info(self, ax: Axes) -> None: labels = [label.get_text() for label in ax.get_xticklabels()] values = heights for label, value in zip(labels, values): - bar = BarData(label=label, value=value) + + bar = BarData(label=label, value=value, group=group_label) self.elements.append(bar) From 77c67ce3ff4db3e2e4e81648a2368b2e803839ec Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 11:52:25 +0200 Subject: [PATCH 326/722] Improve bar tests --- js/tests/graphs/bar.test.ts | 3 ++- python/tests/graphs/test_bar.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/js/tests/graphs/bar.test.ts b/js/tests/graphs/bar.test.ts index b88cda83..ef5b61d9 100644 --- a/js/tests/graphs/bar.test.ts +++ b/js/tests/graphs/bar.test.ts @@ -13,7 +13,7 @@ sales = [100, 200, 300, 400] # Create and customize the bar graph plt.figure(figsize=(10, 6)) -plt.bar(authors, sales) +plt.bar(authors, sales, label='Books Sold', color='blue') plt.xlabel('Authors') plt.ylabel('Number of Books Sold') plt.title('Book Sales by Authors') @@ -39,6 +39,7 @@ plt.show() expect(bars.length).toBe(4) expect(bars.map((bar) => bar.value)).toEqual([100, 200, 300, 400]) + expect(bars.map((bar) => bar.group)).toEqual(['Books Sold', 'Books Sold', 'Books Sold', 'Books Sold']) expect(bars.map((bar) => bar.label)).toEqual([ 'Author A', 'Author B', diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index f4afa505..55970993 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -10,7 +10,7 @@ # Create and customize the bar graph plt.figure(figsize=(10, 6)) -plt.bar(authors, sales) +plt.bar(authors, sales, label='Books Sold', color='blue') plt.xlabel('Authors') plt.ylabel('Number of Books Sold') plt.title('Book Sales by Authors') @@ -47,3 +47,4 @@ async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): "Author C", "Author D", ] + assert [bar.group for bar in bars] == ["Books Sold"] * 4 From 32af45689e6192770664a3c077ee06ce8d5f1393 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 16:01:49 +0200 Subject: [PATCH 327/722] Fix labels --- template/startup_scripts/0002_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 83800aa8..1af9c86c 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -119,7 +119,7 @@ def _extract_info(self, ax: Axes) -> None: for line in ax.get_lines(): label = line.get_label() if label.startswith("_child"): - number = int(label[7:]) + number = int(label[6:]) label = f"Line {number}" points = [(x, y) for x, y in zip(line.get_xdata(), line.get_ydata())] @@ -155,7 +155,7 @@ def _extract_info(self, ax: Axes) -> None: for container in ax.containers: group_label = container.get_label() if group_label.startswith("_container"): - number = int(group_label[11:]) + number = int(group_label[10:]) group_label = f"Group {number}" heights = [rect.get_height() for rect in container] From 413c165ff1558d6039e99416541162b8c2e0215c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 30 Sep 2024 14:20:39 +0000 Subject: [PATCH 328/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 12f7a371..2bffae32 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.58", + "version": "0.0.9-beta.59", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index eda32415..7d31fb8a 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b33" +version = "0.0.11b34" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 11f4424f609f680f3da3c23ea32df123bb6cad99 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 17:03:43 +0200 Subject: [PATCH 329/722] Don't fail if there's exception in graph parsing, return None instead --- template/startup_scripts/0002_data.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 1af9c86c..ece1714d 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -350,14 +350,17 @@ def _figure_repr_e2b_graph_(self: Figure): # Get all Axes objects from the Figure axes = self.get_axes() - if not axes: + try: + if not axes: + return {} + elif len(axes) > 1: + graph = SuperGraph(figure=self) + else: + ax = axes[0] + graph = get_graph_from_ax(ax) + return graph.model_dump() + except: return {} - elif len(axes) > 1: - graph = SuperGraph(figure=self) - else: - ax = axes[0] - graph = get_graph_from_ax(ax) - return graph.model_dump() def _dataframe_repr_e2b_data_(self: pandas.DataFrame): From c83226da2ce8b339b26cd44874c370b715f79af6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 17:05:17 +0200 Subject: [PATCH 330/722] Don't throw exception if parsing in python SDK fails --- python/e2b_code_interpreter/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 3377cdaa..716fea2c 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -130,7 +130,11 @@ def __init__( self.json = json self.javascript = javascript self.data = data - self.graph = deserialize_graph(graph) if graph else None + if graph: + try: + self.graph = deserialize_graph(graph) + except Exception: + pass self.is_main_result = is_main_result self.extra = extra From 8db9571ae25c24c844db95398ed1feb4e675671f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 30 Sep 2024 15:10:55 +0000 Subject: [PATCH 331/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 2bffae32..6c14a9aa 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.59", + "version": "0.0.9-beta.60", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 7d31fb8a..ba32b0a9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b34" +version = "0.0.11b35" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 8940f3ba37f7ce353602834901e93736a4a7e9e9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 30 Sep 2024 17:20:15 +0200 Subject: [PATCH 332/722] Skip tests if prerelease branch --- .github/workflows/pr.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 3de134d8..4eb9e701 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -42,13 +42,15 @@ jobs: python-tests: needs: [ changes ] name: Tests Python package - if: needs.changes.outputs.python == 'true' + # If the PR does not have the label 'python-rc', the code is already tested in the prerelease workflow + if: needs.changes.outputs.python == 'true' && !contains( github.event.pull_request.labels.*.name, 'python-rc') uses: ./.github/workflows/python_tests.yml secrets: inherit js-tests: needs: [ changes ] name: Tests JS package - if: needs.changes.outputs.js == 'true' + # If the PR does not have the label 'js-rc', the code is already tested in the prerelease workflow + if: needs.changes.outputs.js == 'true' && !contains( github.event.pull_request.labels.*.name, 'js-rc') uses: ./.github/workflows/js_tests.yml secrets: inherit From 7a369130593d9cf6ffa3c27983d823880f6a87fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 30 Sep 2024 15:23:53 +0000 Subject: [PATCH 333/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 6c14a9aa..b6ec5535 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.60", + "version": "0.0.9-beta.61", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index ba32b0a9..81933a7d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b35" +version = "0.0.11b36" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 980af6f0a2dc18fce0be090612319fffa63b16bb Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 12:43:48 +0200 Subject: [PATCH 334/722] Extract dates --- js/src/graphs.ts | 6 +-- js/tests/envVars.test.ts | 14 +++--- js/tests/graphs/line.test.ts | 16 +++--- python/e2b_code_interpreter/graphs.py | 17 ++++--- python/e2b_code_interpreter/models.py | 9 +++- python/tests/async/test_async_statefulness.py | 4 +- python/tests/graphs/test_line.py | 19 +++++-- template/startup_scripts/0002_data.py | 49 ++++++++++++++++--- 8 files changed, 98 insertions(+), 36 deletions(-) diff --git a/js/src/graphs.ts b/js/src/graphs.ts index 49fba959..8c59472e 100644 --- a/js/src/graphs.ts +++ b/js/src/graphs.ts @@ -23,13 +23,13 @@ type Graph2D = Graph & { export type PointData = { label: string - points: [number, number][] + points: [(number| string), (number | string)][] } type PointGraph = Graph2D & { - x_ticks: number[] + x_ticks: (number | string)[] x_tick_labels: string[] - y_ticks: number[] + y_ticks: (number | string)[] y_tick_labels: string[] elements: PointData[] } diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index 44b6b3c3..53936fdb 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -1,10 +1,10 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' import { CodeInterpreter } from '../src' // Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. -sandboxTest('env vars', async () => { +sandboxTest.skipIf(isDebug)('env vars', async () => { const sandbox = await CodeInterpreter.create({ envs: { TEST_ENV_VAR: 'supertest' }, }) @@ -29,7 +29,7 @@ sandboxTest('env vars on sandbox override', async () => { envs: { FOO: 'bar', SBX: 'value' }, }) await sandbox.notebook.execCell( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'runtime'" ) const result = await sandbox.notebook.execCell( "import os; os.getenv('FOO')", @@ -41,10 +41,12 @@ sandboxTest('env vars on sandbox override', async () => { const result2 = await sandbox.notebook.execCell( "import os; os.getenv('RUNTIME_ENV')" ) - expect(result2.results[0].text.trim()).toEqual('value') + expect(result2.results[0].text.trim()).toEqual('runtime') - const result3 = await sandbox.notebook.execCell("import os; os.getenv('SBX')") - expect(result3.results[0].text.trim()).toEqual('value') + if (!isDebug) { + const result3 = await sandbox.notebook.execCell("import os; os.getenv('SBX')") + expect(result3.results[0].text.trim()).toEqual('value') + } const result4 = await sandbox.notebook.execCell("import os; os.getenv('FOO')") expect(result4.results[0].text.trim()).toEqual('bar') diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts index 60694213..61ef5119 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/graphs/line.test.ts @@ -6,18 +6,20 @@ sandboxTest('line', async ({ sandbox }) => { const code = ` import numpy as np import matplotlib.pyplot as plt +import datetime # Generate x values -x = np.linspace(0, 2*np.pi, 100) +dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100)] +x = np.linspace(0, 2*np.pi, 100) # Calculate y values y_sin = np.sin(x) y_cos = np.cos(x) # Create the plot plt.figure(figsize=(10, 6)) -plt.plot(x, y_sin, label='sin(x)') -plt.plot(x, y_cos, label='cos(x)') +plt.plot(dates, y_sin, label='sin(x)') +plt.plot(dates, y_cos, label='cos(x)') # Add labels and title plt.xlabel("Time (s)") @@ -39,9 +41,10 @@ plt.show() expect(graph.x_unit).toBe('s') expect(graph.y_unit).toBe('Hz') - expect(graph.x_ticks.every((tick: number) => typeof tick === 'number')).toBe( + expect(graph.x_ticks.every((tick: number) => typeof tick === 'string')).toBe( true ) + expect(new Date(graph.x_ticks[0])).toBeInstanceOf(Date) expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( true ) @@ -63,16 +66,17 @@ plt.show() expect( firstLine.points.every( (point: [number, number]) => - typeof point[0] === 'number' && typeof point[1] === 'number' + typeof point[0] === "string" && typeof point[1] === 'number' ) ).toBe(true) + expect(new Date(firstLine.points[0][0])).toEqual(new Date('2023-09-01T00:00:00.000Z')) expect(secondLine.label).toBe('cos(x)') expect(secondLine.points.length).toBe(100) expect( secondLine.points.every( (point: [number, number]) => - typeof point[0] === 'number' && typeof point[1] === 'number' + typeof point[0] === 'string' && typeof point[1] === 'number' ) ).toBe(true) }) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 048457ee..47532d5a 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -40,31 +40,36 @@ def __init__(self, **kwargs): class PointData: label: str - points: List[Tuple[float, float]] + points: List[Tuple[Union[str, int, float], Union[str, int, float]]] def __init__(self, **kwargs): self.label = kwargs["label"] - self.points = [(float(x), float(y)) for x, y in kwargs["points"]] + self.points = [(x, y) for x, y in kwargs["points"]] class PointGraph(Graph2D): - x_ticks: List[float] + x_ticks: List[Union[str, int, float]] x_tick_labels: List[str] - y_ticks: List[float] + x_unit: Optional[str] + + y_ticks: List[Union[str, int, float]] y_tick_labels: List[str] + y_unit: Optional[str] elements: List[PointData] def __init__(self, **kwargs): super().__init__(**kwargs) self.x_label = kwargs["x_label"] - self.y_label = kwargs["y_label"] self.x_unit = kwargs["x_unit"] - self.y_unit = kwargs["y_unit"] self.x_ticks = kwargs["x_ticks"] self.x_tick_labels = kwargs["x_tick_labels"] + + self.y_label = kwargs["y_label"] + self.y_unit = kwargs["y_unit"] self.y_ticks = kwargs["y_ticks"] self.y_tick_labels = kwargs["y_tick_labels"] + self.elements = [PointData(**d) for d in kwargs["elements"]] diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 716fea2c..6a25509b 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,4 +1,5 @@ import json +import logging from e2b import NotFoundException, TimeoutException, SandboxException from dataclasses import dataclass, field @@ -24,6 +25,8 @@ Callable[[T], Awaitable[Any]], ] +logger = logging.getLogger(__name__) + @dataclass class OutputMessage: @@ -133,8 +136,10 @@ def __init__( if graph: try: self.graph = deserialize_graph(graph) - except Exception: - pass + except Exception as e: + logger.error( + f"Error deserializing graph, check if you are using the latest version of the library: {e}" + ) self.is_main_result = is_main_result self.extra = extra diff --git a/python/tests/async/test_async_statefulness.py b/python/tests/async/test_async_statefulness.py index 97ef0d13..7ec98cb7 100644 --- a/python/tests/async/test_async_statefulness.py +++ b/python/tests/async/test_async_statefulness.py @@ -4,5 +4,7 @@ async def test_stateful(async_sandbox: AsyncCodeInterpreter): await async_sandbox.notebook.exec_cell("async_test_stateful = 1") - result = await async_sandbox.notebook.exec_cell("async_test_stateful+=1; async_test_stateful") + result = await async_sandbox.notebook.exec_cell( + "async_test_stateful+=1; async_test_stateful" + ) assert result.text == "2" diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 45bc8b82..1799a001 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -1,21 +1,25 @@ +import datetime + from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter from e2b_code_interpreter.graphs import LineGraph code = """ import numpy as np import matplotlib.pyplot as plt +import datetime # Generate x values -x = np.linspace(0, 2*np.pi, 100) +dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100)] +x = np.linspace(0, 2*np.pi, 100) # Calculate y values y_sin = np.sin(x) y_cos = np.cos(x) # Create the plot plt.figure(figsize=(10, 6)) -plt.plot(x, y_sin, label='sin(x)') -plt.plot(x, y_cos, label='cos(x)') +plt.plot(dates, y_sin, label='sin(x)') +plt.plot(dates, y_cos, label='cos(x)') # Add labels and title plt.xlabel("Time (s)") @@ -42,7 +46,9 @@ async def test_line_graph(async_sandbox: AsyncCodeInterpreter): assert graph.x_unit == "s" assert graph.y_unit == "Hz" - assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(x, str) for x in graph.x_ticks) + parsed_date = datetime.datetime.fromisoformat(graph.x_ticks[0]) + assert isinstance(parsed_date, datetime.datetime) assert all(isinstance(y, float) for y in graph.y_ticks) assert all(isinstance(x, str) for x in graph.y_tick_labels) @@ -56,9 +62,12 @@ async def test_line_graph(async_sandbox: AsyncCodeInterpreter): assert len(first_line.points) == 100 assert all(isinstance(point, tuple) for point in first_line.points) assert all( - isinstance(x, float) and isinstance(y, float) for x, y in first_line.points + isinstance(x, str) and isinstance(y, float) for x, y in first_line.points ) + parsed_date = datetime.datetime.fromisoformat(first_line.points[0][0]) + assert isinstance(parsed_date, datetime.datetime) + second_line = lines[1] assert second_line.label == "cos(x)" assert len(second_line.points) == 100 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index ece1714d..e5d9dbb0 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,18 +1,21 @@ +from datetime import date import enum import re -from typing import Optional, List, Tuple, Literal, Any +from typing import Optional, List, Tuple, Literal, Any, Union +import matplotlib import pandas from matplotlib.axes import Axes from matplotlib.collections import PathCollection from matplotlib.lines import Line2D from matplotlib.patches import Rectangle, Wedge, PathPatch from matplotlib.pyplot import Figure +from matplotlib.dates import _SwitchableDateConverter import IPython from IPython.core.formatters import BaseFormatter from matplotlib.text import Text -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_validator from traitlets.traitlets import Unicode, ObjectName @@ -87,13 +90,29 @@ def _change_orientation(self): class PointData(BaseModel): label: str - points: List[Tuple[float, float]] + points: List[Tuple[Union[str, int, float], Union[str, int, float]]] + + @field_validator("points", mode="before") + @classmethod + def transform_points( + cls, value + ) -> List[Tuple[Union[float, str], Union[float, str]]]: + parsed_value = [] + for x, y in value: + if isinstance(x, date): + x = x.isoformat() + + if isinstance(y, date): + y = y.isoformat() + + parsed_value.append((x, y)) + return parsed_value class PointGraph(Graph2D): - x_ticks: List[float] = Field(default_factory=list) + x_ticks: List[Union[str, int, float]] = Field(default_factory=list) x_tick_labels: List[str] = Field(default_factory=list) - y_ticks: List[float] = Field(default_factory=list) + y_ticks: List[Union[str, int, float]] = Field(default_factory=list) y_tick_labels: List[str] = Field(default_factory=list) elements: List[PointData] = Field(default_factory=list) @@ -103,11 +122,27 @@ def _extract_info(self, ax: Axes) -> None: Function to extract information for PointGraph """ super()._extract_info(ax) - self.x_ticks = [float(tick) for tick in ax.get_xticks()] + self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, ax.get_xticks()) - self.y_ticks = [float(tick) for tick in ax.get_yticks()] self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] + self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, ax.get_yticks()) + + @staticmethod + def _extract_ticks_info(converter: Any, ticks: list) -> list: + example_tick = ticks[0] + + if isinstance(converter, _SwitchableDateConverter): + return [matplotlib.dates.num2date(tick).isoformat() for tick in ticks] + else: + ticks_type = type(example_tick).__name__ + if ticks_type == "float": + return [float(tick) for tick in ticks] + elif ticks_type == "int": + return [int(tick) for tick in ticks] + else: + return ticks class LineGraph(PointGraph): From eab47764e8326f13d550f2ac7792d379db225ca8 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 12:44:18 +0200 Subject: [PATCH 335/722] Filter out grid lines --- template/startup_scripts/0002_data.py | 28 ++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index e5d9dbb0..ec3e2992 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -339,6 +339,31 @@ def _get_type_of_graph(ax: Axes) -> GraphType: if all(isinstance(line, Line2D) for line in objects): return GraphType.LINE + if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): + return GraphType.BOX_AND_WHISKER + + def is_grid_line(line: Line2D) -> bool: + x_data = line.get_xdata() + if len(x_data) != 2: + return False + + y_data = line.get_ydata() + if len(y_data) != 2: + return False + + if x_data[0] == x_data[1] or y_data[0] == y_data[1]: + return True + + return False + + filtered = [] + for obj in objects: + if isinstance(obj, Line2D) and is_grid_line(obj): + continue + filtered.append(obj) + + objects = filtered + # Check for Scatter plots if all(isinstance(path, PathCollection) for path in objects): return GraphType.SCATTER @@ -351,9 +376,6 @@ def _get_type_of_graph(ax: Axes) -> GraphType: if all(isinstance(rect, Rectangle) for rect in objects): return GraphType.BAR - if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): - return GraphType.BOX_AND_WHISKER - return GraphType.UNKNOWN From 5a62f19ebbf81294a8cb5b45f782e661ad1e517b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 14:27:35 +0200 Subject: [PATCH 336/722] Add scale --- template/startup_scripts/0002_data.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index ec3e2992..646376e6 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -112,8 +112,11 @@ def transform_points( class PointGraph(Graph2D): x_ticks: List[Union[str, int, float]] = Field(default_factory=list) x_tick_labels: List[str] = Field(default_factory=list) + x_scale: str = Field(default="linear") + y_ticks: List[Union[str, int, float]] = Field(default_factory=list) y_tick_labels: List[str] = Field(default_factory=list) + y_scale: str = Field(default="linear") elements: List[PointData] = Field(default_factory=list) @@ -124,10 +127,22 @@ def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] - self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, ax.get_xticks()) + x_ticks = ax.get_xticks() + self.x_scale = ax.get_xscale() + # Check if the x-axis is a date scale + if isinstance(ax.xaxis.converter, _SwitchableDateConverter): + self.x_scale = type(matplotlib.dates.num2date(x_ticks[0])).__name__ + + self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] - self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, ax.get_yticks()) + y_ticks = ax.get_yticks() + self.y_scale = ax.get_yscale() + # Check if the y-axis is a date scale + if isinstance(ax.yaxis.converter, _SwitchableDateConverter): + self.y_scale = type(matplotlib.dates.num2date(y_ticks[0]).__name__) + + self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, y_ticks) @staticmethod def _extract_ticks_info(converter: Any, ticks: list) -> list: From fe5db6c82a4d15abbd7c51d1af84788090c7208c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 14:45:45 +0200 Subject: [PATCH 337/722] Add prettier --- js/.prettierignore | 8 ++++++++ js/.prettierrc | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 js/.prettierignore create mode 100644 js/.prettierrc diff --git a/js/.prettierignore b/js/.prettierignore new file mode 100644 index 00000000..bfbf1d05 --- /dev/null +++ b/js/.prettierignore @@ -0,0 +1,8 @@ +/.next/ + +# imporatant to keep // $HighlightLine comments at the end of the line +apps/web/src/code/ + + +**/*.mdx +**/code/**/* diff --git a/js/.prettierrc b/js/.prettierrc new file mode 100644 index 00000000..fd496a82 --- /dev/null +++ b/js/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "semi": false +} From cba391f8a22de30505ebda7886e8e387a7272276 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 14:55:53 +0200 Subject: [PATCH 338/722] Add scale --- js/.prettierignore => .prettierignore | 0 .prettierrc | 5 ++ js/.prettierrc | 4 -- js/src/graphs.ts | 4 +- js/tests/envVars.test.ts | 4 +- js/tests/graphs/bar.test.ts | 7 ++- js/tests/graphs/line.test.ts | 6 ++- js/tests/graphs/log.test.ts | 66 +++++++++++++++++++++++++++ python/e2b_code_interpreter/graphs.py | 8 ++-- python/tests/graphs/test_line.py | 3 ++ python/tests/graphs/test_log_graph.py | 64 ++++++++++++++++++++++++++ python/tests/graphs/test_scatter.py | 3 ++ 12 files changed, 161 insertions(+), 13 deletions(-) rename js/.prettierignore => .prettierignore (100%) create mode 100644 .prettierrc delete mode 100644 js/.prettierrc create mode 100644 js/tests/graphs/log.test.ts create mode 100644 python/tests/graphs/test_log_graph.py diff --git a/js/.prettierignore b/.prettierignore similarity index 100% rename from js/.prettierignore rename to .prettierignore diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..0b495108 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "es5" +} diff --git a/js/.prettierrc b/js/.prettierrc deleted file mode 100644 index fd496a82..00000000 --- a/js/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "semi": false -} diff --git a/js/src/graphs.ts b/js/src/graphs.ts index 8c59472e..87cf7ce6 100644 --- a/js/src/graphs.ts +++ b/js/src/graphs.ts @@ -23,13 +23,15 @@ type Graph2D = Graph & { export type PointData = { label: string - points: [(number| string), (number | string)][] + points: [number | string, number | string][] } type PointGraph = Graph2D & { x_ticks: (number | string)[] + x_scale: string x_tick_labels: string[] y_ticks: (number | string)[] + y_scale: string y_tick_labels: string[] elements: PointData[] } diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index 53936fdb..e20eb237 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -44,7 +44,9 @@ sandboxTest('env vars on sandbox override', async () => { expect(result2.results[0].text.trim()).toEqual('runtime') if (!isDebug) { - const result3 = await sandbox.notebook.execCell("import os; os.getenv('SBX')") + const result3 = await sandbox.notebook.execCell( + "import os; os.getenv('SBX')" + ) expect(result3.results[0].text.trim()).toEqual('value') } diff --git a/js/tests/graphs/bar.test.ts b/js/tests/graphs/bar.test.ts index ef5b61d9..c812906f 100644 --- a/js/tests/graphs/bar.test.ts +++ b/js/tests/graphs/bar.test.ts @@ -39,7 +39,12 @@ plt.show() expect(bars.length).toBe(4) expect(bars.map((bar) => bar.value)).toEqual([100, 200, 300, 400]) - expect(bars.map((bar) => bar.group)).toEqual(['Books Sold', 'Books Sold', 'Books Sold', 'Books Sold']) + expect(bars.map((bar) => bar.group)).toEqual([ + 'Books Sold', + 'Books Sold', + 'Books Sold', + 'Books Sold', + ]) expect(bars.map((bar) => bar.label)).toEqual([ 'Author A', 'Author B', diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts index 61ef5119..4ef1a589 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/graphs/line.test.ts @@ -66,10 +66,12 @@ plt.show() expect( firstLine.points.every( (point: [number, number]) => - typeof point[0] === "string" && typeof point[1] === 'number' + typeof point[0] === 'string' && typeof point[1] === 'number' ) ).toBe(true) - expect(new Date(firstLine.points[0][0])).toEqual(new Date('2023-09-01T00:00:00.000Z')) + expect(new Date(firstLine.points[0][0])).toEqual( + new Date('2023-09-01T00:00:00.000Z') + ) expect(secondLine.label).toBe('cos(x)') expect(secondLine.points.length).toBe(100) diff --git a/js/tests/graphs/log.test.ts b/js/tests/graphs/log.test.ts new file mode 100644 index 00000000..6572dc72 --- /dev/null +++ b/js/tests/graphs/log.test.ts @@ -0,0 +1,66 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('log', async ({ sandbox }) => { + const code = ` +import numpy as np +import matplotlib.pyplot as plt + +# Generate x values +x = np.linspace(0, 100, 100) +# Calculate y values +y = np.exp(x) + +# Create the plot +plt.figure(figsize=(10, 6)) +plt.plot(x, y, label='y = e^x') + +# Set log scale for the y-axis +plt.yscale('log') + +# Add labels and title +plt.xlabel('X-axis') +plt.ylabel('Y-axis (log scale)') +plt.title('Graph with Log Scale on Y-axis') + +plt.legend() +plt.grid(True) +plt.show() +` + + const result = await sandbox.notebook.execCell(code) + const graph = result.results[0].graph + expect(graph).toBeDefined() + expect(graph.type).toBe('line') + + expect(graph.title).toBe('Graph with Log Scale on Y-axis') + + expect(graph.x_label).toBe('X-axis') + expect(graph.y_label).toBe('Y-axis (log scale)') + + expect(graph.x_unit).toBeNull() + expect(graph.y_unit).toBe('log scale') + + expect(graph.x_scale).toBe('linear') + expect(graph.y_scale).toBe('log') + + expect(graph.x_ticks.every((x) => typeof x === 'number')).toBe(true) + expect(graph.y_ticks.every((y) => typeof y === 'number')).toBe(true) + + expect(graph.x_tick_labels.every((x) => typeof x === 'string')).toBe(true) + expect(graph.y_tick_labels.every((y) => typeof y === 'string')).toBe(true) + + const lines = graph.elements + expect(lines.length).toBe(1) + + const line = lines[0] + expect(line.label).toBe('y = e^x') + expect(line.points.length).toBe(100) + + expect( + line.points.every( + ([x, y]) => typeof x === 'number' && typeof y === 'number' + ) + ).toBe(true) +}) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 47532d5a..7c71ce4e 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -50,23 +50,23 @@ def __init__(self, **kwargs): class PointGraph(Graph2D): x_ticks: List[Union[str, int, float]] x_tick_labels: List[str] - x_unit: Optional[str] + x_scale: str y_ticks: List[Union[str, int, float]] y_tick_labels: List[str] - y_unit: Optional[str] + y_scale: str elements: List[PointData] def __init__(self, **kwargs): super().__init__(**kwargs) self.x_label = kwargs["x_label"] - self.x_unit = kwargs["x_unit"] + self.x_scale = kwargs["x_scale"] self.x_ticks = kwargs["x_ticks"] self.x_tick_labels = kwargs["x_tick_labels"] self.y_label = kwargs["y_label"] - self.y_unit = kwargs["y_unit"] + self.y_scale = kwargs["y_scale"] self.y_ticks = kwargs["y_ticks"] self.y_tick_labels = kwargs["y_tick_labels"] diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 1799a001..825a230e 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -46,6 +46,9 @@ async def test_line_graph(async_sandbox: AsyncCodeInterpreter): assert graph.x_unit == "s" assert graph.y_unit == "Hz" + assert graph.x_scale == "datetime" + assert graph.y_scale == "linear" + assert all(isinstance(x, str) for x in graph.x_ticks) parsed_date = datetime.datetime.fromisoformat(graph.x_ticks[0]) assert isinstance(parsed_date, datetime.datetime) diff --git a/python/tests/graphs/test_log_graph.py b/python/tests/graphs/test_log_graph.py new file mode 100644 index 00000000..c89b57a6 --- /dev/null +++ b/python/tests/graphs/test_log_graph.py @@ -0,0 +1,64 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import LineGraph + +# Log graph +code = """ +import numpy as np +import matplotlib.pyplot as plt + +# Generate x values +x = np.linspace(0, 100, 100) +# Calculate y values +y = np.exp(x) + +# Create the plot +plt.figure(figsize=(10, 6)) +plt.plot(x, y, label='y = e^x') + +# Set log scale for the y-axis +plt.yscale('log') + +# Add labels and title +plt.xlabel('X-axis') +plt.ylabel('Y-axis (log scale)') +plt.title('Graph with Log Scale on Y-axis') + +plt.legend() +plt.grid(True) +plt.show() +""" + + +async def test_log_graph(async_sandbox: AsyncCodeInterpreter): + result = await async_sandbox.notebook.exec_cell(code) + + graph = result.results[0].graph + assert graph + + assert isinstance(graph, LineGraph) + assert graph.title == "Graph with Log Scale on Y-axis" + + assert graph.x_label == "X-axis" + assert graph.y_label == "Y-axis (log scale)" + + assert graph.x_unit == None + assert graph.y_unit == "log scale" + + assert graph.x_scale == "linear" + assert graph.y_scale == "log" + + assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(y, float) for y in graph.y_ticks) + + assert all(isinstance(x, str) for x in graph.x_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) + + lines = graph.elements + assert len(lines) == 1 + + line = lines[0] + assert line.label == "y = e^x" + assert len(line.points) == 100 + + assert all(isinstance(x, tuple) for x in line.points) + assert all(isinstance(x, float) and isinstance(y, float) for x, y in line.points) diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index 80e42aec..a8c70353 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -34,6 +34,9 @@ async def test_scatter_graph(async_sandbox: AsyncCodeInterpreter): assert graph.x_label == "A" assert graph.y_label == "B" + assert graph.x_scale == "linear" + assert graph.y_scale == "linear" + assert all(isinstance(x, float) for x in graph.x_ticks) assert all(isinstance(y, float) for y in graph.y_ticks) From d110b4bc5d42e5e169ce3b529fcc66f904ab2843 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 15:05:36 +0200 Subject: [PATCH 339/722] Simplify extracting scale --- template/startup_scripts/0002_data.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 646376e6..ceecdf33 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -128,21 +128,19 @@ def _extract_info(self, ax: Axes) -> None: self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] x_ticks = ax.get_xticks() + self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) self.x_scale = ax.get_xscale() # Check if the x-axis is a date scale if isinstance(ax.xaxis.converter, _SwitchableDateConverter): - self.x_scale = type(matplotlib.dates.num2date(x_ticks[0])).__name__ - - self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) + self.x_scale = "datetime" self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] y_ticks = ax.get_yticks() + self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, y_ticks) self.y_scale = ax.get_yscale() # Check if the y-axis is a date scale if isinstance(ax.yaxis.converter, _SwitchableDateConverter): - self.y_scale = type(matplotlib.dates.num2date(y_ticks[0]).__name__) - - self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, y_ticks) + self.y_scale = "datetime" @staticmethod def _extract_ticks_info(converter: Any, ticks: list) -> list: From 0b398fb6a6df469946a1bee1d957f0b01d1379ed Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 15:10:56 +0200 Subject: [PATCH 340/722] Add info about tests in debug --- python/tests/async/test_async_env_vars.py | 2 ++ python/tests/sync/test_env_vars.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 039fb48f..71bc2474 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -25,6 +25,7 @@ async def test_env_vars_override(debug: bool): ) assert result.text == "baz" + # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") assert result.text == "value" @@ -32,6 +33,7 @@ async def test_env_vars_override(debug: bool): result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") assert result.text == "value" + # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 183a1cb4..523477d3 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -23,6 +23,7 @@ async def test_env_vars_override(debug: bool): result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" + # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") assert result.text == "value" @@ -30,6 +31,7 @@ async def test_env_vars_override(debug: bool): result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") assert result.text == "value" + # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" From 4359cba57c85506a67cff3c7fdaa40263ebd838f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 15:27:36 +0200 Subject: [PATCH 341/722] Simplify ticks parsing --- python/e2b_code_interpreter/graphs.py | 6 +++--- template/startup_scripts/0002_data.py | 23 ++++++++++------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 7c71ce4e..91816375 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -40,7 +40,7 @@ def __init__(self, **kwargs): class PointData: label: str - points: List[Tuple[Union[str, int, float], Union[str, int, float]]] + points: List[Tuple[Union[str, float], Union[str, float]]] def __init__(self, **kwargs): self.label = kwargs["label"] @@ -48,11 +48,11 @@ def __init__(self, **kwargs): class PointGraph(Graph2D): - x_ticks: List[Union[str, int, float]] + x_ticks: List[Union[str, float]] x_tick_labels: List[str] x_scale: str - y_ticks: List[Union[str, int, float]] + y_ticks: List[Union[str, float]] y_tick_labels: List[str] y_scale: str diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index ceecdf33..47ac514f 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,7 +1,7 @@ from datetime import date import enum import re -from typing import Optional, List, Tuple, Literal, Any, Union +from typing import Optional, List, Tuple, Literal, Any, Union, Sequence import matplotlib import pandas @@ -90,13 +90,13 @@ def _change_orientation(self): class PointData(BaseModel): label: str - points: List[Tuple[Union[str, int, float], Union[str, int, float]]] + points: List[Tuple[Union[str, float], Union[str, float]]] @field_validator("points", mode="before") @classmethod def transform_points( cls, value - ) -> List[Tuple[Union[float, str], Union[float, str]]]: + ) -> List[Tuple[Union[str, float], Union[str, float]]]: parsed_value = [] for x, y in value: if isinstance(x, date): @@ -110,11 +110,11 @@ def transform_points( class PointGraph(Graph2D): - x_ticks: List[Union[str, int, float]] = Field(default_factory=list) + x_ticks: List[Union[str, float]] = Field(default_factory=list) x_tick_labels: List[str] = Field(default_factory=list) x_scale: str = Field(default="linear") - y_ticks: List[Union[str, int, float]] = Field(default_factory=list) + y_ticks: List[Union[str, float]] = Field(default_factory=list) y_tick_labels: List[str] = Field(default_factory=list) y_scale: str = Field(default="linear") @@ -143,19 +143,16 @@ def _extract_info(self, ax: Axes) -> None: self.y_scale = "datetime" @staticmethod - def _extract_ticks_info(converter: Any, ticks: list) -> list: - example_tick = ticks[0] - + def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: if isinstance(converter, _SwitchableDateConverter): return [matplotlib.dates.num2date(tick).isoformat() for tick in ticks] else: - ticks_type = type(example_tick).__name__ - if ticks_type == "float": + example_tick = ticks[0] + + if isinstance(example_tick, (int, float)): return [float(tick) for tick in ticks] - elif ticks_type == "int": - return [int(tick) for tick in ticks] else: - return ticks + return list(ticks) class LineGraph(PointGraph): From 1816995cd4d22f9eaa1566417d8bd4e335027b1a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 2 Oct 2024 16:03:50 +0200 Subject: [PATCH 342/722] Improve env vars tests --- js/tests/envVars.test.ts | 4 ++-- python/tests/async/test_async_env_vars.py | 4 ++-- python/tests/sync/test_env_vars.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index e20eb237..ce541906 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -29,7 +29,7 @@ sandboxTest('env vars on sandbox override', async () => { envs: { FOO: 'bar', SBX: 'value' }, }) await sandbox.notebook.execCell( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'runtime'" + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'js_runtime'" ) const result = await sandbox.notebook.execCell( "import os; os.getenv('FOO')", @@ -41,7 +41,7 @@ sandboxTest('env vars on sandbox override', async () => { const result2 = await sandbox.notebook.execCell( "import os; os.getenv('RUNTIME_ENV')" ) - expect(result2.results[0].text.trim()).toEqual('runtime') + expect(result2.results[0].text.trim()).toEqual('js_runtime') if (!isDebug) { const result3 = await sandbox.notebook.execCell( diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 71bc2474..a1d70ef5 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -18,7 +18,7 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): async def test_env_vars_override(debug: bool): sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) await sbx.notebook.exec_cell( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" ) result = await sbx.notebook.exec_cell( "import os; os.getenv('FOO')", envs={"FOO": "baz"} @@ -27,7 +27,7 @@ async def test_env_vars_override(debug: bool): # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") - assert result.text == "value" + assert result.text == "async_python_runtime" if not debug: result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 523477d3..107c989f 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -18,14 +18,14 @@ async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): async def test_env_vars_override(debug: bool): sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) sbx.notebook.exec_cell( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'value'" + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" ) result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" # This can fail if running in debug mode (there's a race condition with the restart kernel test) result = sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") - assert result.text == "value" + assert result.text == "python_runtime" if not debug: result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") From e139d646452ad97fcd77a4b6ca8a5621324a7e7e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 2 Oct 2024 14:07:18 +0000 Subject: [PATCH 343/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index b6ec5535..8e91fda0 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.61", + "version": "0.0.9-beta.62", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 81933a7d..f9e5d4c1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b36" +version = "0.0.11b37" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 91917347e71661d1da0966e69c0d2bcc38918551 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 3 Oct 2024 19:48:34 +0200 Subject: [PATCH 344/722] Parse numpy datetime --- template/startup_scripts/0002_data.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 47ac514f..03b06b29 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -4,6 +4,7 @@ from typing import Optional, List, Tuple, Literal, Any, Union, Sequence import matplotlib +import numpy import pandas from matplotlib.axes import Axes from matplotlib.collections import PathCollection @@ -101,9 +102,13 @@ def transform_points( for x, y in value: if isinstance(x, date): x = x.isoformat() + if isinstance(x, numpy.datetime64): + x = x.astype("datetime64[s]").astype(str) if isinstance(y, date): y = y.isoformat() + if isinstance(y, numpy.datetime64): + y = y.astype("datetime64[s]").astype(str) parsed_value.append((x, y)) return parsed_value From 13eaaccb6f9885d78db4252cfb9fda1e4fb0b06c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 3 Oct 2024 17:51:27 +0000 Subject: [PATCH 345/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 8e91fda0..829bdced 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.62", + "version": "0.0.9-beta.63", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index f9e5d4c1..66f1e0ff 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b37" +version = "0.0.11b38" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 5f6170ee21d902f0498f9a456846bb74a763290a Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 4 Oct 2024 16:57:22 -0700 Subject: [PATCH 346/722] Try parsing tick labels of point graph as dates --- template/startup_scripts/0002_data.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 03b06b29..26bbea9a 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,6 +1,7 @@ from datetime import date import enum import re +from dateutil import parser from typing import Optional, List, Tuple, Literal, Any, Union, Sequence import matplotlib @@ -131,7 +132,14 @@ def _extract_info(self, ax: Axes) -> None: """ super()._extract_info(ax) - self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + try: + self.x_tick_labels = [ + parser.parse(label.get_text()).isoformat() + for label in ax.get_xticklabels() + ] + except: + self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + x_ticks = ax.get_xticks() self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) self.x_scale = ax.get_xscale() From c1152f517b2fe98e10d64b8ba9f7c0986e03423e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 5 Oct 2024 00:00:31 +0000 Subject: [PATCH 347/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 829bdced..2abb35a5 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.63", + "version": "0.0.9-beta.64", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 66f1e0ff..72b7e25f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b38" +version = "0.0.11b39" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From c2bcb7ef4afaa12c8f1a6373a1595c7f92c11117 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 4 Oct 2024 18:06:11 -0700 Subject: [PATCH 348/722] Rollback change to x tick labels --- template/startup_scripts/0002_data.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 26bbea9a..3cbf061c 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -132,13 +132,7 @@ def _extract_info(self, ax: Axes) -> None: """ super()._extract_info(ax) - try: - self.x_tick_labels = [ - parser.parse(label.get_text()).isoformat() - for label in ax.get_xticklabels() - ] - except: - self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] x_ticks = ax.get_xticks() self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) From 775a2b356b1a37e415dd197799ec6b609d5ddfef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 5 Oct 2024 01:08:22 +0000 Subject: [PATCH 349/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 2abb35a5..26d3efa7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.64", + "version": "0.0.9-beta.65", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 72b7e25f..50a121e5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b39" +version = "0.0.11b40" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From f269e06d8ca2170d07d005ade9bca0fa21ed339b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 7 Oct 2024 18:52:24 +0200 Subject: [PATCH 350/722] Add categorical scale detection --- template/startup_scripts/0002_data.py | 38 ++++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 3cbf061c..4b8a77f2 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -136,18 +136,36 @@ def _extract_info(self, ax: Axes) -> None: x_ticks = ax.get_xticks() self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) - self.x_scale = ax.get_xscale() - # Check if the x-axis is a date scale - if isinstance(ax.xaxis.converter, _SwitchableDateConverter): - self.x_scale = "datetime" + self.x_scale = self._detect_scale( + ax.xaxis.converter, ax.get_xscale(), self.x_ticks, self.x_tick_labels + ) self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] - y_ticks = ax.get_yticks() - self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, y_ticks) - self.y_scale = ax.get_yscale() - # Check if the y-axis is a date scale - if isinstance(ax.yaxis.converter, _SwitchableDateConverter): - self.y_scale = "datetime" + self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, ax.get_yticks()) + self.y_scale = self._detect_scale( + ax.yaxis.converter, ax.get_yscale(), self.y_ticks, self.y_tick_labels + ) + + @staticmethod + def _detect_scale(converter, scale: str, ticks: Sequence, labels: Sequence) -> str: + # If the converter is a date converter, it's a datetime scale + if isinstance(converter, _SwitchableDateConverter): + return "datetime" + + # If the scale is not linear, it can't be categorical + if scale != "linear": + return scale + + # If all the ticks are integers and are in order from 0 to n-1 + # and the labels aren't corresponding to the ticks, it's categorical + for i, tick_and_label in enumerate(zip(ticks, labels)): + tick, label = tick_and_label + if isinstance(tick, (int, float)) and tick == i and str(i) != label: + continue + # Found a tick, which wouldn't be in a categorical scale + return "linear" + + return "categorical" @staticmethod def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: From c8eb680e8143e497fc7bd5241fbc35a97b40f48e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 7 Oct 2024 19:01:52 +0200 Subject: [PATCH 351/722] Add tests for scales --- js/tests/graphs/line.test.ts | 19 +++++------ js/tests/graphs/scales.test.ts | 52 +++++++++++++++++++++++++++++++ python/tests/graphs/test_scale.py | 52 +++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 js/tests/graphs/scales.test.ts create mode 100644 python/tests/graphs/test_scale.py diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts index 4ef1a589..adabdcad 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/graphs/line.test.ts @@ -33,6 +33,7 @@ plt.show() const graph = result.results[0].graph expect(graph).toBeDefined() + expect(graph.type).toBe('line') expect(graph.title).toBe('Plot of sin(x) and cos(x)') expect(graph.x_label).toBe('Time (s)') @@ -42,18 +43,18 @@ plt.show() expect(graph.y_unit).toBe('Hz') expect(graph.x_ticks.every((tick: number) => typeof tick === 'string')).toBe( - true + true, ) expect(new Date(graph.x_ticks[0])).toBeInstanceOf(Date) expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( - true + true, ) expect( - graph.y_tick_labels.every((label: string) => typeof label === 'string') + graph.y_tick_labels.every((label: string) => typeof label === 'string'), ).toBe(true) expect( - graph.x_tick_labels.every((label: string) => typeof label === 'string') + graph.x_tick_labels.every((label: string) => typeof label === 'string'), ).toBe(true) const lines = graph.elements @@ -66,11 +67,11 @@ plt.show() expect( firstLine.points.every( (point: [number, number]) => - typeof point[0] === 'string' && typeof point[1] === 'number' - ) + typeof point[0] === 'string' && typeof point[1] === 'number', + ), ).toBe(true) expect(new Date(firstLine.points[0][0])).toEqual( - new Date('2023-09-01T00:00:00.000Z') + new Date('2023-09-01T00:00:00.000Z'), ) expect(secondLine.label).toBe('cos(x)') @@ -78,7 +79,7 @@ plt.show() expect( secondLine.points.every( (point: [number, number]) => - typeof point[0] === 'string' && typeof point[1] === 'number' - ) + typeof point[0] === 'string' && typeof point[1] === 'number', + ), ).toBe(true) }) diff --git a/js/tests/graphs/scales.test.ts b/js/tests/graphs/scales.test.ts new file mode 100644 index 00000000..8599e34f --- /dev/null +++ b/js/tests/graphs/scales.test.ts @@ -0,0 +1,52 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' +sandboxTest('datetime scale', async ({ sandbox }) => { + const code = ` + import numpy as np + import matplotlib.pyplot as plt + import datetime + + # Generate x values + dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(10)] + y_sin = np.sin(np.linspace(0, 2*np.pi, 100)) + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(dates, y_sin, label='sin(x)') + plt.show() + ` + + const result = await sandbox.notebook.execCell(code) + + const graph = result.results[0].graph + expect(graph).toBeDefined() + expect(graph.type).toBe('line') + + expect(graph.x_scale).toBe('datetime') + expect(graph.y_scale).toBe('linear') +}) + +sandboxTest('categorical scale', async ({ sandbox }) => { + const code = ` + import numpy as np + import matplotlib.pyplot as plt + + x = [1, 2, 3, 4, 5] + y = ['A', 'B', 'C', 'D', 'E'] + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(x, y) + plt.show() + ` + + const result = await sandbox.notebook.execCell(code) + + const graph = result.results[0].graph + expect(graph).toBeTruthy() + + expect(graph.type).toBe('line') + expect(graph.x_scale).toBe('linear') + expect(graph.y_scale).toBe('categorical') +}) diff --git a/python/tests/graphs/test_scale.py b/python/tests/graphs/test_scale.py new file mode 100644 index 00000000..baf56cfa --- /dev/null +++ b/python/tests/graphs/test_scale.py @@ -0,0 +1,52 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.graphs import LineGraph + + +async def test_datetime_scale(async_sandbox: AsyncCodeInterpreter): + code = """ + import numpy as np + import matplotlib.pyplot as plt + import datetime + + # Generate x values + dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(10)] + y_sin = np.sin(np.linspace(0, 2*np.pi, 100)) + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(dates, y_sin, label='sin(x)') + plt.show() + """ + + result = await async_sandbox.notebook.exec_cell(code) + + graph = result.results[0].graph + assert graph + + assert isinstance(graph, LineGraph) + assert graph.x_scale == "datetime" + assert graph.y_scale == "linear" + + +async def test_categorical_scale(async_sandbox: AsyncCodeInterpreter): + code = """ + import numpy as np + import matplotlib.pyplot as plt + + x = [1, 2, 3, 4, 5] + y = ['A', 'B', 'C', 'D', 'E'] + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(x, y) + plt.show() + """ + + result = await async_sandbox.notebook.exec_cell(code) + + graph = result.results[0].graph + assert graph + + assert isinstance(graph, LineGraph) + assert graph.x_scale == "linear" + assert graph.y_scale == "categorical" From 741c7533ebf4eaf809a8e828954ddcb3dc896ea9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 7 Oct 2024 19:12:01 +0200 Subject: [PATCH 352/722] Add typing for scales --- js/src/graphs.ts | 16 ++++++++-- js/src/index.ts | 1 + python/e2b_code_interpreter/graphs.py | 45 ++++++++++++++++++++------- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/js/src/graphs.ts b/js/src/graphs.ts index 87cf7ce6..d096634c 100644 --- a/js/src/graphs.ts +++ b/js/src/graphs.ts @@ -8,6 +8,18 @@ export enum GraphType { UNKNOWN = 'unknown', } +export enum ScaleType { + LINEAR = "linear", + DATETIME = "datetime", + CATEGORICAL = "categorical", + LOG = "log", + SYMLOG = "symlog", + LOGIT = "logit", + FUNCTION = "function", + FUNCTIONLOG = "functionlog", + ASINH = "asinh", +} + export type Graph = { type: GraphType title: string @@ -28,10 +40,10 @@ export type PointData = { type PointGraph = Graph2D & { x_ticks: (number | string)[] - x_scale: string + x_scale: ScaleType x_tick_labels: string[] y_ticks: (number | string)[] - y_scale: string + y_scale: ScaleType y_tick_labels: string[] elements: PointData[] } diff --git a/js/src/index.ts b/js/src/index.ts index 9c74ab08..0ff1aca5 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -12,6 +12,7 @@ export type { OutputMessage, } from './messaging' export type { + ScaleType, GraphType, GraphTypes, Graph, diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 91816375..6de965f6 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -2,7 +2,7 @@ from typing import List, Tuple, Any, Optional, Union -class GraphType(enum.Enum): +class GraphType(str, enum.Enum): LINE = "line" SCATTER = "scatter" BAR = "bar" @@ -12,6 +12,19 @@ class GraphType(enum.Enum): UNKNOWN = "unknown" +class ScaleType(str, enum.Enum): + LINEAR = "linear" + DATETIME = "datetime" + CATEGORICAL = "categorical" + LOG = "log" + SYMLOG = "symlog" + LOGIT = "logit" + FUNCTION = "function" + FUNCTIONLOG = "functionlog" + ASINH = "asinh" + UNKNOWN = "unknown" + + class Graph: type: GraphType title: str @@ -50,23 +63,33 @@ def __init__(self, **kwargs): class PointGraph(Graph2D): x_ticks: List[Union[str, float]] x_tick_labels: List[str] - x_scale: str + x_scale: ScaleType y_ticks: List[Union[str, float]] y_tick_labels: List[str] - y_scale: str + y_scale: ScaleType elements: List[PointData] def __init__(self, **kwargs): super().__init__(**kwargs) self.x_label = kwargs["x_label"] - self.x_scale = kwargs["x_scale"] + + try: + self.x_scale = ScaleType(kwargs.get("x_scale")) + except ValueError: + self.x_scale = ScaleType.UNKNOWN + self.x_ticks = kwargs["x_ticks"] self.x_tick_labels = kwargs["x_tick_labels"] self.y_label = kwargs["y_label"] - self.y_scale = kwargs["y_scale"] + + try: + self.y_scale = ScaleType(kwargs.get("y_scale")) + except ValueError: + self.y_scale = ScaleType.UNKNOWN + self.y_ticks = kwargs["y_ticks"] self.y_tick_labels = kwargs["y_tick_labels"] @@ -171,17 +194,17 @@ def deserialize_graph(data: Optional[dict]) -> Optional[GraphTypes]: if not data: return None - if data["type"] == GraphType.LINE.value: + if data["type"] == GraphType.LINE: graph = LineGraph(**data) - elif data["type"] == GraphType.SCATTER.value: + elif data["type"] == GraphType.SCATTER: graph = ScatterGraph(**data) - elif data["type"] == GraphType.BAR.value: + elif data["type"] == GraphType.BAR: graph = BarGraph(**data) - elif data["type"] == GraphType.PIE.value: + elif data["type"] == GraphType.PIE: graph = PieGraph(**data) - elif data["type"] == GraphType.BOX_AND_WHISKER.value: + elif data["type"] == GraphType.BOX_AND_WHISKER: graph = BoxAndWhiskerGraph(**data) - elif data["type"] == GraphType.SUPERGRAPH.value: + elif data["type"] == GraphType.SUPERGRAPH: graph = SuperGraph(**data) else: graph = Graph(**data) From 84da653cdf6e6da3c204c1819f63503c2229cc76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 7 Oct 2024 17:27:43 +0000 Subject: [PATCH 353/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 26d3efa7..d0848cad 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.65", + "version": "0.0.9-beta.66", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 50a121e5..a191dbd2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b40" +version = "0.0.11b41" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 4263f4195b8fb5808099cddb5d5297639ea4243b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 8 Oct 2024 14:36:21 +0200 Subject: [PATCH 354/722] Add docstrings --- js/src/codeInterpreter.ts | 48 +++++++++++++++++ js/src/graphs.ts | 7 +++ js/tests/graphs/line.test.ts | 3 ++ .../code_interpreter_async.py | 53 ++++++++++++++++++- .../code_interpreter_sync.py | 52 ++++++++++++++++++ python/e2b_code_interpreter/graphs.py | 12 +++++ 6 files changed, 174 insertions(+), 1 deletion(-) diff --git a/js/src/codeInterpreter.ts b/js/src/codeInterpreter.ts index 38e6a278..ee3777d7 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/codeInterpreter.ts @@ -52,12 +52,30 @@ async function* readLines(stream: ReadableStream) { } } +/** + * Code interpreter module for executing code in a stateful context. + */ export class JupyterExtension { private static readonly execTimeoutMs = 300_000 private static readonly defaultKernelID = 'default' constructor(private readonly url: string, private readonly connectionConfig: ConnectionConfig) { } + /** + * Runs the code in the specified context, if not specified, the default context is used. + * You can reference previously defined variables, imports, and functions in the code. + * + * @param code The code to execute + * @param opts Options for executing the code + * @param opts.kernelID The context ID to run the code in + * @param opts.onStdout Callback for handling stdout messages + * @param opts.onStderr Callback for handling stderr messages + * @param opts.onResult Callback for handling the final result + * @param opts.envs Environment variables to set for the execution + * @param opts.timeoutMs Max time to wait for the execution to finish + * @param opts.requestTimeoutMs Max time to wait for the request to finish + * @returns Execution object + */ async execCell( code: string, opts?: { @@ -132,6 +150,14 @@ export class JupyterExtension { } } + /** + * Creates a new context to run code in. + * + * @param cwd The working directory for the context + * @param kernelName The name of the context + * @param requestTimeoutMs Max time to wait for the request to finish + * @returns The context ID + */ async createKernel({ cwd, kernelName, @@ -168,6 +194,13 @@ export class JupyterExtension { } } + /** + * Restarts the context. + * Restarting will clear all variables, imports, and other settings set during previous executions. + * + * @param kernelID The context ID to restart + * @param requestTimeoutMs Max time to wait for the request to finish + */ async restartKernel({ kernelID, requestTimeoutMs, @@ -195,6 +228,12 @@ export class JupyterExtension { } } + /** + * Shuts down the context. + * + * @param kernelID The context ID to shut down + * @param requestTimeoutMs Max time to wait for the request to finish + */ async shutdownKernel({ kernelID, requestTimeoutMs, @@ -221,6 +260,12 @@ export class JupyterExtension { } } + /** + * Lists all available contexts. + * + * @param requestTimeoutMs Max time to wait for the request to finish + * @returns List of context IDs and names + */ async listKernels({ requestTimeoutMs, }: { @@ -244,6 +289,9 @@ export class JupyterExtension { } } +/** + * Code interpreter module for executing code in a stateful context. + */ export class CodeInterpreter extends Sandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-beta' protected static readonly jupyterPort = 49999 diff --git a/js/src/graphs.ts b/js/src/graphs.ts index d096634c..4ce19eeb 100644 --- a/js/src/graphs.ts +++ b/js/src/graphs.ts @@ -1,3 +1,6 @@ +/** + * Graph types + */ export enum GraphType { LINE = 'line', SCATTER = 'scatter', @@ -8,6 +11,10 @@ export enum GraphType { UNKNOWN = 'unknown', } + +/** + * Ax scale types + */ export enum ScaleType { LINEAR = "linear", DATETIME = "datetime", diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts index adabdcad..e9ed1714 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/graphs/line.test.ts @@ -39,6 +39,9 @@ plt.show() expect(graph.x_label).toBe('Time (s)') expect(graph.y_label).toBe('Amplitude (Hz)') + expect(graph.x_scale).toBe('datetime') + expect(graph.y_scale).toBe('linear') + expect(graph.x_unit).toBe('s') expect(graph.y_unit).toBe('Hz') diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index de7985ec..0dd8d7cb 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -29,6 +29,10 @@ class JupyterExtension: + """ + Code interpreter module for executing code in a stateful context. + """ + _exec_timeout = 300 @property @@ -56,6 +60,20 @@ async def exec_cell( timeout: Optional[float] = None, request_timeout: Optional[float] = None, ) -> Execution: + """ + Runs the code in the specified context, if not specified, the default context is used. + You can reference previously defined variables, imports, and functions in the code. + + :param code: The code to execute + :param kernel_id: The context id + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param envs: Environment variables + :param timeout: Max time to wait for the execution to finish + :param request_timeout: Max time to wait for the request to finish + :return: Execution object + """ logger.debug(f"Executing code {code}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) @@ -98,9 +116,18 @@ async def create_kernel( self, cwd: Optional[str] = None, kernel_name: Optional[str] = None, - request_timeout: Optional[float] = None, envs: Optional[Dict[str, str]] = None, + request_timeout: Optional[float] = None, ) -> str: + """ + Creates a new context to run code in. + + :param cwd: Set the current working directory for the context + :param kernel_name: Type of the context + :param envs: Environment variables + :param request_timeout: Max time to wait for the request to finish + :return: Context id + """ logger.debug(f"Creating new kernel {kernel_name}") data = {} @@ -132,6 +159,12 @@ async def shutdown_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: + """ + Shuts down a context. + + :param kernel_id: Context id + :param request_timeout: Max time to wait for the request to finish + """ kernel_id = kernel_id or DEFAULT_KERNEL_ID logger.debug(f"Shutting down a kernel with id {kernel_id}") @@ -153,6 +186,13 @@ async def restart_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: + """ + Restarts the context. + Restarting will clear all variables, imports, and other settings set during previous executions. + + :param kernel_id: Context id + :param request_timeout: Max time to wait for the request to finish + """ kernel_id = kernel_id or DEFAULT_KERNEL_ID logger.debug(f"Restarting kernel {kernel_id}") @@ -173,6 +213,14 @@ async def list_kernels( self, request_timeout: Optional[float] = None, ) -> List[Kernel]: + """ + Lists all available contexts. + + :param request_timeout: Max time to wait for the request to finish + :return: List of Kernel objects + """ + logger.debug("Listing kernels") + try: response = await self._client.get( f"{self._url}/contexts", @@ -194,6 +242,9 @@ class AsyncCodeInterpreter(AsyncSandbox): @property def notebook(self) -> JupyterExtension: + """ + Code interpreter module for executing code in a stateful context. + """ return self._notebook def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 2631944b..2db73066 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -28,6 +28,10 @@ class JupyterExtension: + """ + Code interpreter module for executing code in a stateful context. + """ + _exec_timeout = 300 @property @@ -55,6 +59,20 @@ def exec_cell( timeout: Optional[float] = None, request_timeout: Optional[float] = None, ) -> Execution: + """ + Runs the code in the specified context, if not specified, the default context is used. + You can reference previously defined variables, imports, and functions in the code. + + :param code: The code to execute + :param kernel_id: The context id + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param envs: Environment variables + :param timeout: Max time to wait for the execution to finish + :param request_timeout: Max time to wait for the request to finish + :return: Execution object + """ logger.debug(f"Executing code {code}") timeout = None if timeout == 0 else (timeout or self._exec_timeout) @@ -96,8 +114,18 @@ def create_kernel( self, cwd: Optional[str] = None, kernel_name: Optional[str] = None, + envs: Optional[Dict[str, str]] = None, request_timeout: Optional[float] = None, ) -> str: + """ + Creates a new context to run code in. + + :param cwd: Set the current working directory for the context + :param kernel_name: Type of the context + :param envs: Environment variables + :param request_timeout: Max time to wait for the request to finish + :return: Context id + """ logger.debug(f"Creating new kernel {kernel_name}") data = {} @@ -105,6 +133,8 @@ def create_kernel( data["name"] = kernel_name if cwd: data["cwd"] = cwd + if envs: + data["env_vars"] = envs try: response = self._client.post( @@ -127,6 +157,12 @@ def shutdown_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: + """ + Shuts down a context. + + :param kernel_id: Context id to shut down + :param request_timeout: Max time to wait for the request to finish + """ kernel_id = kernel_id or DEFAULT_KERNEL_ID logger.debug(f"Shutting down a kernel with id {kernel_id}") @@ -147,6 +183,13 @@ def restart_kernel( kernel_id: Optional[str] = None, request_timeout: Optional[float] = None, ) -> None: + """ + Restarts the context. + Restarting will clear all variables, imports, and other settings set during previous executions. + + :param kernel_id: Context id + :param request_timeout: Max time to wait for the request to finish + """ kernel_id = kernel_id or DEFAULT_KERNEL_ID logger.debug(f"Restarting kernel {kernel_id}") @@ -167,6 +210,12 @@ def list_kernels( self, request_timeout: Optional[float] = None, ) -> List[Kernel]: + """ + Lists all available contexts. + + :param request_timeout: Max time to wait for the request to finish + :return: List of Kernel objects + """ logger.debug("Listing kernels") try: @@ -190,6 +239,9 @@ class CodeInterpreter(Sandbox): @property def notebook(self) -> JupyterExtension: + """ + Code interpreter module for executing code in a stateful context. + """ return self._notebook def __init__( diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/graphs.py index 6de965f6..9229087b 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/graphs.py @@ -3,6 +3,10 @@ class GraphType(str, enum.Enum): + """ + Graph types + """ + LINE = "line" SCATTER = "scatter" BAR = "bar" @@ -13,6 +17,10 @@ class GraphType(str, enum.Enum): class ScaleType(str, enum.Enum): + """ + Ax scale types + """ + LINEAR = "linear" DATETIME = "datetime" CATEGORICAL = "categorical" @@ -26,6 +34,10 @@ class ScaleType(str, enum.Enum): class Graph: + """ + Extracted data from a graph. It's useful for building an interactive graphs or custom visualizations. + """ + type: GraphType title: str From 77efab2f2cd6cfb261773918bcb61621ce27bc01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 8 Oct 2024 12:38:55 +0000 Subject: [PATCH 355/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index d0848cad..16e0e7ca 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.66", + "version": "0.0.9-beta.67", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index a191dbd2..50c3781d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b41" +version = "0.0.11b42" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 7014328209b40dc6ea0c472e9024aa5666b8a59d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sat, 12 Oct 2024 07:38:45 +0200 Subject: [PATCH 356/722] Filter out grid lines --- js/package.json | 2 +- python/pyproject.toml | 2 +- template/startup_scripts/0002_data.py | 34 ++++++++++++++------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/js/package.json b/js/package.json index 16e0e7ca..920794d7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.67", + "version": "0.0.9-beta.68", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 50c3781d..4fe59ef8 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b42" +version = "0.0.11b43" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 4b8a77f2..a0879649 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,7 +1,6 @@ from datetime import date import enum import re -from dateutil import parser from typing import Optional, List, Tuple, Literal, Any, Union, Sequence import matplotlib @@ -21,6 +20,21 @@ from traitlets.traitlets import Unicode, ObjectName +def _is_grid_line(line: Line2D) -> bool: + x_data = line.get_xdata() + if len(x_data) != 2: + return False + + y_data = line.get_ydata() + if len(y_data) != 2: + return False + + if x_data[0] == x_data[1] or y_data[0] == y_data[1]: + return True + + return False + + class GraphType(str, enum.Enum): LINE = "line" SCATTER = "scatter" @@ -187,6 +201,8 @@ def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) for line in ax.get_lines(): + if _is_grid_line(line): + continue label = line.get_label() if label.startswith("_child"): number = int(label[6:]) @@ -377,23 +393,9 @@ def _get_type_of_graph(ax: Axes) -> GraphType: if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): return GraphType.BOX_AND_WHISKER - def is_grid_line(line: Line2D) -> bool: - x_data = line.get_xdata() - if len(x_data) != 2: - return False - - y_data = line.get_ydata() - if len(y_data) != 2: - return False - - if x_data[0] == x_data[1] or y_data[0] == y_data[1]: - return True - - return False - filtered = [] for obj in objects: - if isinstance(obj, Line2D) and is_grid_line(obj): + if isinstance(obj, Line2D) and _is_grid_line(obj): continue filtered.append(obj) From 42f1b215ccb30e5e49e2682e597c7b38f91be3fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 12 Oct 2024 05:41:12 +0000 Subject: [PATCH 357/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 920794d7..c2f35fd4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.68", + "version": "0.0.9-beta.69", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 4fe59ef8..ff2791a3 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b43" +version = "0.0.11b44" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 12cfeb8bcbd0c43294d4aee59c56726a1bbd0815 Mon Sep 17 00:00:00 2001 From: Tereza Tizkova Date: Sat, 12 Oct 2024 20:01:43 -0700 Subject: [PATCH 358/722] Update readme --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 848edea4..77b76f2b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ +## 🚨 Code Interpreter SDK merged into E2B SDK. + +The Code Interpreter SDK repository has been consolidated into the "core" [E2B SDK repository](https://github.com/e2b-dev/E2B). + +### What this means for you + +- **All Capabilities Preserved**: The E2B SDK includes all functionalities previously available in the Code Interpreter SDK. +- **Single Source**: You can now find all relevant code and functionalities in one repository and in one place in the docs. +- **How to switch to the merged SDK version**: TBD + + + \ No newline at end of file From b161bbfbbddfc80e44435c07eeeb2b44d66b4d9d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Oct 2024 03:03:53 +0000 Subject: [PATCH 359/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index c2f35fd4..bbe86d91 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.69", + "version": "0.0.9-beta.70", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index ff2791a3..5ec68a9b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b44" +version = "0.0.11b45" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From e8f52d1c849977e2bf328c905290ec54cdcdbaf2 Mon Sep 17 00:00:00 2001 From: Tereza Tizkova Date: Mon, 14 Oct 2024 14:03:30 -0700 Subject: [PATCH 360/722] Update readme --- README.md | 145 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 77b76f2b..671832ba 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,107 @@ -## 🚨 Code Interpreter SDK merged into E2B SDK. +

+ e2b logo +

-The Code Interpreter SDK repository has been consolidated into the "core" [E2B SDK repository](https://github.com/e2b-dev/E2B). +

+ Code Interpreter SDK +

-### What this means for you - -- **All Capabilities Preserved**: The E2B SDK includes all functionalities previously available in the Code Interpreter SDK. -- **Single Source**: You can now find all relevant code and functionalities in one repository and in one place in the docs. -- **How to switch to the merged SDK version**: TBD + +The Code Interpreter SDK is made to control the E2B Sandboxes - secure cloud environments for running LLM-generated code. The SDK lets you give your AI app a custom code interpreter. + +- ✔️ Works with any LLM and AI framework (see [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) for examples) +- ✔️ Supports streaming content like charts and stdout, stderr +- ✔️ Python & JS SDK +- ✔️ Runs on serverless and edge functions +- ✔️ Runs AI-generated code in secure sandboxed environments +- ✔️ 100% open source (including [infrastructure](https://github.com/e2b-dev/infra)) + + +##### 💻 Supported language runtimes +- ✔️ Python +- [(Beta)](https://e2b.dev/docs/guide/beta-code-interpreter-language-runtimes) JavaScript, R, Java -Follow E2B on [X (Twitter)](https://twitter.com/e2b_dev). +

+ + Last 1 month downloads for the Python SDK + + + Last 1 month downloads for the Python SDK + +

-## 💻 Supported language runtimes -- ✅ Python -- [(Beta)](https://e2b.dev/docs/guide/beta-code-interpreter-language-runtimes) JavaScript, R, Java +--- +### What is E2B? -## 📖 Documentation -- [e2b.dev/docs/code-interpreter](https://e2b.dev/docs/code-interpreter/installation) +[E2B](https://www.e2b.dev/) is an open-source runtime for running AI-generated code in secure cloud Sandboxes. It's tailor-made for agentic & AI use cases. -## 🚀 Quickstart + -### 1. Install SDK -JavaScript/TypeScript -``` -npm i @e2b/code-interpreter -``` +
+ + +linkedin + +discord + +linkedin +
-Python -``` -pip install e2b_code_interpreter -``` -### 2. Execute code with code interpreter inside sandbox +### E2B Sandbox +E2B Sandbox is a secure cloud environment that allows AI agents and apps. You can run multiple instances of Sandboxes, and have long-running sessions. Inside the Sandboxes, LLMs can use the same tools as humans do, e.g.: -**JavaScript** -```ts -import { CodeInterpreter } from '@e2b/code-interpreter' +- Running LLM generated code +- Cloud browsers +- GitHub repositories and CLIs +- Coding tools like linters, autocomplete, "go-to defintion" +- Audio & video editing -const sandbox = await CodeInterpreter.create() -await sandbox.notebook.execCell('x = 1') -const execution = await sandbox.notebook.execCell('x+=1; x') -console.log(execution.text) // outputs 2 +## Getting Started & Documentation -await sandbox.close() -``` +> Please visit [documentation](https://e2b.dev/docs) to get started. -**Python** -```py -from e2b_code_interpreter import CodeInterpreter +To create and control a sandbox, you use our SDK: -with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell("x = 1") +### Install SDK - execution = sandbox.notebook.exec_cell("x+=1; x") - print(execution.text) # outputs 2 +```bash +pip install e2b ``` -### 3. Hello World guide -Dive depeer and check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to connect code interpreter LLMs. +### Start sandbox -## 📖 Cookbook examples - -**Hello World** -- [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) -- [Python](https://e2b.dev/docs/hello-world/py) +```py +from e2b import Sandbox -**LLM Providers** -- 🪸 [Claude with code intepreter](https://github.com/e2b-dev/e2b-cookbook/blob/main/examples/claude-code-interpreter-python/claude_code_interpreter.ipynb) -- 🦙 [Llama 3 with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/llama-3-code-interpreter-python) -- [Mixtral with code interpreter and chat UI](https://github.com/e2b-dev/e2b-cookbook/tree/main/templates/mixtral-8x7b-code-interpreter-nextjs) +# Create sandbox +sandbox = Sandbox() -**AI Frameworks** -- 🦜⛓️ [LangChain with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/langchain-python) -- 🦜🕸️ [LangGraph with code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/langgraph-python) -- [Autogen with secure sandboxed code interpreter](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/e2b_autogen) +# Let an LLM use the sandbox here +# Visit https://e2b.dev/docs/sandbox/overview to learn more about sandboxes. ----> \ No newline at end of file +# Close sandbox once done +sandbox.close() +``` From 92ce0268d6c47b6a9ede5c7f785fa022c6c88b42 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 14:16:46 -0700 Subject: [PATCH 361/722] Rename CodeInterpreter to Sandbox --- js/src/index.ts | 6 +++--- js/src/{codeInterpreter.ts => sandbox.ts} | 6 +++--- js/tests/benchmarking.js | 4 ++-- js/tests/envVars.test.ts | 6 +++--- js/tests/reconnect.test.ts | 4 ++-- js/tests/runtimes/bun/run.test.ts | 4 ++-- js/tests/runtimes/deno/run.test.ts | 4 ++-- js/tests/setup.ts | 6 +++--- python/e2b_code_interpreter/__init__.py | 4 ++-- .../e2b_code_interpreter/code_interpreter_async.py | 4 ++-- python/e2b_code_interpreter/code_interpreter_sync.py | 4 ++-- python/tests/async/test_async_bash.py | 4 ++-- python/tests/async/test_async_basic.py | 4 ++-- python/tests/async/test_async_custom_repr_object.py | 4 ++-- python/tests/async/test_async_data.py | 4 ++-- python/tests/async/test_async_display_data.py | 4 ++-- python/tests/async/test_async_env_vars.py | 8 ++++---- python/tests/async/test_async_execution_count.py | 4 ++-- python/tests/async/test_async_kernels.py | 12 ++++++------ python/tests/async/test_async_reconnect.py | 6 +++--- python/tests/async/test_async_statefulness.py | 4 ++-- python/tests/async/test_async_streaming.py | 8 ++++---- python/tests/benchmarking.py | 4 ++-- python/tests/conftest.py | 8 ++++---- python/tests/graphs/test_bar.py | 4 ++-- python/tests/graphs/test_box_and_whiskers.py | 4 ++-- python/tests/graphs/test_line.py | 4 ++-- python/tests/graphs/test_log_graph.py | 4 ++-- python/tests/graphs/test_pie.py | 4 ++-- python/tests/graphs/test_scale.py | 6 +++--- python/tests/graphs/test_scatter.py | 4 ++-- python/tests/graphs/test_supergraph.py | 4 ++-- python/tests/graphs/test_unknown.py | 4 ++-- python/tests/sync/test_bash.py | 4 ++-- python/tests/sync/test_basic.py | 4 ++-- python/tests/sync/test_custom_repr_object.py | 4 ++-- python/tests/sync/test_data.py | 4 ++-- python/tests/sync/test_display_data.py | 4 ++-- python/tests/sync/test_env_vars.py | 8 ++++---- python/tests/sync/test_execution_count.py | 4 ++-- python/tests/sync/test_kernels.py | 12 ++++++------ python/tests/sync/test_reconnect.py | 6 +++--- python/tests/sync/test_statefulness.py | 4 ++-- python/tests/sync/test_streaming.py | 8 ++++---- 44 files changed, 113 insertions(+), 113 deletions(-) rename js/src/{codeInterpreter.ts => sandbox.ts} (98%) diff --git a/js/src/index.ts b/js/src/index.ts index 0ff1aca5..7ac8bd62 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,6 +1,6 @@ export * from 'e2b' -export { CodeInterpreter, JupyterExtension } from './codeInterpreter' +export { Sandbox, JupyterExtension } from './sandbox' export type { Logs, @@ -27,6 +27,6 @@ export type { SuperGraph, PointData, } from './graphs' -import { CodeInterpreter } from './codeInterpreter' +import { Sandbox } from './sandbox' -export default CodeInterpreter +export default Sandbox diff --git a/js/src/codeInterpreter.ts b/js/src/sandbox.ts similarity index 98% rename from js/src/codeInterpreter.ts rename to js/src/sandbox.ts index ee3777d7..2c4bcd7f 100644 --- a/js/src/codeInterpreter.ts +++ b/js/src/sandbox.ts @@ -1,4 +1,4 @@ -import { ConnectionConfig, Sandbox, TimeoutError } from 'e2b' +import { ConnectionConfig, Sandbox as BaseSandbox, TimeoutError } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' @@ -292,12 +292,12 @@ export class JupyterExtension { /** * Code interpreter module for executing code in a stateful context. */ -export class CodeInterpreter extends Sandbox { +export class Sandbox extends BaseSandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-beta' protected static readonly jupyterPort = 49999 readonly notebook = new JupyterExtension( - `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(CodeInterpreter.jupyterPort)}`, + `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(Sandbox.jupyterPort)}`, this.connectionConfig, ) } diff --git a/js/tests/benchmarking.js b/js/tests/benchmarking.js index 703656b0..e94792a9 100644 --- a/js/tests/benchmarking.js +++ b/js/tests/benchmarking.js @@ -1,4 +1,4 @@ -const { CodeInterpreter } = require('../dist') +const { Sandbox } = require('../dist') const dotenv = require('dotenv') dotenv.config() @@ -11,7 +11,7 @@ async function main() { for (let i = 0; i < iterations; i++) { console.log('Iteration:', i + 1) let startTime = new Date() - const sandbox = await CodeInterpreter.create() + const sandbox = await Sandbox.create() createSandboxTime += new Date() - startTime startTime = new Date() diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index ce541906..73e3c9e3 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -1,11 +1,11 @@ import { expect } from 'vitest' import { isDebug, sandboxTest } from './setup' -import { CodeInterpreter } from '../src' +import { Sandbox } from '../src' // Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. sandboxTest.skipIf(isDebug)('env vars', async () => { - const sandbox = await CodeInterpreter.create({ + const sandbox = await Sandbox.create({ envs: { TEST_ENV_VAR: 'supertest' }, }) const result = await sandbox.notebook.execCell( @@ -25,7 +25,7 @@ sandboxTest('env vars on sandbox', async ({ sandbox }) => { }) sandboxTest('env vars on sandbox override', async () => { - const sandbox = await CodeInterpreter.create({ + const sandbox = await Sandbox.create({ envs: { FOO: 'bar', SBX: 'value' }, }) await sandbox.notebook.execCell( diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index bd0e07dd..0f97e450 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -1,10 +1,10 @@ import { expect } from 'vitest' -import { CodeInterpreter } from '../src' +import { Sandbox } from '../src' import { sandboxTest } from './setup' sandboxTest('reconnect', async ({ sandbox }) => { - sandbox = await CodeInterpreter.connect(sandbox.sandboxId) + sandbox = await Sandbox.connect(sandbox.sandboxId) const result = await sandbox.notebook.execCell('x =1; x') diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts index ce76dff0..2b00c005 100644 --- a/js/tests/runtimes/bun/run.test.ts +++ b/js/tests/runtimes/bun/run.test.ts @@ -1,9 +1,9 @@ import { expect, test } from 'bun:test' -import { CodeInterpreter } from '../../../src' +import { Sandbox } from '../../../src' test('Bun test', async () => { - const sbx = await CodeInterpreter.create({ timeoutMs: 5_000 }) + const sbx = await Sandbox.create({ timeoutMs: 5_000 }) try { const result = await sbx.notebook.execCell('print("Hello, World!")') expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index c221b803..19601f57 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -3,10 +3,10 @@ import { load } from 'https://deno.land/std@0.224.0/dotenv/mod.ts' await load({ envPath: '.env', export: true }) -import { CodeInterpreter } from '../../../dist/index.mjs' +import { Sandbox } from '../../../dist/index.mjs' Deno.test('Deno test', async () => { - const sbx = await CodeInterpreter.create({ timeoutMs: 5_000 }) + const sbx = await Sandbox.create({ timeoutMs: 5_000 }) try { const result = await sbx.notebook.execCell('print("Hello, World!")') assertEquals(result.logs.stdout.join(''), 'Hello, World!\n') diff --git a/js/tests/setup.ts b/js/tests/setup.ts index 51359af1..b4466365 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -1,16 +1,16 @@ -import { CodeInterpreter } from '../src' +import { Sandbox } from '../src' import { test as base } from 'vitest' const timeoutMs = 60_000 interface SandboxFixture { - sandbox: CodeInterpreter + sandbox: Sandbox } export const sandboxTest = base.extend({ sandbox: [ async ({}, use) => { - const sandbox = await CodeInterpreter.create({ timeoutMs }) + const sandbox = await Sandbox.create({ timeoutMs }) try { await use(sandbox) } finally { diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index c7ab0875..b83170d6 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -1,6 +1,6 @@ from e2b import * -from .code_interpreter_sync import CodeInterpreter -from .code_interpreter_async import AsyncCodeInterpreter +from .code_interpreter_sync import Sandbox +from .code_interpreter_async import AsyncSandbox from .models import ( Execution, ExecutionError, diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 0dd8d7cb..c2b90eec 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -4,7 +4,7 @@ from typing import Optional, List, Dict from httpx import AsyncHTTPTransport, AsyncClient -from e2b import AsyncSandbox, ConnectionConfig +from e2b import AsyncSandbox as BaseAsyncSandbox, ConnectionConfig from e2b_code_interpreter.constants import ( DEFAULT_KERNEL_ID, @@ -236,7 +236,7 @@ async def list_kernels( raise format_request_timeout_error() -class AsyncCodeInterpreter(AsyncSandbox): +class AsyncSandbox(BaseAsyncSandbox): default_template = DEFAULT_TEMPLATE _jupyter_port = JUPYTER_PORT diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 2db73066..9f4a79e9 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -3,7 +3,7 @@ from typing import Optional, Dict, List from httpx import HTTPTransport, Client -from e2b import Sandbox, ConnectionConfig +from e2b import Sandbox as BaseSandbox, ConnectionConfig from e2b_code_interpreter.constants import ( DEFAULT_KERNEL_ID, @@ -233,7 +233,7 @@ def list_kernels( raise format_request_timeout_error() -class CodeInterpreter(Sandbox): +class Sandbox(BaseSandbox): default_template = DEFAULT_TEMPLATE _jupyter_port = JUPYTER_PORT diff --git a/python/tests/async/test_async_bash.py b/python/tests/async/test_async_bash.py index 871e9fb8..bcfdb207 100644 --- a/python/tests/async/test_async_bash.py +++ b/python/tests/async/test_async_bash.py @@ -1,6 +1,6 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_bash(async_sandbox: AsyncCodeInterpreter): +async def test_bash(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/async/test_async_basic.py b/python/tests/async/test_async_basic.py index 946b8463..84ffd29a 100644 --- a/python/tests/async/test_async_basic.py +++ b/python/tests/async/test_async_basic.py @@ -1,6 +1,6 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_basic(async_sandbox: AsyncCodeInterpreter): +async def test_basic(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_async_custom_repr_object.py b/python/tests/async/test_async_custom_repr_object.py index c4b7f9a9..c8deb21a 100644 --- a/python/tests/async/test_async_custom_repr_object.py +++ b/python/tests/async/test_async_custom_repr_object.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox code = """ from IPython.display import display @@ -7,6 +7,6 @@ """ -async def test_bash(async_sandbox: AsyncCodeInterpreter): +async def test_bash(async_sandbox: AsyncSandbox): execution = await async_sandbox.notebook.exec_cell(code) assert execution.results[0].formats() == ["latex"] diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py index 25a09fc0..d0bd1a4c 100644 --- a/python/tests/async/test_async_data.py +++ b/python/tests/async/test_async_data.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_data(async_sandbox: AsyncCodeInterpreter): +async def test_data(async_sandbox: AsyncSandbox): # plot random graph result = await async_sandbox.notebook.exec_cell( """ diff --git a/python/tests/async/test_async_display_data.py b/python/tests/async/test_async_display_data.py index 976f552e..a714a4cc 100644 --- a/python/tests/async/test_async_display_data.py +++ b/python/tests/async/test_async_display_data.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_display_data(async_sandbox: AsyncCodeInterpreter): +async def test_display_data(async_sandbox: AsyncSandbox): # plot random graph result = await async_sandbox.notebook.exec_cell( """ diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index a1d70ef5..cf54661c 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -1,14 +1,14 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox async def test_env_vars_sandbox(): - sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar"}) + sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" await sbx.kill() -async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): +async def test_env_vars_in_exec_cell(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell( "import os; os.getenv('FOO')", envs={"FOO": "bar"} ) @@ -16,7 +16,7 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncCodeInterpreter): async def test_env_vars_override(debug: bool): - sbx = await AsyncCodeInterpreter.create(envs={"FOO": "bar", "SBX": "value"}) + sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) await sbx.notebook.exec_cell( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" ) diff --git a/python/tests/async/test_async_execution_count.py b/python/tests/async/test_async_execution_count.py index 6192fa76..e163750d 100644 --- a/python/tests/async/test_async_execution_count.py +++ b/python/tests/async/test_async_execution_count.py @@ -1,10 +1,10 @@ import pytest -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox @pytest.mark.skip_debug() -async def test_execution_count(async_sandbox: AsyncCodeInterpreter): +async def test_execution_count(async_sandbox: AsyncSandbox): await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = await async_sandbox.notebook.exec_cell("!pwd") assert result.execution_count == 2 diff --git a/python/tests/async/test_async_kernels.py b/python/tests/async/test_async_kernels.py index 6d97ccee..f5d6b33b 100644 --- a/python/tests/async/test_async_kernels.py +++ b/python/tests/async/test_async_kernels.py @@ -1,13 +1,13 @@ import pytest -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_create_new_kernel(async_sandbox: AsyncCodeInterpreter): +async def test_create_new_kernel(async_sandbox: AsyncSandbox): await async_sandbox.notebook.create_kernel() -async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): +async def test_independence_of_kernels(async_sandbox: AsyncSandbox): kernel_id = await async_sandbox.notebook.create_kernel() await async_sandbox.notebook.exec_cell("x = 1") @@ -17,7 +17,7 @@ async def test_independence_of_kernels(async_sandbox: AsyncCodeInterpreter): @pytest.mark.skip_debug() -async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): +async def test_restart_kernel(async_sandbox: AsyncSandbox): await async_sandbox.notebook.exec_cell("x = 1") await async_sandbox.notebook.restart_kernel() @@ -27,7 +27,7 @@ async def test_restart_kernel(async_sandbox: AsyncCodeInterpreter): @pytest.mark.skip_debug() -async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): +async def test_list_kernels(async_sandbox: AsyncSandbox): kernels = await async_sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -38,7 +38,7 @@ async def test_list_kernels(async_sandbox: AsyncCodeInterpreter): @pytest.mark.skip_debug() -async def test_shutdown(async_sandbox: AsyncCodeInterpreter): +async def test_shutdown(async_sandbox: AsyncSandbox): kernel_id = await async_sandbox.notebook.create_kernel() kernels = await async_sandbox.notebook.list_kernels() assert kernel_id in [kernel.kernel_id for kernel in kernels] diff --git a/python/tests/async/test_async_reconnect.py b/python/tests/async/test_async_reconnect.py index acccd0b8..0b91febf 100644 --- a/python/tests/async/test_async_reconnect.py +++ b/python/tests/async/test_async_reconnect.py @@ -1,9 +1,9 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_reconnect(async_sandbox: AsyncCodeInterpreter): +async def test_reconnect(async_sandbox: AsyncSandbox): sandbox_id = async_sandbox.sandbox_id - sandbox2 = await AsyncCodeInterpreter.connect(sandbox_id) + sandbox2 = await AsyncSandbox.connect(sandbox_id) result = await sandbox2.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_async_statefulness.py b/python/tests/async/test_async_statefulness.py index 7ec98cb7..be9612aa 100644 --- a/python/tests/async/test_async_statefulness.py +++ b/python/tests/async/test_async_statefulness.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_stateful(async_sandbox: AsyncCodeInterpreter): +async def test_stateful(async_sandbox: AsyncSandbox): await async_sandbox.notebook.exec_cell("async_test_stateful = 1") result = await async_sandbox.notebook.exec_cell( diff --git a/python/tests/async/test_async_streaming.py b/python/tests/async/test_async_streaming.py index 439b282b..148045de 100644 --- a/python/tests/async/test_async_streaming.py +++ b/python/tests/async/test_async_streaming.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_streaming_output(async_sandbox: AsyncCodeInterpreter): +async def test_streaming_output(async_sandbox: AsyncSandbox): out = [] def test(line) -> None: @@ -14,7 +14,7 @@ def test(line) -> None: assert out[0].line == "1\n" -async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): +async def test_streaming_error(async_sandbox: AsyncSandbox): out = [] await async_sandbox.notebook.exec_cell( @@ -25,7 +25,7 @@ async def test_streaming_error(async_sandbox: AsyncCodeInterpreter): assert out[0].line == "1\n" -async def test_streaming_result(async_sandbox: AsyncCodeInterpreter): +async def test_streaming_result(async_sandbox: AsyncSandbox): code = """ import matplotlib.pyplot as plt import numpy as np diff --git a/python/tests/benchmarking.py b/python/tests/benchmarking.py index 3bb65eec..39496deb 100644 --- a/python/tests/benchmarking.py +++ b/python/tests/benchmarking.py @@ -2,7 +2,7 @@ from dotenv import load_dotenv -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox load_dotenv() @@ -14,7 +14,7 @@ for i in range(iterations): print("Iteration:", i + 1) start_time = time.time() - sandbox = CodeInterpreter() + sandbox = Sandbox() create_sandbox_time += time.time() - start_time start_time = time.time() diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 66cea34b..efb6c1d7 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -4,15 +4,15 @@ from logging import warning -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox +from e2b_code_interpreter.code_interpreter_sync import Sandbox timeout = 60 @pytest.fixture() def sandbox(debug): - sandbox = CodeInterpreter(timeout=timeout) + sandbox = Sandbox(timeout=timeout) try: yield sandbox @@ -28,7 +28,7 @@ def sandbox(debug): @pytest_asyncio.fixture async def async_sandbox(debug): - sandbox = await AsyncCodeInterpreter.create(timeout=timeout) + sandbox = await AsyncSandbox.create(timeout=timeout) try: yield sandbox diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 55970993..486c582b 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import GraphType, BarGraph code = """ @@ -21,7 +21,7 @@ """ -async def test_graph_bar(async_sandbox: AsyncCodeInterpreter): +async def test_graph_bar(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/graphs/test_box_and_whiskers.py index e10e3b5b..17073341 100644 --- a/python/tests/graphs/test_box_and_whiskers.py +++ b/python/tests/graphs/test_box_and_whiskers.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import BoxAndWhiskerGraph, GraphType code = """ @@ -35,7 +35,7 @@ """ -async def test_box_and_whiskers(async_sandbox: AsyncCodeInterpreter): +async def test_box_and_whiskers(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 825a230e..7e40ab46 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -1,6 +1,6 @@ import datetime -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import LineGraph code = """ @@ -31,7 +31,7 @@ """ -async def test_line_graph(async_sandbox: AsyncCodeInterpreter): +async def test_line_graph(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_log_graph.py b/python/tests/graphs/test_log_graph.py index c89b57a6..900be0f3 100644 --- a/python/tests/graphs/test_log_graph.py +++ b/python/tests/graphs/test_log_graph.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import LineGraph # Log graph @@ -29,7 +29,7 @@ """ -async def test_log_graph(async_sandbox: AsyncCodeInterpreter): +async def test_log_graph(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py index d26dd245..d3510c29 100644 --- a/python/tests/graphs/test_pie.py +++ b/python/tests/graphs/test_pie.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import PieGraph code = """ @@ -27,7 +27,7 @@ """ -async def test_pie_graph(async_sandbox: AsyncCodeInterpreter): +async def test_pie_graph(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_scale.py b/python/tests/graphs/test_scale.py index baf56cfa..98d3914f 100644 --- a/python/tests/graphs/test_scale.py +++ b/python/tests/graphs/test_scale.py @@ -1,8 +1,8 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import LineGraph -async def test_datetime_scale(async_sandbox: AsyncCodeInterpreter): +async def test_datetime_scale(async_sandbox: AsyncSandbox): code = """ import numpy as np import matplotlib.pyplot as plt @@ -28,7 +28,7 @@ async def test_datetime_scale(async_sandbox: AsyncCodeInterpreter): assert graph.y_scale == "linear" -async def test_categorical_scale(async_sandbox: AsyncCodeInterpreter): +async def test_categorical_scale(async_sandbox: AsyncSandbox): code = """ import numpy as np import matplotlib.pyplot as plt diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index a8c70353..2845e6eb 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import ScatterGraph code = """ @@ -22,7 +22,7 @@ """ -async def test_scatter_graph(async_sandbox: AsyncCodeInterpreter): +async def test_scatter_graph(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/graphs/test_supergraph.py b/python/tests/graphs/test_supergraph.py index 5cd8d5b6..c2f1fc9a 100644 --- a/python/tests/graphs/test_supergraph.py +++ b/python/tests/graphs/test_supergraph.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import GraphType, SuperGraph, LineGraph, ScatterGraph code = """ @@ -32,7 +32,7 @@ """ -async def test_super_graph(async_sandbox: AsyncCodeInterpreter): +async def test_super_graph(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_unknown.py b/python/tests/graphs/test_unknown.py index f41ca455..48a39b5f 100644 --- a/python/tests/graphs/test_unknown.py +++ b/python/tests/graphs/test_unknown.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_async import AsyncCodeInterpreter +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox from e2b_code_interpreter.graphs import GraphType, Graph code = """ @@ -27,7 +27,7 @@ """ -async def test_unknown_graphs(async_sandbox: AsyncCodeInterpreter): +async def test_unknown_graphs(async_sandbox: AsyncSandbox): result = await async_sandbox.notebook.exec_cell(code) graph = result.results[0].graph diff --git a/python/tests/sync/test_bash.py b/python/tests/sync/test_bash.py index 19c79de0..e3d29caa 100644 --- a/python/tests/sync/test_bash.py +++ b/python/tests/sync/test_bash.py @@ -1,6 +1,6 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_bash(sandbox: CodeInterpreter): +def test_bash(sandbox: Sandbox): result = sandbox.notebook.exec_cell("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/sync/test_basic.py b/python/tests/sync/test_basic.py index b1fba259..4400888a 100644 --- a/python/tests/sync/test_basic.py +++ b/python/tests/sync/test_basic.py @@ -1,6 +1,6 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_basic(sandbox: CodeInterpreter): +def test_basic(sandbox: Sandbox): result = sandbox.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/sync/test_custom_repr_object.py b/python/tests/sync/test_custom_repr_object.py index ba35fca9..070fafab 100644 --- a/python/tests/sync/test_custom_repr_object.py +++ b/python/tests/sync/test_custom_repr_object.py @@ -1,4 +1,4 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox code = """ from IPython.display import display @@ -7,6 +7,6 @@ """ -def test_bash(sandbox: CodeInterpreter): +def test_bash(sandbox: Sandbox): execution = sandbox.notebook.exec_cell(code) assert execution.results[0].formats() == ["latex"] diff --git a/python/tests/sync/test_data.py b/python/tests/sync/test_data.py index 99e02ce5..3c5399e0 100644 --- a/python/tests/sync/test_data.py +++ b/python/tests/sync/test_data.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_data(sandbox: CodeInterpreter): +def test_data(sandbox: Sandbox): # plot random graph result = sandbox.notebook.exec_cell( """ diff --git a/python/tests/sync/test_display_data.py b/python/tests/sync/test_display_data.py index 1f38bee7..50d7a5ae 100644 --- a/python/tests/sync/test_display_data.py +++ b/python/tests/sync/test_display_data.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_display_data(sandbox: CodeInterpreter): +def test_display_data(sandbox: Sandbox): # plot random graph result = sandbox.notebook.exec_cell( """ diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 107c989f..f32eff32 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -1,14 +1,14 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox async def test_env_vars_sandbox(): - sbx = CodeInterpreter(envs={"FOO": "bar"}) + sbx = Sandbox(envs={"FOO": "bar"}) result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") assert result.text == "bar" sbx.kill() -async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): +async def test_env_vars_in_exec_cell(sandbox: Sandbox): result = sandbox.notebook.exec_cell( "import os; os.getenv('FOO')", envs={"FOO": "bar"} ) @@ -16,7 +16,7 @@ async def test_env_vars_in_exec_cell(sandbox: CodeInterpreter): async def test_env_vars_override(debug: bool): - sbx = CodeInterpreter(envs={"FOO": "bar", "SBX": "value"}) + sbx = Sandbox(envs={"FOO": "bar", "SBX": "value"}) sbx.notebook.exec_cell( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" ) diff --git a/python/tests/sync/test_execution_count.py b/python/tests/sync/test_execution_count.py index 9d474929..4782aafc 100644 --- a/python/tests/sync/test_execution_count.py +++ b/python/tests/sync/test_execution_count.py @@ -1,10 +1,10 @@ import pytest -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox @pytest.mark.skip_debug() -def test_execution_count(sandbox: CodeInterpreter): +def test_execution_count(sandbox: Sandbox): sandbox.notebook.exec_cell("echo 'E2B is awesome!'") result = sandbox.notebook.exec_cell("!pwd") assert result.execution_count == 2 diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index f48ff062..6be6268c 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -1,13 +1,13 @@ import pytest -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_create_new_kernel(sandbox: CodeInterpreter): +def test_create_new_kernel(sandbox: Sandbox): sandbox.notebook.create_kernel() -def test_independence_of_kernels(sandbox: CodeInterpreter): +def test_independence_of_kernels(sandbox: Sandbox): kernel_id = sandbox.notebook.create_kernel() sandbox.notebook.exec_cell("x = 1") @@ -17,7 +17,7 @@ def test_independence_of_kernels(sandbox: CodeInterpreter): @pytest.mark.skip_debug() -def test_restart_kernel(sandbox: CodeInterpreter): +def test_restart_kernel(sandbox: Sandbox): sandbox.notebook.exec_cell("x = 1") sandbox.notebook.restart_kernel() @@ -27,7 +27,7 @@ def test_restart_kernel(sandbox: CodeInterpreter): @pytest.mark.skip_debug() -def test_list_kernels(sandbox: CodeInterpreter): +def test_list_kernels(sandbox: Sandbox): kernels = sandbox.notebook.list_kernels() assert len(kernels) == 1 @@ -38,7 +38,7 @@ def test_list_kernels(sandbox: CodeInterpreter): @pytest.mark.skip_debug() -def test_shutdown(sandbox: CodeInterpreter): +def test_shutdown(sandbox: Sandbox): kernel_id = sandbox.notebook.create_kernel() kernels = sandbox.notebook.list_kernels() assert kernel_id in [kernel.kernel_id for kernel in kernels] diff --git a/python/tests/sync/test_reconnect.py b/python/tests/sync/test_reconnect.py index 518af546..6dbc5557 100644 --- a/python/tests/sync/test_reconnect.py +++ b/python/tests/sync/test_reconnect.py @@ -1,9 +1,9 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_reconnect(sandbox: CodeInterpreter): +def test_reconnect(sandbox: Sandbox): sandbox_id = sandbox.sandbox_id - sandbox2 = CodeInterpreter.connect(sandbox_id) + sandbox2 = Sandbox.connect(sandbox_id) result = sandbox2.notebook.exec_cell("x =1; x") assert result.text == "1" diff --git a/python/tests/sync/test_statefulness.py b/python/tests/sync/test_statefulness.py index 8e401b3c..bcf30586 100644 --- a/python/tests/sync/test_statefulness.py +++ b/python/tests/sync/test_statefulness.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_stateful(sandbox: CodeInterpreter): +def test_stateful(sandbox: Sandbox): sandbox.notebook.exec_cell("test_stateful = 1") result = sandbox.notebook.exec_cell("test_stateful+=1; test_stateful") diff --git a/python/tests/sync/test_streaming.py b/python/tests/sync/test_streaming.py index 6b9cd8da..9ef912ba 100644 --- a/python/tests/sync/test_streaming.py +++ b/python/tests/sync/test_streaming.py @@ -1,7 +1,7 @@ -from e2b_code_interpreter.code_interpreter_sync import CodeInterpreter +from e2b_code_interpreter.code_interpreter_sync import Sandbox -def test_streaming_output(sandbox: CodeInterpreter): +def test_streaming_output(sandbox: Sandbox): out = [] def test(line) -> None: @@ -14,7 +14,7 @@ def test(line) -> None: assert out[0].line == "1\n" -def test_streaming_error(sandbox: CodeInterpreter): +def test_streaming_error(sandbox: Sandbox): out = [] sandbox.notebook.exec_cell( @@ -25,7 +25,7 @@ def test_streaming_error(sandbox: CodeInterpreter): assert out[0].line == "1\n" -def test_streaming_result(sandbox: CodeInterpreter): +def test_streaming_result(sandbox: Sandbox): code = """ import matplotlib.pyplot as plt import numpy as np From c12c58458c03846120821ba4041f4abe5dfcf68b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 14 Oct 2024 21:22:03 +0000 Subject: [PATCH 362/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index bbe86d91..ac9394c6 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.70", + "version": "0.0.9-beta.71", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 5ec68a9b..200f6627 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b45" +version = "0.0.11b46" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 85aad8bfde3211a6b4fe9ea6773fa36810a6e51d Mon Sep 17 00:00:00 2001 From: Tereza Tizkova Date: Mon, 14 Oct 2024 14:22:29 -0700 Subject: [PATCH 363/722] Update readme --- README.md | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 671832ba..842f679a 100644 --- a/README.md +++ b/README.md @@ -83,25 +83,44 @@ E2B Sandbox is a secure cloud environment that allows AI agents and apps. You ca > Please visit [documentation](https://e2b.dev/docs) to get started. -To create and control a sandbox, you use our SDK: +**Python** -### Install SDK +1. Install SDK ```bash -pip install e2b +pip install e2b_code_interpreter ``` -### Start sandbox +2. Execute code with code interpreter inside sandbox ```py -from e2b import Sandbox +from e2b_code_interpreter import Sandbox -# Create sandbox -sandbox = Sandbox() +with CodeInterpreter() as sandbox: + sandbox.run_code("x = 1") -# Let an LLM use the sandbox here -# Visit https://e2b.dev/docs/sandbox/overview to learn more about sandboxes. + execution = sandbox.run_code("x+=1; x") + print(execution.text) # outputs 2 +``` + +**JavaScript & TypeScript** + +1. Install SDK -# Close sandbox once done -sandbox.close() +```bash +npm i @e2b/code-interpreter ``` + +2. Execute code with code interpreter inside sandbox + +```js +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await CodeInterpreter.create() +await sbx.runCode()('x = 1') + +const execution = await sbx.runCode()('x+=1; x') +console.log(execution.text) // outputs 2 + +await sandbox.close() +``` \ No newline at end of file From 22c443c00baed0da183bd54dfce3e694d7d7b621 Mon Sep 17 00:00:00 2001 From: Tereza Tizkova Date: Mon, 14 Oct 2024 14:32:36 -0700 Subject: [PATCH 364/722] Update readme - minor fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 842f679a..73b957ab 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ pip install e2b_code_interpreter ```py from e2b_code_interpreter import Sandbox -with CodeInterpreter() as sandbox: +with Sandbox() as sandbox: sandbox.run_code("x = 1") execution = sandbox.run_code("x+=1; x") @@ -116,7 +116,7 @@ npm i @e2b/code-interpreter ```js import { Sandbox } from '@e2b/code-interpreter' -const sandbox = await CodeInterpreter.create() +const sandbox = await Sandbox.create() await sbx.runCode()('x = 1') const execution = await sbx.runCode()('x+=1; x') From 46a18ae1e03153a708481fe1e3740b1adfc4c46e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 16:32:15 -0700 Subject: [PATCH 365/722] Initialize default context for each language, get rid of jupyter naming --- template/README.md | 18 +-- template/server/api/models/context.py | 2 +- template/server/api/models/create_context.py | 4 +- .../server/api/models/execution_request.py | 3 + template/server/api/models/result.py | 2 - template/server/consts.py | 1 + template/server/contexts.py | 63 ++++++++ template/server/main.py | 140 ++++++++---------- template/server/messaging.py | 20 +-- template/test.Dockerfile | 5 + 10 files changed, 153 insertions(+), 105 deletions(-) create mode 100644 template/server/consts.py create mode 100644 template/server/contexts.py diff --git a/template/README.md b/template/README.md index 8c1aaa34..d860b118 100644 --- a/template/README.md +++ b/template/README.md @@ -23,21 +23,21 @@ If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled **Python** ```python - from e2b_code_interpreter import CodeInterpreter - sandbox = CodeInterpreter(template="your-custom-sandbox-name") - execution = sandbox.notebook.exec_cell("print('hello')") - sandbox.close() + from e2b_code_interpreter import Sandbox + sandbox = Sandbox(template="your-custom-sandbox-name") + execution = sandbox.run_code("print('hello')") + sandbox.kill() # Or you can use `with` which handles closing the sandbox for you - with CodeInterpreter(template="your-custom-sandbox-name") as sandbox: - execution = sandbox.notebook.exec_cell("print('hello')") + with Sandbox(template="your-custom-sandbox-name") as sandbox: + execution = sandbox.run_code("print('hello')") ``` **JavaScript/TypeScript** ```js - import { CodeInterpreter } from '@e2b/code-interpreter' - const sandbox = await CodeInterpreter.create({ template: 'your-custom-sandbox-name' }) - const execution = await sandbox.notebook.execCell('print("hello")') + import { Sandbox } from '@e2b/code-interpreter' + const sandbox = await Sandbox.create({ template: 'your-custom-sandbox-name' }) + const execution = await sandbox.execCell('print("hello")') await sandbox.close() ``` diff --git a/template/server/api/models/context.py b/template/server/api/models/context.py index 49ab1fc6..e02484d5 100644 --- a/template/server/api/models/context.py +++ b/template/server/api/models/context.py @@ -4,5 +4,5 @@ class Context(BaseModel): id: StrictStr = Field(description="Context ID") - name: StrictStr = Field(description="Context name") + language: StrictStr = Field(description="Language of the context") cwd: StrictStr = Field(description="Current working directory of the context") diff --git a/template/server/api/models/create_context.py b/template/server/api/models/create_context.py index c24c7fab..1e1fefb7 100644 --- a/template/server/api/models/create_context.py +++ b/template/server/api/models/create_context.py @@ -8,6 +8,6 @@ class CreateContext(BaseModel): default="/home/user", description="Current working directory", ) - name: Optional[StrictStr] = Field( - default="python", description="Name of the kernel" + language: Optional[StrictStr] = Field( + default="python", description="Language of the context" ) diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index ba49f2a8..54824af6 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -8,6 +8,9 @@ class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") context_id: Optional[StrictStr] = Field(default="default", description="Context ID") + language: Optional[StrictStr] = Field( + default=None, description="Language of the code" + ) env_vars: Optional[EnvVars] = Field( description="Environment variables", default=None ) diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index 09247117..d1ae16a4 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -18,8 +18,6 @@ class Result(BaseModel): The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, for the actual result the representation is always present for the result, the other representations are always optional. - - The class also provides methods to display the data in a Jupyter notebook. """ type: OutputType = OutputType.RESULT diff --git a/template/server/consts.py b/template/server/consts.py new file mode 100644 index 00000000..e1b92a06 --- /dev/null +++ b/template/server/consts.py @@ -0,0 +1 @@ +JUPYTER_BASE_URL = "http://localhost:8888" diff --git a/template/server/contexts.py b/template/server/contexts.py new file mode 100644 index 00000000..2ae8e583 --- /dev/null +++ b/template/server/contexts.py @@ -0,0 +1,63 @@ +import logging +import uuid +from typing import Optional + +from api.models.context import Context +from fastapi import HTTPException + +from consts import JUPYTER_BASE_URL +from errors import ExecutionError +from messaging import ContextWebSocket + +logger = logging.Logger(__name__) + + +def normalize_language(language: Optional[str]) -> str: + if not language: + return "python" + + language = language.lower().strip() + + if language == "js": + return "javascript" + + return language + + +async def create_context(client, websockets: dict, language: str, cwd: str) -> Context: + data = { + "path": str(uuid.uuid4()), + "kernel": {"name": language}, + "type": "notebook", + "name": str(uuid.uuid4()), + } + logger.debug(f"Creating new {language} context") + + response = await client.post(f"{JUPYTER_BASE_URL}/api/sessions", json=data) + + if not response.is_success: + raise HTTPException( + status_code=500, + detail=f"Failed to create context: {response.text}", + ) + + session_data = response.json() + session_id = session_data["id"] + context_id = session_data["kernel"]["id"] + + logger.debug(f"Created context {context_id}") + + ws = ContextWebSocket(context_id, session_id, language, cwd) + await ws.connect() + websockets[context_id] = ws + + logger.info(f"Setting working directory to {cwd}") + try: + await ws.change_current_directory(cwd) + except ExecutionError as e: + raise HTTPException( + status_code=500, + detail="Failed to set working directory", + ) from e + + return Context(language=language, id=context_id, cwd=cwd) diff --git a/template/server/main.py b/template/server/main.py index 202a6dc6..465425fe 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -4,15 +4,14 @@ from typing import Dict, Union, Literal, List -from pydantic import StrictStr from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException from api.models.context import Context from api.models.create_context import CreateContext from api.models.execution_request import ExecutionRequest -from errors import ExecutionError -from messaging import JupyterKernelWebSocket +from contexts import create_context, normalize_language +from messaging import ContextWebSocket from stream import StreamingListJsonResponse @@ -22,10 +21,8 @@ http_logger.setLevel(logging.WARNING) -JUPYTER_BASE_URL = "http://localhost:8888" - -websockets: Dict[Union[StrictStr, Literal["default"]], JupyterKernelWebSocket] = {} -global default_kernel_id +websockets: Dict[Union[str, Literal["default"]], ContextWebSocket] = {} +default_websockets: Dict[str, str] = {} global client @@ -34,16 +31,18 @@ async def lifespan(app: FastAPI): global client client = httpx.AsyncClient() - global default_kernel_id with open("/root/.jupyter/kernel_id") as file: - default_kernel_id = file.read().strip() + default_context_id = file.read().strip() - default_ws = JupyterKernelWebSocket( - default_kernel_id, + default_ws = ContextWebSocket( + default_context_id, str(uuid.uuid4()), "python", "/home/user", ) + default_websockets["python"] = default_context_id + websockets["default"] = default_ws + websockets[default_context_id] = default_ws logger.info("Connecting to default runtime") await default_ws.connect() @@ -65,104 +64,83 @@ async def lifespan(app: FastAPI): @app.get("/health") -async def health(): +async def get_health(): return "OK" @app.post("/execute") -async def execute(request: ExecutionRequest): +async def post_execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") - if request.context_id: - ws = websockets.get(request.context_id) - - if not ws: - raise HTTPException( - status_code=404, - detail=f"Kernel {request.context_id} not found", - ) - else: - ws = websockets["default"] - - return StreamingListJsonResponse( - ws.execute(request.code, env_vars=request.env_vars) - ) + if request.context_id and request.language: + raise HTTPException( + status_code=400, + detail="Only one of context_id or language can be provided", + ) + context_id = None + if request.language: + language = normalize_language(request.language) + context_id = default_websockets.get(language) -@app.post("/contexts") -async def create_context(request: CreateContext) -> Context: - logger.info(f"Creating new kernel") + if not context_id: + context = await create_context(client, websockets, language, "/home/user") + context_id = context.id - data = { - "path": str(uuid.uuid4()), - "kernel": {"name": request.name}, - "type": "notebook", - "name": str(uuid.uuid4()), - } - logger.debug(f"Creating new kernel with data: {data}") + elif request.context_id: + context_id = request.context_id - response = await client.post(f"{JUPYTER_BASE_URL}/api/sessions", json=data) + if context_id: + ws = websockets.get(context_id, None) + else: + ws = websockets["default"] - if not response.is_success: + if not ws: raise HTTPException( - status_code=500, - detail=f"Failed to create kernel: {response.text}", + status_code=404, + detail=f"Context {request.context_id} not found", ) - session_data = response.json() - session_id = session_data["id"] - kernel_id = session_data["kernel"]["id"] - - logger.debug(f"Created kernel {kernel_id}") - - ws = JupyterKernelWebSocket( - kernel_id, - session_id, - request.name, - request.cwd, + return StreamingListJsonResponse( + ws.execute(request.code, env_vars=request.env_vars) ) - await ws.connect() - websockets[kernel_id] = ws - if request.cwd: - logger.info(f"Setting working directory to {request.cwd}") - try: - await ws.change_current_directory(request.cwd) - except ExecutionError as e: - raise HTTPException( - status_code=500, - detail="Failed to set working directory", - ) from e +@app.post("/contexts") +async def post_contexts(request: CreateContext) -> Context: + logger.info(f"Creating a new context") + + language = normalize_language(request.language) + cwd = request.cwd or "/home/user" - return Context(name=request.name, id=kernel_id, cwd=request.cwd) + return await create_context(client, websockets, language, cwd) @app.get("/contexts") -async def list_contexts() -> List[Context]: - logger.info(f"Listing kernels") +async def get_contexts() -> List[Context]: + logger.info(f"Listing contexts") - kernel_ids = list(websockets.keys()) + context_ids = list(websockets.keys()) return [ Context( - id=websockets[kernel_id].kernel_id, - name=websockets[kernel_id].name, - cwd=websockets[kernel_id].cwd, + id=websockets[context_id].context_id, + language=websockets[context_id].language, + cwd=websockets[context_id].cwd, ) - for kernel_id in kernel_ids + for context_id in context_ids ] @app.post("/contexts/{context_id}/restart") async def restart_context(context_id: str) -> None: - logger.info(f"Restarting kernel {context_id}") + logger.info(f"Restarting context {context_id}") ws = websockets.get(context_id, None) if not ws: raise HTTPException( status_code=404, - detail=f"Kernel {context_id} not found", + detail=f"Context {context_id} not found", ) session_id = ws.session_id @@ -170,18 +148,18 @@ async def restart_context(context_id: str) -> None: await ws.close() response = await client.post( - f"{JUPYTER_BASE_URL}/api/kernels/{ws.kernel_id}/restart" + f"{JUPYTER_BASE_URL}/api/kernels/{ws.context_id}/restart" ) if not response.is_success: raise HTTPException( status_code=500, - detail=f"Failed to restart kernel {context_id}", + detail=f"Failed to restart context {context_id}", ) - ws = JupyterKernelWebSocket( - ws.kernel_id, + ws = ContextWebSocket( + ws.context_id, session_id, - ws.name, + ws.language, ws.cwd, ) @@ -192,13 +170,13 @@ async def restart_context(context_id: str) -> None: @app.delete("/contexts/{context_id}") async def remove_context(context_id: str) -> None: - logger.info(f"Removing kernel {context_id}") + logger.info(f"Removing context {context_id}") ws = websockets.get(context_id, None) if not ws: raise HTTPException( status_code=404, - detail=f"Kernel {context_id} not found", + detail=f"Context {context_id} not found", ) try: @@ -206,7 +184,7 @@ async def remove_context(context_id: str) -> None: except: pass - response = await client.delete(f"{JUPYTER_BASE_URL}/api/kernels/{ws.kernel_id}") + response = await client.delete(f"{JUPYTER_BASE_URL}/api/kernels/{ws.context_id}") if not response.is_success: raise HTTPException( status_code=500, diff --git a/template/server/messaging.py b/template/server/messaging.py index e5673358..cfa6786c 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -44,21 +44,21 @@ def __init__(self, in_background: bool = False): self.in_background = in_background -class JupyterKernelWebSocket: +class ContextWebSocket: _ws: Optional[WebSocketClientProtocol] = None _receive_task: Optional[asyncio.Task] = None def __init__( self, - kernel_id: str, + context_id: str, session_id: str, - name: str, + language: str, cwd: str, ): - self.name = name + self.language = language self.cwd = cwd - self.kernel_id = kernel_id - self.url = f"ws://localhost:8888/api/kernels/{kernel_id}/channels" + self.context_id = context_id + self.url = f"ws://localhost:8888/api/kernels/{context_id}/channels" self.session_id = session_id self._executions: Dict[str, Execution] = {} @@ -206,12 +206,12 @@ async def _process_message(self, data: dict): data["msg_type"] == "status" and data["content"]["execution_state"] == "restarting" ): - logger.error("Kernel is restarting") + logger.error("Context is restarting") for execution in self._executions.values(): await execution.queue.put( Error( - name="KernelRestarting", - value="Kernel was restarted", + name="ContextRestarting", + value="Context was restarted", traceback="", ) ) @@ -315,7 +315,7 @@ async def _process_message(self, data: dict): logger.warning(f"[UNHANDLED MESSAGE TYPE]: {data['msg_type']}") async def close(self): - logger.debug(f"Closing WebSocket {self.kernel_id}") + logger.debug(f"Closing WebSocket {self.context_id}") if self._ws is not None: await self._ws.close() diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 91334f98..97b7113d 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -18,6 +18,11 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user +# Javascript Kernel +RUN npm install -g node-gyp +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + # Create separate virtual environment for server RUN python -m venv $SERVER_PATH/.venv From f481c284debfb3871ed1f1ecb469630d8fe95b81 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 16:44:14 -0700 Subject: [PATCH 366/722] Refactor Python SDK (Renaming, remove notebook module scope, remove context managing methods) --- python/README.md | 22 +- python/async_example.py | 12 +- .../code_interpreter_async.py | 171 +++------------- .../code_interpreter_sync.py | 190 +++--------------- python/e2b_code_interpreter/constants.py | 2 +- python/e2b_code_interpreter/models.py | 26 ++- python/example.py | 8 +- python/tests/async/test_async_bash.py | 2 +- python/tests/async/test_async_basic.py | 2 +- .../async/test_async_custom_repr_object.py | 2 +- python/tests/async/test_async_data.py | 2 +- python/tests/async/test_async_display_data.py | 2 +- python/tests/async/test_async_env_vars.py | 19 +- .../tests/async/test_async_execution_count.py | 4 +- python/tests/async/test_async_kernels.py | 44 +--- python/tests/async/test_async_reconnect.py | 2 +- python/tests/async/test_async_statefulness.py | 6 +- python/tests/async/test_async_streaming.py | 6 +- python/tests/benchmarking.py | 6 +- python/tests/graphs/test_bar.py | 2 +- python/tests/graphs/test_box_and_whiskers.py | 2 +- python/tests/graphs/test_line.py | 2 +- python/tests/graphs/test_log_graph.py | 2 +- python/tests/graphs/test_pie.py | 2 +- python/tests/graphs/test_scale.py | 4 +- python/tests/graphs/test_scatter.py | 2 +- python/tests/graphs/test_supergraph.py | 2 +- python/tests/graphs/test_unknown.py | 2 +- python/tests/sync/test_bash.py | 2 +- python/tests/sync/test_basic.py | 2 +- python/tests/sync/test_custom_repr_object.py | 2 +- python/tests/sync/test_data.py | 2 +- python/tests/sync/test_default_kernels.py | 15 ++ python/tests/sync/test_display_data.py | 2 +- python/tests/sync/test_env_vars.py | 19 +- python/tests/sync/test_execution_count.py | 4 +- python/tests/sync/test_kernels.py | 44 +--- python/tests/sync/test_reconnect.py | 2 +- python/tests/sync/test_statefulness.py | 4 +- python/tests/sync/test_streaming.py | 8 +- 40 files changed, 183 insertions(+), 471 deletions(-) create mode 100644 python/tests/sync/test_default_kernels.py diff --git a/python/README.md b/python/README.md index 92b44bbc..12a1acd6 100644 --- a/python/README.md +++ b/python/README.md @@ -18,12 +18,12 @@ pip install e2b-code-interpreter ### Minimal example with the sharing context ```python -from e2b_code_interpreter import CodeInterpreter +from e2b_code_interpreter import Sandbox -with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell("x = 1") +with Sandbox() as sandbox: + sandbox.run_code("x = 1") - execution = sandbox.notebook.exec_cell("x+=1; x") + execution = sandbox.run_code("x+=1; x") print(execution.text) # outputs 2 ``` @@ -36,7 +36,7 @@ import io from matplotlib import image as mpimg, pyplot as plt -from e2b_code_interpreter import CodeInterpreter +from e2b_code_interpreter import Sandbox code = """ import matplotlib.pyplot as plt @@ -49,12 +49,12 @@ plt.plot(x, y) plt.show() """ -with CodeInterpreter() as sandbox: +with Sandbox() as sandbox: # you can install dependencies in "jupyter notebook style" - sandbox.notebook.exec_cell("!pip install matplotlib") + sandbox.run_code("!pip install matplotlib") # plot random graph - execution = sandbox.notebook.exec_cell(code) + execution = sandbox.run_code(code) # there's your image image = execution.results[0].png @@ -71,7 +71,7 @@ plt.show() ### Streaming code output ```python -from e2b_code_interpreter import CodeInterpreter +from e2b_code_interpreter import Sandbox code = """ import time @@ -85,6 +85,6 @@ time.sleep(3) print("world") """ -with CodeInterpreter() as sandbox: - sandbox.notebook.exec_cell(code, on_stdout=print, on_stderr=print, on_result=(lambda result: print(result.text))) +with Sandbox() as sandbox: + sandbox.run_code(code, on_stdout=print, on_stderr=print, on_result=(lambda result: print(result.text))) ``` diff --git a/python/async_example.py b/python/async_example.py index 5d9df50b..02eab3a7 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -2,7 +2,7 @@ from dotenv import load_dotenv -from e2b_code_interpreter import AsyncCodeInterpreter +from e2b_code_interpreter import AsyncSandbox load_dotenv() @@ -47,16 +47,12 @@ async def create_sbx(sbx, i: int): await asyncio.sleep(i * 0.01) - return ( - await sbx.notebook.exec_cell(f"os.getenv('TEST')", envs={"TEST": str(i)}) - ).text + return (await sbx.run_code(f"os.getenv('TEST')", envs={"TEST": str(i)})).text async def run(): - sbx = await AsyncCodeInterpreter.create( - debug=True, - ) - result = await sbx.notebook.exec_cell(code) + sbx = await AsyncSandbox.create(debug=True) + result = await sbx.run_code(code) print("".join(result.logs.stdout)) print("".join(result.logs.stderr)) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index c2b90eec..071b8a24 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,19 +1,19 @@ import logging import httpx -from typing import Optional, List, Dict -from httpx import AsyncHTTPTransport, AsyncClient +from typing import Optional, Dict +from httpx import AsyncClient from e2b import AsyncSandbox as BaseAsyncSandbox, ConnectionConfig from e2b_code_interpreter.constants import ( - DEFAULT_KERNEL_ID, DEFAULT_TEMPLATE, JUPYTER_PORT, + DEFAULT_TIMEOUT, ) from e2b_code_interpreter.models import ( Execution, - Kernel, + Context, Result, aextract_exception, parse_output, @@ -28,31 +28,25 @@ logger = logging.getLogger(__name__) -class JupyterExtension: - """ - Code interpreter module for executing code in a stateful context. - """ +class AsyncSandbox(BaseAsyncSandbox): + default_template = DEFAULT_TEMPLATE + + def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): + super().__init__(sandbox_id=sandbox_id, connection_config=connection_config) - _exec_timeout = 300 + @property + def _jupyter_url(self) -> str: + return f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(JUPYTER_PORT)}" @property def _client(self) -> AsyncClient: return AsyncClient(transport=self._transport) - def __init__( - self, - url: str, - transport: AsyncHTTPTransport, - connection_config: ConnectionConfig, - ): - self._url = url - self._transport = transport - self._connection_config = connection_config - - async def exec_cell( + async def run_code( self, code: str, - kernel_id: Optional[str] = None, + language: Optional[str] = None, + context: Optional[Context] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -65,7 +59,8 @@ async def exec_cell( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param kernel_id: The context id + :param language: Language of the code. If not specified and context_id is not provided, the default Python context is used. + :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object @@ -76,16 +71,20 @@ async def exec_cell( """ logger.debug(f"Executing code {code}") - timeout = None if timeout == 0 else (timeout or self._exec_timeout) + if context and language: + raise ValueError("Only one of context_id or language can be provided") + + timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) request_timeout = request_timeout or self._connection_config.request_timeout + context_id = context.id if context else None try: async with self._client.stream( "POST", - f"{self._url}/execute", + f"{self._jupyter_url}/execute", json={ "code": code, - "context_id": kernel_id, + "context_id": context_id, "env_vars": envs, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), @@ -112,27 +111,27 @@ async def exec_cell( except httpx.TimeoutException: raise format_request_timeout_error() - async def create_kernel( + async def create_code_context( self, cwd: Optional[str] = None, - kernel_name: Optional[str] = None, + language: Optional[str] = None, envs: Optional[Dict[str, str]] = None, request_timeout: Optional[float] = None, - ) -> str: + ) -> Context: """ Creates a new context to run code in. :param cwd: Set the current working directory for the context - :param kernel_name: Type of the context + :param language: Language of the context. If not specified, the default Python context is used. :param envs: Environment variables :param request_timeout: Max time to wait for the request to finish :return: Context id """ - logger.debug(f"Creating new kernel {kernel_name}") + logger.debug(f"Creating new {language} context") data = {} - if kernel_name: - data["name"] = kernel_name + if language: + data["language"] = language if cwd: data["cwd"] = cwd if envs: @@ -140,7 +139,7 @@ async def create_kernel( try: response = await self._client.post( - f"{self._url}/contexts", + f"{self._jupyter_url}/contexts", json=data, timeout=request_timeout or self._connection_config.request_timeout, ) @@ -150,110 +149,6 @@ async def create_kernel( raise err data = response.json() - return data["id"] + return Context.from_json(data) except httpx.TimeoutException: raise format_request_timeout_error() - - async def shutdown_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ) -> None: - """ - Shuts down a context. - - :param kernel_id: Context id - :param request_timeout: Max time to wait for the request to finish - """ - kernel_id = kernel_id or DEFAULT_KERNEL_ID - - logger.debug(f"Shutting down a kernel with id {kernel_id}") - - try: - response = await self._client.delete( - url=f"{self._url}/contexts/{kernel_id}", - timeout=request_timeout or self._connection_config.request_timeout, - ) - - err = await aextract_exception(response) - if err: - raise err - except httpx.TimeoutException: - raise format_request_timeout_error() - - async def restart_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ) -> None: - """ - Restarts the context. - Restarting will clear all variables, imports, and other settings set during previous executions. - - :param kernel_id: Context id - :param request_timeout: Max time to wait for the request to finish - """ - kernel_id = kernel_id or DEFAULT_KERNEL_ID - - logger.debug(f"Restarting kernel {kernel_id}") - - try: - response = await self._client.post( - f"{self._url}/contexts/{kernel_id}/restart", - timeout=request_timeout or self._connection_config.request_timeout, - ) - - err = await aextract_exception(response) - if err: - raise err - except httpx.TimeoutException: - raise format_request_timeout_error() - - async def list_kernels( - self, - request_timeout: Optional[float] = None, - ) -> List[Kernel]: - """ - Lists all available contexts. - - :param request_timeout: Max time to wait for the request to finish - :return: List of Kernel objects - """ - logger.debug("Listing kernels") - - try: - response = await self._client.get( - f"{self._url}/contexts", - timeout=request_timeout or self._connection_config.request_timeout, - ) - - err = await aextract_exception(response) - if err: - raise err - - return [Kernel(k["id"], k["name"]) for k in response.json()] - except httpx.TimeoutException: - raise format_request_timeout_error() - - -class AsyncSandbox(BaseAsyncSandbox): - default_template = DEFAULT_TEMPLATE - _jupyter_port = JUPYTER_PORT - - @property - def notebook(self) -> JupyterExtension: - """ - Code interpreter module for executing code in a stateful context. - """ - return self._notebook - - def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): - super().__init__(sandbox_id=sandbox_id, connection_config=connection_config) - - jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" - - self._notebook = JupyterExtension( - jupyter_url, - self._transport, - self.connection_config, - ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 9f4a79e9..a1894121 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,18 +1,18 @@ import logging import httpx -from typing import Optional, Dict, List -from httpx import HTTPTransport, Client -from e2b import Sandbox as BaseSandbox, ConnectionConfig +from typing import Optional, Dict +from httpx import Client +from e2b import Sandbox as BaseSandbox from e2b_code_interpreter.constants import ( - DEFAULT_KERNEL_ID, DEFAULT_TEMPLATE, JUPYTER_PORT, + DEFAULT_TIMEOUT, ) from e2b_code_interpreter.models import ( Execution, - Kernel, + Context, Result, extract_exception, parse_output, @@ -27,31 +27,22 @@ logger = logging.getLogger(__name__) -class JupyterExtension: - """ - Code interpreter module for executing code in a stateful context. - """ +class Sandbox(BaseSandbox): + default_template = DEFAULT_TEMPLATE - _exec_timeout = 300 + @property + def _jupyter_url(self) -> str: + return f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(JUPYTER_PORT)}" @property def _client(self) -> Client: return Client(transport=self._transport) - def __init__( - self, - url: str, - transport: HTTPTransport, - connection_config: ConnectionConfig, - ): - self._url = url - self._transport = transport - self._connection_config = connection_config - - def exec_cell( + def run_code( self, code: str, - kernel_id: Optional[str] = None, + language: Optional[str] = None, + context: Optional[Context] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -64,7 +55,8 @@ def exec_cell( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param kernel_id: The context id + :param language: Language of the code. If not specified and context_id is not provided, the default Python context is used. + :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object @@ -75,16 +67,21 @@ def exec_cell( """ logger.debug(f"Executing code {code}") - timeout = None if timeout == 0 else (timeout or self._exec_timeout) + if language and context: + raise ValueError("Only one of context_id or language can be provided") + + timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) request_timeout = request_timeout or self._connection_config.request_timeout + context_id = context.id if context else None try: with self._client.stream( "POST", - f"{self._url}/execute", + f"{self._jupyter_url}/execute", json={ "code": code, - "context_id": kernel_id, + "context_id": context_id, + "language": language, "env_vars": envs, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), @@ -110,27 +107,27 @@ def exec_cell( except httpx.TimeoutException: raise format_request_timeout_error() - def create_kernel( + def create_code_context( self, cwd: Optional[str] = None, - kernel_name: Optional[str] = None, + language: Optional[str] = None, envs: Optional[Dict[str, str]] = None, request_timeout: Optional[float] = None, - ) -> str: + ) -> Context: """ Creates a new context to run code in. :param cwd: Set the current working directory for the context - :param kernel_name: Type of the context + :param language: Language of the context. If not specified, the default Python context is used. :param envs: Environment variables :param request_timeout: Max time to wait for the request to finish :return: Context id """ - logger.debug(f"Creating new kernel {kernel_name}") + logger.debug(f"Creating new {language} context") data = {} - if kernel_name: - data["name"] = kernel_name + if language: + data["language"] = language if cwd: data["cwd"] = cwd if envs: @@ -138,7 +135,7 @@ def create_kernel( try: response = self._client.post( - f"{self._url}/contexts", + f"{self._jupyter_url}/contexts", json=data, timeout=request_timeout or self._connection_config.request_timeout, ) @@ -148,129 +145,6 @@ def create_kernel( raise err data = response.json() - return data["id"] + return Context.from_json(data) except httpx.TimeoutException: raise format_request_timeout_error() - - def shutdown_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ) -> None: - """ - Shuts down a context. - - :param kernel_id: Context id to shut down - :param request_timeout: Max time to wait for the request to finish - """ - kernel_id = kernel_id or DEFAULT_KERNEL_ID - - logger.debug(f"Shutting down a kernel with id {kernel_id}") - - try: - response = self._client.delete( - url=f"{self._url}/contexts/{kernel_id}", - timeout=request_timeout or self._connection_config.request_timeout, - ) - err = extract_exception(response) - if err: - raise err - except httpx.TimeoutException: - raise format_request_timeout_error() - - def restart_kernel( - self, - kernel_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ) -> None: - """ - Restarts the context. - Restarting will clear all variables, imports, and other settings set during previous executions. - - :param kernel_id: Context id - :param request_timeout: Max time to wait for the request to finish - """ - kernel_id = kernel_id or DEFAULT_KERNEL_ID - - logger.debug(f"Restarting kernel {kernel_id}") - - try: - response = self._client.post( - f"{self._url}/contexts/{kernel_id}/restart", - timeout=request_timeout or self._connection_config.request_timeout, - ) - - err = extract_exception(response) - if err: - raise err - except httpx.TimeoutException: - raise format_request_timeout_error() - - def list_kernels( - self, - request_timeout: Optional[float] = None, - ) -> List[Kernel]: - """ - Lists all available contexts. - - :param request_timeout: Max time to wait for the request to finish - :return: List of Kernel objects - """ - logger.debug("Listing kernels") - - try: - response = self._client.get( - f"{self._url}/contexts", - timeout=request_timeout or self._connection_config.request_timeout, - ) - - err = extract_exception(response) - if err: - raise err - - return [Kernel(kernel_id=k["id"], name=k["name"]) for k in response.json()] - except httpx.TimeoutException: - raise format_request_timeout_error() - - -class Sandbox(BaseSandbox): - default_template = DEFAULT_TEMPLATE - _jupyter_port = JUPYTER_PORT - - @property - def notebook(self) -> JupyterExtension: - """ - Code interpreter module for executing code in a stateful context. - """ - return self._notebook - - def __init__( - self, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ): - super().__init__( - template=template, - timeout=timeout, - metadata=metadata, - envs=envs, - api_key=api_key, - domain=domain, - debug=debug, - sandbox_id=sandbox_id, - request_timeout=request_timeout, - ) - - jupyter_url = f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(self._jupyter_port)}" - self._notebook = JupyterExtension( - jupyter_url, - self._transport, - self.connection_config, - ) diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index b0f4ec93..642dabc0 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ DEFAULT_TEMPLATE = "code-interpreter-beta" JUPYTER_PORT = 49999 -DEFAULT_KERNEL_ID = "default" +DEFAULT_TIMEOUT = 300 diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 6a25509b..08117365 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -80,8 +80,6 @@ class Result: The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, for the actual result the representation is always present for the result, the other representations are always optional. - - The class also provides methods to display the data in a Jupyter notebook. """ def __getitem__(self, item): @@ -420,10 +418,20 @@ def parse_output( @dataclass -class Kernel: - kernel_id: str - name: str - - def __init__(self, kernel_id: str, name: str, **kwargs): - self.kernel_id = kernel_id - self.name = name +class Context: + id: str + language: str + cwd: Optional[str] = None + + def __init__(self, context_id: str, language: str, cwd: str, **kwargs): + self.id = context_id + self.language = language + self.cwd = cwd + + @classmethod + def from_json(cls, data: Dict[str, str]): + return cls( + context_id=data.get("id"), + language=data.get("language"), + cwd=data.get("cwd"), + ) diff --git a/python/example.py b/python/example.py index b0a89750..cb79406d 100644 --- a/python/example.py +++ b/python/example.py @@ -1,10 +1,8 @@ import asyncio -import time -from time import sleep from dotenv import load_dotenv -from e2b_code_interpreter import AsyncCodeInterpreter +from e2b_code_interpreter import Sandbox load_dotenv() @@ -36,8 +34,8 @@ async def run(): - sbx = await AsyncCodeInterpreter.create(timeout=60) - e = await sbx.notebook.exec_cell(code) + sbx = Sandbox(timeout=60) + e = sbx.run_code(code) print(e.results[0].graph) diff --git a/python/tests/async/test_async_bash.py b/python/tests/async/test_async_bash.py index bcfdb207..a9e2cb0c 100644 --- a/python/tests/async/test_async_bash.py +++ b/python/tests/async/test_async_bash.py @@ -2,5 +2,5 @@ async def test_bash(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell("!pwd") + result = await async_sandbox.run_code("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/async/test_async_basic.py b/python/tests/async/test_async_basic.py index 84ffd29a..486fd219 100644 --- a/python/tests/async/test_async_basic.py +++ b/python/tests/async/test_async_basic.py @@ -2,5 +2,5 @@ async def test_basic(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell("x =1; x") + result = await async_sandbox.run_code("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_async_custom_repr_object.py b/python/tests/async/test_async_custom_repr_object.py index c8deb21a..7b35e925 100644 --- a/python/tests/async/test_async_custom_repr_object.py +++ b/python/tests/async/test_async_custom_repr_object.py @@ -8,5 +8,5 @@ async def test_bash(async_sandbox: AsyncSandbox): - execution = await async_sandbox.notebook.exec_cell(code) + execution = await async_sandbox.run_code(code) assert execution.results[0].formats() == ["latex"] diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py index d0bd1a4c..ad43ffec 100644 --- a/python/tests/async/test_async_data.py +++ b/python/tests/async/test_async_data.py @@ -3,7 +3,7 @@ async def test_data(async_sandbox: AsyncSandbox): # plot random graph - result = await async_sandbox.notebook.exec_cell( + result = await async_sandbox.run_code( """ import pandas as pd pd.DataFrame({"a": [1, 2, 3]}) diff --git a/python/tests/async/test_async_display_data.py b/python/tests/async/test_async_display_data.py index a714a4cc..e3756212 100644 --- a/python/tests/async/test_async_display_data.py +++ b/python/tests/async/test_async_display_data.py @@ -3,7 +3,7 @@ async def test_display_data(async_sandbox: AsyncSandbox): # plot random graph - result = await async_sandbox.notebook.exec_cell( + result = await async_sandbox.run_code( """ import matplotlib.pyplot as plt import numpy as np diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index cf54661c..aa317fc9 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -1,15 +1,18 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox +@pytest.mark.skip_debug() async def test_env_vars_sandbox(): sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) - result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") + result = await sbx.run_code("import os; os.getenv('FOO')") assert result.text == "bar" await sbx.kill() async def test_env_vars_in_exec_cell(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell( + result = await async_sandbox.run_code( "import os; os.getenv('FOO')", envs={"FOO": "bar"} ) assert result.text == "bar" @@ -17,24 +20,22 @@ async def test_env_vars_in_exec_cell(async_sandbox: AsyncSandbox): async def test_env_vars_override(debug: bool): sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) - await sbx.notebook.exec_cell( + await sbx.run_code( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" ) - result = await sbx.notebook.exec_cell( - "import os; os.getenv('FOO')", envs={"FOO": "baz"} - ) + result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") + result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") assert result.text == "async_python_runtime" if not debug: - result = await sbx.notebook.exec_cell("import os; os.getenv('SBX')") + result = await sbx.run_code("import os; os.getenv('SBX')") assert result.text == "value" # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.notebook.exec_cell("import os; os.getenv('FOO')") + result = await sbx.run_code("import os; os.getenv('FOO')") assert result.text == "bar" await sbx.kill() diff --git a/python/tests/async/test_async_execution_count.py b/python/tests/async/test_async_execution_count.py index e163750d..c4955838 100644 --- a/python/tests/async/test_async_execution_count.py +++ b/python/tests/async/test_async_execution_count.py @@ -5,6 +5,6 @@ @pytest.mark.skip_debug() async def test_execution_count(async_sandbox: AsyncSandbox): - await async_sandbox.notebook.exec_cell("echo 'E2B is awesome!'") - result = await async_sandbox.notebook.exec_cell("!pwd") + await async_sandbox.run_code("echo 'E2B is awesome!'") + result = await async_sandbox.run_code("!pwd") assert result.execution_count == 2 diff --git a/python/tests/async/test_async_kernels.py b/python/tests/async/test_async_kernels.py index f5d6b33b..b8950994 100644 --- a/python/tests/async/test_async_kernels.py +++ b/python/tests/async/test_async_kernels.py @@ -1,50 +1,14 @@ -import pytest - from e2b_code_interpreter.code_interpreter_async import AsyncSandbox async def test_create_new_kernel(async_sandbox: AsyncSandbox): - await async_sandbox.notebook.create_kernel() + await async_sandbox.create_code_context() async def test_independence_of_kernels(async_sandbox: AsyncSandbox): - kernel_id = await async_sandbox.notebook.create_kernel() - await async_sandbox.notebook.exec_cell("x = 1") - - r = await async_sandbox.notebook.exec_cell("x", kernel_id=kernel_id) - assert r.error is not None - assert r.error.value == "name 'x' is not defined" - - -@pytest.mark.skip_debug() -async def test_restart_kernel(async_sandbox: AsyncSandbox): - await async_sandbox.notebook.exec_cell("x = 1") - await async_sandbox.notebook.restart_kernel() + context = await async_sandbox.create_code_context() + await async_sandbox.run_code("x = 1") - r = await async_sandbox.notebook.exec_cell("x") + r = await async_sandbox.run_code("x", context=context) assert r.error is not None assert r.error.value == "name 'x' is not defined" - - -@pytest.mark.skip_debug() -async def test_list_kernels(async_sandbox: AsyncSandbox): - kernels = await async_sandbox.notebook.list_kernels() - assert len(kernels) == 1 - - kernel_id = await async_sandbox.notebook.create_kernel() - kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 2 - - -@pytest.mark.skip_debug() -async def test_shutdown(async_sandbox: AsyncSandbox): - kernel_id = await async_sandbox.notebook.create_kernel() - kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 2 - - await async_sandbox.notebook.shutdown_kernel(kernel_id) - kernels = await async_sandbox.notebook.list_kernels() - assert kernel_id not in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 1 diff --git a/python/tests/async/test_async_reconnect.py b/python/tests/async/test_async_reconnect.py index 0b91febf..9ed16f4a 100644 --- a/python/tests/async/test_async_reconnect.py +++ b/python/tests/async/test_async_reconnect.py @@ -5,5 +5,5 @@ async def test_reconnect(async_sandbox: AsyncSandbox): sandbox_id = async_sandbox.sandbox_id sandbox2 = await AsyncSandbox.connect(sandbox_id) - result = await sandbox2.notebook.exec_cell("x =1; x") + result = await sandbox2.run_code("x =1; x") assert result.text == "1" diff --git a/python/tests/async/test_async_statefulness.py b/python/tests/async/test_async_statefulness.py index be9612aa..e33dd808 100644 --- a/python/tests/async/test_async_statefulness.py +++ b/python/tests/async/test_async_statefulness.py @@ -2,9 +2,7 @@ async def test_stateful(async_sandbox: AsyncSandbox): - await async_sandbox.notebook.exec_cell("async_test_stateful = 1") + await async_sandbox.run_code("async_test_stateful = 1") - result = await async_sandbox.notebook.exec_cell( - "async_test_stateful+=1; async_test_stateful" - ) + result = await async_sandbox.run_code("async_test_stateful+=1; async_test_stateful") assert result.text == "2" diff --git a/python/tests/async/test_async_streaming.py b/python/tests/async/test_async_streaming.py index 148045de..ceb5c851 100644 --- a/python/tests/async/test_async_streaming.py +++ b/python/tests/async/test_async_streaming.py @@ -8,7 +8,7 @@ def test(line) -> None: out.append(line) return - await async_sandbox.notebook.exec_cell("print(1)", on_stdout=test) + await async_sandbox.run_code("print(1)", on_stdout=test) assert len(out) == 1 assert out[0].line == "1\n" @@ -17,7 +17,7 @@ def test(line) -> None: async def test_streaming_error(async_sandbox: AsyncSandbox): out = [] - await async_sandbox.notebook.exec_cell( + await async_sandbox.run_code( "import sys;print(1, file=sys.stderr)", on_stderr=out.append ) @@ -40,6 +40,6 @@ async def test_streaming_result(async_sandbox: AsyncSandbox): """ out = [] - await async_sandbox.notebook.exec_cell(code, on_result=out.append) + await async_sandbox.run_code(code, on_result=out.append) assert len(out) == 2 diff --git a/python/tests/benchmarking.py b/python/tests/benchmarking.py index 39496deb..c78d674c 100644 --- a/python/tests/benchmarking.py +++ b/python/tests/benchmarking.py @@ -18,14 +18,14 @@ create_sandbox_time += time.time() - start_time start_time = time.time() - sandbox.notebook.exec_cell("x = 1") + sandbox.run_code("x = 1") first_exec_time += time.time() - start_time start_time = time.time() - result = sandbox.notebook.exec_cell("x+=1; x") + result = sandbox.run_code("x+=1; x") second_exec_time += time.time() - start_time - sandbox.close() + sandbox.kill() print(f"Average Create Sandbox Time: {create_sandbox_time / iterations}s") diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 486c582b..481d4306 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -22,7 +22,7 @@ async def test_graph_bar(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/graphs/test_box_and_whiskers.py index 17073341..fe561d23 100644 --- a/python/tests/graphs/test_box_and_whiskers.py +++ b/python/tests/graphs/test_box_and_whiskers.py @@ -36,7 +36,7 @@ async def test_box_and_whiskers(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 7e40ab46..7f88a6f3 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -32,7 +32,7 @@ async def test_line_graph(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_log_graph.py b/python/tests/graphs/test_log_graph.py index 900be0f3..31b62d6a 100644 --- a/python/tests/graphs/test_log_graph.py +++ b/python/tests/graphs/test_log_graph.py @@ -30,7 +30,7 @@ async def test_log_graph(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py index d3510c29..d78d14d7 100644 --- a/python/tests/graphs/test_pie.py +++ b/python/tests/graphs/test_pie.py @@ -28,7 +28,7 @@ async def test_pie_graph(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_scale.py b/python/tests/graphs/test_scale.py index 98d3914f..38d1bf6c 100644 --- a/python/tests/graphs/test_scale.py +++ b/python/tests/graphs/test_scale.py @@ -18,7 +18,7 @@ async def test_datetime_scale(async_sandbox: AsyncSandbox): plt.show() """ - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph @@ -42,7 +42,7 @@ async def test_categorical_scale(async_sandbox: AsyncSandbox): plt.show() """ - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index 2845e6eb..445daf16 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -23,7 +23,7 @@ async def test_scatter_graph(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_supergraph.py b/python/tests/graphs/test_supergraph.py index c2f1fc9a..0f71315b 100644 --- a/python/tests/graphs/test_supergraph.py +++ b/python/tests/graphs/test_supergraph.py @@ -33,7 +33,7 @@ async def test_super_graph(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/graphs/test_unknown.py b/python/tests/graphs/test_unknown.py index 48a39b5f..9d919252 100644 --- a/python/tests/graphs/test_unknown.py +++ b/python/tests/graphs/test_unknown.py @@ -28,7 +28,7 @@ async def test_unknown_graphs(async_sandbox: AsyncSandbox): - result = await async_sandbox.notebook.exec_cell(code) + result = await async_sandbox.run_code(code) graph = result.results[0].graph assert graph diff --git a/python/tests/sync/test_bash.py b/python/tests/sync/test_bash.py index e3d29caa..7de9ccb6 100644 --- a/python/tests/sync/test_bash.py +++ b/python/tests/sync/test_bash.py @@ -2,5 +2,5 @@ def test_bash(sandbox: Sandbox): - result = sandbox.notebook.exec_cell("!pwd") + result = sandbox.run_code("!pwd") assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/sync/test_basic.py b/python/tests/sync/test_basic.py index 4400888a..4bfc503d 100644 --- a/python/tests/sync/test_basic.py +++ b/python/tests/sync/test_basic.py @@ -2,5 +2,5 @@ def test_basic(sandbox: Sandbox): - result = sandbox.notebook.exec_cell("x =1; x") + result = sandbox.run_code("x =1; x") assert result.text == "1" diff --git a/python/tests/sync/test_custom_repr_object.py b/python/tests/sync/test_custom_repr_object.py index 070fafab..8423c950 100644 --- a/python/tests/sync/test_custom_repr_object.py +++ b/python/tests/sync/test_custom_repr_object.py @@ -8,5 +8,5 @@ def test_bash(sandbox: Sandbox): - execution = sandbox.notebook.exec_cell(code) + execution = sandbox.run_code(code) assert execution.results[0].formats() == ["latex"] diff --git a/python/tests/sync/test_data.py b/python/tests/sync/test_data.py index 3c5399e0..eecc11cf 100644 --- a/python/tests/sync/test_data.py +++ b/python/tests/sync/test_data.py @@ -3,7 +3,7 @@ def test_data(sandbox: Sandbox): # plot random graph - result = sandbox.notebook.exec_cell( + result = sandbox.run_code( """ import pandas as pd pd.DataFrame({"a": [1, 2, 3]}) diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py new file mode 100644 index 00000000..1176aa9c --- /dev/null +++ b/python/tests/sync/test_default_kernels.py @@ -0,0 +1,15 @@ +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +def test_js_kernel(sandbox: Sandbox): + execution = sandbox.run_code("console.log('Hello, World!')", language="js") + assert execution.logs.stdout == ["Hello, World!\n"] + + +def test_independence_of_kernels(sandbox: Sandbox): + context = sandbox.create_code_context() + sandbox.run_code("x = 1") + + r = sandbox.run_code("x", context=context) + assert r.error is not None + assert r.error.value == "name 'x' is not defined" diff --git a/python/tests/sync/test_display_data.py b/python/tests/sync/test_display_data.py index 50d7a5ae..50443957 100644 --- a/python/tests/sync/test_display_data.py +++ b/python/tests/sync/test_display_data.py @@ -3,7 +3,7 @@ def test_display_data(sandbox: Sandbox): # plot random graph - result = sandbox.notebook.exec_cell( + result = sandbox.run_code( """ import matplotlib.pyplot as plt import numpy as np diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index f32eff32..2cf0dc5b 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -1,38 +1,39 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox +@pytest.mark.skip_debug() async def test_env_vars_sandbox(): sbx = Sandbox(envs={"FOO": "bar"}) - result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") + result = sbx.run_code("import os; os.getenv('FOO')") assert result.text == "bar" sbx.kill() async def test_env_vars_in_exec_cell(sandbox: Sandbox): - result = sandbox.notebook.exec_cell( - "import os; os.getenv('FOO')", envs={"FOO": "bar"} - ) + result = sandbox.run_code("import os; os.getenv('FOO')", envs={"FOO": "bar"}) assert result.text == "bar" async def test_env_vars_override(debug: bool): sbx = Sandbox(envs={"FOO": "bar", "SBX": "value"}) - sbx.notebook.exec_cell( + sbx.run_code( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" ) - result = sbx.notebook.exec_cell("import os; os.getenv('FOO')", envs={"FOO": "baz"}) + result = sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) assert result.text == "baz" # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = sbx.notebook.exec_cell("import os; os.getenv('RUNTIME_ENV')") + result = sbx.run_code("import os; os.getenv('RUNTIME_ENV')") assert result.text == "python_runtime" if not debug: - result = sbx.notebook.exec_cell("import os; os.getenv('SBX')") + result = sbx.run_code("import os; os.getenv('SBX')") assert result.text == "value" # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = sbx.notebook.exec_cell("import os; os.getenv('FOO')") + result = sbx.run_code("import os; os.getenv('FOO')") assert result.text == "bar" sbx.kill() diff --git a/python/tests/sync/test_execution_count.py b/python/tests/sync/test_execution_count.py index 4782aafc..98e2039f 100644 --- a/python/tests/sync/test_execution_count.py +++ b/python/tests/sync/test_execution_count.py @@ -5,6 +5,6 @@ @pytest.mark.skip_debug() def test_execution_count(sandbox: Sandbox): - sandbox.notebook.exec_cell("echo 'E2B is awesome!'") - result = sandbox.notebook.exec_cell("!pwd") + sandbox.run_code("echo 'E2B is awesome!'") + result = sandbox.run_code("!pwd") assert result.execution_count == 2 diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index 6be6268c..221413fe 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -1,50 +1,14 @@ -import pytest - from e2b_code_interpreter.code_interpreter_sync import Sandbox def test_create_new_kernel(sandbox: Sandbox): - sandbox.notebook.create_kernel() + sandbox.create_code_context() def test_independence_of_kernels(sandbox: Sandbox): - kernel_id = sandbox.notebook.create_kernel() - sandbox.notebook.exec_cell("x = 1") - - r = sandbox.notebook.exec_cell("x", kernel_id=kernel_id) - assert r.error is not None - assert r.error.value == "name 'x' is not defined" - - -@pytest.mark.skip_debug() -def test_restart_kernel(sandbox: Sandbox): - sandbox.notebook.exec_cell("x = 1") - sandbox.notebook.restart_kernel() + context = sandbox.create_code_context() + sandbox.run_code("x = 1") - r = sandbox.notebook.exec_cell("x") + r = sandbox.run_code("x", context=context) assert r.error is not None assert r.error.value == "name 'x' is not defined" - - -@pytest.mark.skip_debug() -def test_list_kernels(sandbox: Sandbox): - kernels = sandbox.notebook.list_kernels() - assert len(kernels) == 1 - - kernel_id = sandbox.notebook.create_kernel() - kernels = sandbox.notebook.list_kernels() - assert kernel_id in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 2 - - -@pytest.mark.skip_debug() -def test_shutdown(sandbox: Sandbox): - kernel_id = sandbox.notebook.create_kernel() - kernels = sandbox.notebook.list_kernels() - assert kernel_id in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 2 - - sandbox.notebook.shutdown_kernel(kernel_id) - kernels = sandbox.notebook.list_kernels() - assert kernel_id not in [kernel.kernel_id for kernel in kernels] - assert len(kernels) == 1 diff --git a/python/tests/sync/test_reconnect.py b/python/tests/sync/test_reconnect.py index 6dbc5557..27800a84 100644 --- a/python/tests/sync/test_reconnect.py +++ b/python/tests/sync/test_reconnect.py @@ -5,5 +5,5 @@ def test_reconnect(sandbox: Sandbox): sandbox_id = sandbox.sandbox_id sandbox2 = Sandbox.connect(sandbox_id) - result = sandbox2.notebook.exec_cell("x =1; x") + result = sandbox2.run_code("x =1; x") assert result.text == "1" diff --git a/python/tests/sync/test_statefulness.py b/python/tests/sync/test_statefulness.py index bcf30586..044478db 100644 --- a/python/tests/sync/test_statefulness.py +++ b/python/tests/sync/test_statefulness.py @@ -2,7 +2,7 @@ def test_stateful(sandbox: Sandbox): - sandbox.notebook.exec_cell("test_stateful = 1") + sandbox.run_code("test_stateful = 1") - result = sandbox.notebook.exec_cell("test_stateful+=1; test_stateful") + result = sandbox.run_code("test_stateful+=1; test_stateful") assert result.text == "2" diff --git a/python/tests/sync/test_streaming.py b/python/tests/sync/test_streaming.py index 9ef912ba..fa7a3c4a 100644 --- a/python/tests/sync/test_streaming.py +++ b/python/tests/sync/test_streaming.py @@ -8,7 +8,7 @@ def test(line) -> None: out.append(line) return - sandbox.notebook.exec_cell("print(1)", on_stdout=test) + sandbox.run_code("print(1)", on_stdout=test) assert len(out) == 1 assert out[0].line == "1\n" @@ -17,9 +17,7 @@ def test(line) -> None: def test_streaming_error(sandbox: Sandbox): out = [] - sandbox.notebook.exec_cell( - "import sys;print(1, file=sys.stderr)", on_stderr=out.append - ) + sandbox.run_code("import sys;print(1, file=sys.stderr)", on_stderr=out.append) assert len(out) == 1 assert out[0].line == "1\n" @@ -40,6 +38,6 @@ def test_streaming_result(sandbox: Sandbox): """ out = [] - sandbox.notebook.exec_cell(code, on_result=out.append) + sandbox.run_code(code, on_result=out.append) assert len(out) == 2 From 026c882fd31dbce588174464d15ab5c3286dd69b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 17:35:32 -0700 Subject: [PATCH 367/722] Refactor JS SDK (Renaming, remove notebook module scope, remove context managing methods) --- js/README.md | 28 +-- js/example.mts | 6 +- js/src/consts.ts | 2 + js/src/index.ts | 4 +- js/src/sandbox.ts | 207 +++--------------- js/src/utils.ts | 51 +++++ js/tests/bash.test.ts | 2 +- js/tests/basic.test.ts | 2 +- js/tests/benchmarking.js | 6 +- js/tests/data.test.ts | 2 +- js/tests/displayData.test.ts | 2 +- js/tests/envVars.test.ts | 14 +- js/tests/executionCount.test.ts | 4 +- js/tests/graphs/bar.test.ts | 2 +- js/tests/graphs/boxAndWhisker.test.ts | 2 +- js/tests/graphs/line.test.ts | 2 +- js/tests/graphs/log.test.ts | 2 +- js/tests/graphs/pie.test.ts | 2 +- js/tests/graphs/scales.test.ts | 4 +- js/tests/graphs/scatter.test.ts | 2 +- js/tests/graphs/supergraph.test.ts | 2 +- js/tests/graphs/unknown.test.ts | 2 +- js/tests/kernels.test.ts | 41 +--- js/tests/reconnect.test.ts | 2 +- js/tests/runtimes/bun/run.test.ts | 2 +- js/tests/runtimes/deno/run.test.ts | 2 +- js/tests/statefulness.test.ts | 4 +- js/tests/streaming.test.ts | 6 +- python/e2b_code_interpreter/__init__.py | 1 + .../code_interpreter_async.py | 6 +- .../code_interpreter_sync.py | 6 +- python/e2b_code_interpreter/models.py | 2 +- template/README.md | 10 +- 33 files changed, 159 insertions(+), 273 deletions(-) create mode 100644 js/src/consts.ts create mode 100644 js/src/utils.ts diff --git a/js/README.md b/js/README.md index 1ef22070..1dc75b2c 100644 --- a/js/README.md +++ b/js/README.md @@ -18,23 +18,23 @@ npm install @e2b/code-interpreter ### Minimal example with the sharing context ```js -import { CodeInterpreter } from '@e2b/code-interpreter' +import { Sandbox } from '@e2b/code-interpreter' -const sandbox = await CodeInterpreter.create() -await sandbox.notebook.execCell('x = 1') +const sandbox = await Sandbox.create() +await sandbox.runCode('x = 1') -const execution = await sandbox.notebook.execCell('x+=1; x') +const execution = await sandbox.runCode('x+=1; x') console.log(execution.text) // outputs 2 -await sandbox.close() +await sandbox.kill() ``` ### Get charts and any display-able data ```js -import { CodeInterpreter } from '@e2b/code-interpreter' +import { Sandbox } from '@e2b/code-interpreter' -const sandbox = await CodeInterpreter.create() +const sandbox = await Sandbox.create() const code = ` import matplotlib.pyplot as plt @@ -48,20 +48,20 @@ plt.show() ` // you can install dependencies in "jupyter notebook style" -await sandbox.notebook.execCell('!pip install matplotlib') +await sandbox.runCode('!pip install matplotlib') -const execution = await sandbox.notebook.execCell(code) +const execution = await sandbox.runCode(code) // this contains the image data, you can e.g. save it to file or send to frontend execution.results[0].png -await sandbox.close() +await sandbox.kill() ``` ### Streaming code output ```js -import { CodeInterpreter } from '@e2b/code-interpreter' +import { Sandbox } from '@e2b/code-interpreter' const code = ` import time @@ -75,13 +75,13 @@ time.sleep(3) print("world") ` -const sandbox = await CodeInterpreter.create() +const sandbox = await Sandbox.create() -await sandbox.notebook.execCell(code, { +await sandbox.runCode(code, { onStdout: (out) => console.log(out), onStderr: (outErr) => console.error(outErr), onResult: (result) => console.log(result.text), }) -await sandbox.close() +await sandbox.kill() ``` diff --git a/js/example.mts b/js/example.mts index 3fe5d652..217601bd 100644 --- a/js/example.mts +++ b/js/example.mts @@ -1,6 +1,6 @@ import dotenv from 'dotenv' -import { CodeInterpreter } from './dist' +import { Sandbox } from './dist' dotenv.config() @@ -22,10 +22,10 @@ import pandas pandas.DataFrame({"a": [1, 2, 3]}) ` -const sandbox = await CodeInterpreter.create() +const sandbox = await Sandbox.create() console.log(sandbox.sandboxId) -const execution = await sandbox.notebook.execCell(code, { +const execution = await sandbox.runCode(code, { onStdout(msg) { console.log('stdout', msg) }, diff --git a/js/src/consts.ts b/js/src/consts.ts new file mode 100644 index 00000000..535ded60 --- /dev/null +++ b/js/src/consts.ts @@ -0,0 +1,2 @@ +export const DEFAULT_TIMEOUT_MS = 60_000 // 1 minute +export const JUPYTER_PORT = 49999 diff --git a/js/src/index.ts b/js/src/index.ts index 7ac8bd62..80a23823 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,7 +1,7 @@ export * from 'e2b' -export { Sandbox, JupyterExtension } from './sandbox' - +export { Sandbox } from './sandbox' +export type { Context } from './sandbox' export type { Logs, ExecutionError, diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 2c4bcd7f..40a84688 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -1,65 +1,19 @@ -import { ConnectionConfig, Sandbox as BaseSandbox, TimeoutError } from 'e2b' +import { Sandbox as BaseSandbox } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' - -function formatRequestTimeoutError(error: unknown) { - if (error instanceof Error && error.name === 'AbortError') { - return new TimeoutError('Request timed out — the \'requestTimeoutMs\' option can be used to increase this timeout') - } - - return error -} - -function formatExecutionTimeoutError(error: unknown) { - if (error instanceof Error && error.name === 'AbortError') { - return new TimeoutError('Execution timed out — the \'timeoutMs\' option can be used to increase this timeout') - } - - return error -} - -async function* readLines(stream: ReadableStream) { - const reader = stream.getReader(); - let buffer = '' - - try { - while (true) { - const { done, value } = await reader.read(); - - if (value !== undefined) { - buffer += new TextDecoder().decode(value) - } - - if (done) { - if (buffer.length > 0) { - yield buffer - } - break - } - - let newlineIdx = -1 - - do { - newlineIdx = buffer.indexOf('\n') - if (newlineIdx !== -1) { - yield buffer.slice(0, newlineIdx) - buffer = buffer.slice(newlineIdx + 1) - } - } while (newlineIdx !== -1) - } - } finally { - reader.releaseLock() - } +import { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from "./utils"; +import { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts' +export type Context = { + id: string + language: string + cwd: string } /** * Code interpreter module for executing code in a stateful context. */ -export class JupyterExtension { - private static readonly execTimeoutMs = 300_000 - private static readonly defaultKernelID = 'default' - - constructor(private readonly url: string, private readonly connectionConfig: ConnectionConfig) { } +export class Sandbox extends BaseSandbox { + protected static override readonly defaultTemplate: string = 'code-interpreter-beta' /** * Runs the code in the specified context, if not specified, the default context is used. @@ -67,7 +21,8 @@ export class JupyterExtension { * * @param code The code to execute * @param opts Options for executing the code - * @param opts.kernelID The context ID to run the code in + * @param opts.language Language of the code. If not specified and context is not provided, the default Python context is used. + * @param opts.context The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. * @param opts.onStdout Callback for handling stdout messages * @param opts.onStderr Callback for handling stderr messages * @param opts.onResult Callback for handling the final result @@ -76,10 +31,11 @@ export class JupyterExtension { * @param opts.requestTimeoutMs Max time to wait for the request to finish * @returns Execution object */ - async execCell( + async runCode( code: string, opts?: { - kernelID?: string, + language?: string, + context?: Context, onStdout?: (output: OutputMessage) => (Promise | any), onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), @@ -88,6 +44,10 @@ export class JupyterExtension { requestTimeoutMs?: number, }, ): Promise { + if (opts?.context && opts?.language) { + throw new Error("You can provide context or language, but not both at the same time.") + } + const controller = new AbortController() const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs @@ -98,14 +58,15 @@ export class JupyterExtension { : undefined try { - const res = await fetch(`${this.url}/execute`, { + const res = await fetch(`${this.jupyterUrl}/execute`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ code, - context_id: opts?.kernelID, + context_id: opts?.context?.id, + language: opts?.language, env_vars: opts?.envs, }), signal: controller.signal, @@ -123,7 +84,7 @@ export class JupyterExtension { clearTimeout(reqTimer) - const bodyTimeout = opts?.timeoutMs ?? JupyterExtension.execTimeoutMs + const bodyTimeout = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS const bodyTimer = bodyTimeout ? setTimeout(() => { @@ -154,28 +115,28 @@ export class JupyterExtension { * Creates a new context to run code in. * * @param cwd The working directory for the context - * @param kernelName The name of the context + * @param language The name of the context * @param requestTimeoutMs Max time to wait for the request to finish * @returns The context ID */ - async createKernel({ + async createCodeContext({ cwd, - kernelName, + language, requestTimeoutMs, }: { cwd?: string, - kernelName?: string, + language?: string, requestTimeoutMs?: number, - } = {}): Promise { + } = {}): Promise { try { - const res = await fetch(`${this.url}/contexts`, { + const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ - name: kernelName, + language: language, cwd, }), keepalive: true, @@ -187,117 +148,13 @@ export class JupyterExtension { throw error } - const data = await res.json() - return data.id + return await res.json() } catch (error) { throw formatRequestTimeoutError(error) } } - /** - * Restarts the context. - * Restarting will clear all variables, imports, and other settings set during previous executions. - * - * @param kernelID The context ID to restart - * @param requestTimeoutMs Max time to wait for the request to finish - */ - async restartKernel({ - kernelID, - requestTimeoutMs, - }: { - kernelID?: string, - requestTimeoutMs?: number, - } = {}): Promise { - try { - kernelID = kernelID || JupyterExtension.defaultKernelID - const res = await fetch(`${this.url}/contexts/${kernelID}/restart`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error - } - } catch (error) { - throw formatRequestTimeoutError(error) - } + protected get jupyterUrl(): string { + return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}` } - - /** - * Shuts down the context. - * - * @param kernelID The context ID to shut down - * @param requestTimeoutMs Max time to wait for the request to finish - */ - async shutdownKernel({ - kernelID, - requestTimeoutMs, - }: { - kernelID?: string, - requestTimeoutMs?: number, - } = {}): Promise { - try { - - kernelID = kernelID || JupyterExtension.defaultKernelID - - const res = await fetch(`${this.url}/contexts/${kernelID}`, { - method: 'DELETE', - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error - } - } catch (error) { - throw formatRequestTimeoutError(error) - } - } - - /** - * Lists all available contexts. - * - * @param requestTimeoutMs Max time to wait for the request to finish - * @returns List of context IDs and names - */ - async listKernels({ - requestTimeoutMs, - }: { - requestTimeoutMs?: number, - } = {}): Promise<{ kernelID: string, name: string }[]> { - try { - const res = await fetch(`${this.url}/contexts`, { - keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), - }) - - const error = await extractError(res) - if (error) { - throw error - } - - return (await res.json()).map((kernel: any) => ({ kernelID: kernel.id, name: kernel.name })) - } catch (error) { - throw formatRequestTimeoutError(error) - } - } -} - -/** - * Code interpreter module for executing code in a stateful context. - */ -export class Sandbox extends BaseSandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-beta' - protected static readonly jupyterPort = 49999 - - readonly notebook = new JupyterExtension( - `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(Sandbox.jupyterPort)}`, - this.connectionConfig, - ) } diff --git a/js/src/utils.ts b/js/src/utils.ts new file mode 100644 index 00000000..4910d5de --- /dev/null +++ b/js/src/utils.ts @@ -0,0 +1,51 @@ +import { TimeoutError } from 'e2b' + +export function formatRequestTimeoutError(error: unknown) { + if (error instanceof Error && error.name === 'AbortError') { + return new TimeoutError('Request timed out — the \'requestTimeoutMs\' option can be used to increase this timeout') + } + + return error +} + +export function formatExecutionTimeoutError(error: unknown) { + if (error instanceof Error && error.name === 'AbortError') { + return new TimeoutError('Execution timed out — the \'timeoutMs\' option can be used to increase this timeout') + } + + return error +} + +export async function* readLines(stream: ReadableStream) { + const reader = stream.getReader(); + let buffer = '' + + try { + while (true) { + const { done, value } = await reader.read(); + + if (value !== undefined) { + buffer += new TextDecoder().decode(value) + } + + if (done) { + if (buffer.length > 0) { + yield buffer + } + break + } + + let newlineIdx = -1 + + do { + newlineIdx = buffer.indexOf('\n') + if (newlineIdx !== -1) { + yield buffer.slice(0, newlineIdx) + buffer = buffer.slice(newlineIdx + 1) + } + } while (newlineIdx !== -1) + } + } finally { + reader.releaseLock() + } +} diff --git a/js/tests/bash.test.ts b/js/tests/bash.test.ts index ff20756a..7734499f 100644 --- a/js/tests/bash.test.ts +++ b/js/tests/bash.test.ts @@ -4,7 +4,7 @@ import { isDebug, sandboxTest } from './setup' // Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. sandboxTest.skipIf(isDebug)('bash', async ({ sandbox }) => { - const result = await sandbox.notebook.execCell('!pwd') + const result = await sandbox.runCode('!pwd') expect(result.logs.stdout.join().trim()).toEqual('/home/user') }) diff --git a/js/tests/basic.test.ts b/js/tests/basic.test.ts index eb5a8650..c0360d02 100644 --- a/js/tests/basic.test.ts +++ b/js/tests/basic.test.ts @@ -3,7 +3,7 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('basic', async ({ sandbox }) => { - const result = await sandbox.notebook.execCell('x =1; x') + const result = await sandbox.runCode('x =1; x') expect(result.text).toEqual('1') }) diff --git a/js/tests/benchmarking.js b/js/tests/benchmarking.js index e94792a9..f7ba5bbf 100644 --- a/js/tests/benchmarking.js +++ b/js/tests/benchmarking.js @@ -15,14 +15,14 @@ async function main() { createSandboxTime += new Date() - startTime startTime = new Date() - await sandbox.notebook.execCell('x = 1') + await sandbox.runCode('x = 1') fistExecTime += new Date() - startTime startTime = new Date() - const result = await sandbox.notebook.execCell('x+=1; x') + const result = await sandbox.runCode('x+=1; x') secondExecTime += new Date() - startTime - await sandbox.close() + await sandbox.kill() } console.log('Average create sandbox time:', createSandboxTime / iterations) console.log('Average first exec time:', fistExecTime / iterations) diff --git a/js/tests/data.test.ts b/js/tests/data.test.ts index aede4587..b18eeedc 100644 --- a/js/tests/data.test.ts +++ b/js/tests/data.test.ts @@ -3,7 +3,7 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('get data', async ({ sandbox }) => { - const execution = await sandbox.notebook.execCell(` + const execution = await sandbox.runCode(` import pandas as pd pd.DataFrame({"a": [1, 2, 3]}) `) diff --git a/js/tests/displayData.test.ts b/js/tests/displayData.test.ts index 6c145c0b..5e4684d1 100644 --- a/js/tests/displayData.test.ts +++ b/js/tests/displayData.test.ts @@ -4,7 +4,7 @@ import { sandboxTest } from './setup' sandboxTest('display data', async ({ sandbox }) => { // plot random graph - const result = await sandbox.notebook.execCell(` + const result = await sandbox.runCode(` import matplotlib.pyplot as plt import numpy as np diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index 73e3c9e3..ad7d8fa2 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -8,7 +8,7 @@ sandboxTest.skipIf(isDebug)('env vars', async () => { const sandbox = await Sandbox.create({ envs: { TEST_ENV_VAR: 'supertest' }, }) - const result = await sandbox.notebook.execCell( + const result = await sandbox.runCode( `import os; x = os.getenv('TEST_ENV_VAR'); x` ) @@ -16,7 +16,7 @@ sandboxTest.skipIf(isDebug)('env vars', async () => { }) sandboxTest('env vars on sandbox', async ({ sandbox }) => { - const result = await sandbox.notebook.execCell( + const result = await sandbox.runCode( "import os; os.getenv('FOO')", { envs: { FOO: 'bar' } } ) @@ -28,28 +28,28 @@ sandboxTest('env vars on sandbox override', async () => { const sandbox = await Sandbox.create({ envs: { FOO: 'bar', SBX: 'value' }, }) - await sandbox.notebook.execCell( + await sandbox.runCode( "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'js_runtime'" ) - const result = await sandbox.notebook.execCell( + const result = await sandbox.runCode( "import os; os.getenv('FOO')", { envs: { FOO: 'baz' } } ) expect(result.results[0].text.trim()).toEqual('baz') - const result2 = await sandbox.notebook.execCell( + const result2 = await sandbox.runCode( "import os; os.getenv('RUNTIME_ENV')" ) expect(result2.results[0].text.trim()).toEqual('js_runtime') if (!isDebug) { - const result3 = await sandbox.notebook.execCell( + const result3 = await sandbox.runCode( "import os; os.getenv('SBX')" ) expect(result3.results[0].text.trim()).toEqual('value') } - const result4 = await sandbox.notebook.execCell("import os; os.getenv('FOO')") + const result4 = await sandbox.runCode("import os; os.getenv('FOO')") expect(result4.results[0].text.trim()).toEqual('bar') }) diff --git a/js/tests/executionCount.test.ts b/js/tests/executionCount.test.ts index 7baef60e..750aa915 100644 --- a/js/tests/executionCount.test.ts +++ b/js/tests/executionCount.test.ts @@ -4,8 +4,8 @@ import { isDebug, sandboxTest } from './setup' // Skip this test if we are running in debug mode — we don't create new sandbox for each test so the execution number is not reset. sandboxTest.skipIf(isDebug)('execution count', async ({ sandbox }) => { - await sandbox.notebook.execCell('!pwd') - const result = await sandbox.notebook.execCell('!pwd') + await sandbox.runCode('!pwd') + const result = await sandbox.runCode('!pwd') expect(result.executionCount).toEqual(2) }) diff --git a/js/tests/graphs/bar.test.ts b/js/tests/graphs/bar.test.ts index c812906f..d4f56587 100644 --- a/js/tests/graphs/bar.test.ts +++ b/js/tests/graphs/bar.test.ts @@ -22,7 +22,7 @@ plt.title('Book Sales by Authors') plt.tight_layout() plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/boxAndWhisker.test.ts b/js/tests/graphs/boxAndWhisker.test.ts index 80398965..802cae49 100644 --- a/js/tests/graphs/boxAndWhisker.test.ts +++ b/js/tests/graphs/boxAndWhisker.test.ts @@ -35,7 +35,7 @@ ax.legend() plt.tight_layout() plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/line.test.ts b/js/tests/graphs/line.test.ts index e9ed1714..69b15d6b 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/graphs/line.test.ts @@ -29,7 +29,7 @@ plt.title('Plot of sin(x) and cos(x)') # Display the plot plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/log.test.ts b/js/tests/graphs/log.test.ts index 6572dc72..f2a1e33c 100644 --- a/js/tests/graphs/log.test.ts +++ b/js/tests/graphs/log.test.ts @@ -29,7 +29,7 @@ plt.grid(True) plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() expect(graph.type).toBe('line') diff --git a/js/tests/graphs/pie.test.ts b/js/tests/graphs/pie.test.ts index 9286a026..72830243 100644 --- a/js/tests/graphs/pie.test.ts +++ b/js/tests/graphs/pie.test.ts @@ -27,7 +27,7 @@ plt.title('Will I wake up early tomorrow?') # Step 5: Show the plot plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/scales.test.ts b/js/tests/graphs/scales.test.ts index 8599e34f..dd89fe85 100644 --- a/js/tests/graphs/scales.test.ts +++ b/js/tests/graphs/scales.test.ts @@ -17,7 +17,7 @@ sandboxTest('datetime scale', async ({ sandbox }) => { plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() @@ -41,7 +41,7 @@ sandboxTest('categorical scale', async ({ sandbox }) => { plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeTruthy() diff --git a/js/tests/graphs/scatter.test.ts b/js/tests/graphs/scatter.test.ts index b9b68b18..7708e43b 100644 --- a/js/tests/graphs/scatter.test.ts +++ b/js/tests/graphs/scatter.test.ts @@ -22,7 +22,7 @@ plt.scatter(x2, y2, c='red', label='Dataset 2') plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/supergraph.test.ts b/js/tests/graphs/supergraph.test.ts index fbaed47d..74426bb3 100644 --- a/js/tests/graphs/supergraph.test.ts +++ b/js/tests/graphs/supergraph.test.ts @@ -32,7 +32,7 @@ axs[1].grid(True) plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/graphs/unknown.test.ts b/js/tests/graphs/unknown.test.ts index 70939c8b..842d05ec 100644 --- a/js/tests/graphs/unknown.test.ts +++ b/js/tests/graphs/unknown.test.ts @@ -28,7 +28,7 @@ plt.title('Two Concentric Circles') # Show the plot plt.show() ` - const result = await sandbox.notebook.execCell(code) + const result = await sandbox.runCode(code) const graph = result.results[0].graph expect(graph).toBeDefined() diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 99518130..8c8e3096 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -1,46 +1,15 @@ import { expect } from 'vitest' -import { isDebug, sandboxTest } from './setup' +import { sandboxTest } from './setup' sandboxTest('create new kernel', async ({ sandbox }) => { - await sandbox.notebook.createKernel() + await sandbox.createCodeContext() }) sandboxTest('independence of kernels', async ({ sandbox }) => { - await sandbox.notebook.execCell('x = 1') - const kernelID = await sandbox.notebook.createKernel() - const output = await sandbox.notebook.execCell('x', { kernelID }) + await sandbox.runCode('x = 1') + const context = await sandbox.createCodeContext() + const output = await sandbox.runCode('x', { context }) expect(output.error!.value).toEqual("name 'x' is not defined") }) - -sandboxTest('restart kernel', async ({ sandbox }) => { - await sandbox.notebook.execCell('x = 1') - await sandbox.notebook.restartKernel() - - const output = await sandbox.notebook.execCell('x') - - expect(output.error!.value).toEqual("name 'x' is not defined") -}) - -// Skip this test if we are running in debug mode — we don't know how many kernels are in the local debug testing container. -sandboxTest.skipIf(isDebug)('list kernels', async ({ sandbox }) => { - let kernels = await sandbox.notebook.listKernels() - expect(kernels.length).toEqual(1) - - const kernelID = await sandbox.notebook.createKernel() - kernels = await sandbox.notebook.listKernels() - expect(kernels.map((kernel) => kernel.kernelID)).toContain(kernelID) - expect(kernels.length).toEqual(2) -}) - -// Skip this test if we are running in debug mode — we don't know how many kernels are in the local debug testing container. -sandboxTest.skipIf(isDebug)('shutdown kernel', async ({ sandbox }) => { - let kernels = await sandbox.notebook.listKernels() - expect(kernels.length).toEqual(1) - - const kernelID = await sandbox.notebook.shutdownKernel() - kernels = await sandbox.notebook.listKernels() - expect(kernels).not.toContain(kernelID) - expect(kernels.length).toEqual(0) -}) diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index 0f97e450..c80e3cf8 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -6,7 +6,7 @@ import { sandboxTest } from './setup' sandboxTest('reconnect', async ({ sandbox }) => { sandbox = await Sandbox.connect(sandbox.sandboxId) - const result = await sandbox.notebook.execCell('x =1; x') + const result = await sandbox.runCode('x =1; x') expect(result.text).toEqual('1') }) diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts index 2b00c005..1497cdb6 100644 --- a/js/tests/runtimes/bun/run.test.ts +++ b/js/tests/runtimes/bun/run.test.ts @@ -5,7 +5,7 @@ import { Sandbox } from '../../../src' test('Bun test', async () => { const sbx = await Sandbox.create({ timeoutMs: 5_000 }) try { - const result = await sbx.notebook.execCell('print("Hello, World!")') + const result = await sbx.runCode('print("Hello, World!")') expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') } finally { await sbx.kill() diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index 19601f57..1df66a3a 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -8,7 +8,7 @@ import { Sandbox } from '../../../dist/index.mjs' Deno.test('Deno test', async () => { const sbx = await Sandbox.create({ timeoutMs: 5_000 }) try { - const result = await sbx.notebook.execCell('print("Hello, World!")') + const result = await sbx.execCell('print("Hello, World!")') assertEquals(result.logs.stdout.join(''), 'Hello, World!\n') } finally { await sbx.kill() diff --git a/js/tests/statefulness.test.ts b/js/tests/statefulness.test.ts index 8989f22b..fd5a7e4e 100644 --- a/js/tests/statefulness.test.ts +++ b/js/tests/statefulness.test.ts @@ -4,9 +4,9 @@ import { isDebug, sandboxTest } from './setup' // Skip this test if we are running in debug mode — the execution is persisted between all tests so the result is not reset. sandboxTest.skipIf(isDebug)('statefulness', async ({ sandbox }) => { - await sandbox.notebook.execCell('x = 1') + await sandbox.runCode('x = 1') - const result = await sandbox.notebook.execCell('x += 1; x') + const result = await sandbox.runCode('x += 1; x') expect(result.text).toEqual('2') }) diff --git a/js/tests/streaming.test.ts b/js/tests/streaming.test.ts index ac2b8009..bbf76f81 100644 --- a/js/tests/streaming.test.ts +++ b/js/tests/streaming.test.ts @@ -6,7 +6,7 @@ import { sandboxTest } from './setup' sandboxTest('streaming output', async ({ sandbox }) => { const out: OutputMessage[] = [] - await sandbox.notebook.execCell('print(1)', { + await sandbox.runCode('print(1)', { onStdout: (msg) => out.push(msg), }) @@ -16,7 +16,7 @@ sandboxTest('streaming output', async ({ sandbox }) => { sandboxTest('streaming error', async ({ sandbox }) => { const out: OutputMessage[] = [] - await sandbox.notebook.execCell('import sys;print(1, file=sys.stderr)', { + await sandbox.runCode('import sys;print(1, file=sys.stderr)', { onStderr: (msg) => out.push(msg), }) @@ -38,7 +38,7 @@ sandboxTest('streaming result', async ({ sandbox }) => { x ` - await sandbox.notebook.execCell(code, { + await sandbox.runCode(code, { onResult: (result) => out.push(result), }) diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index b83170d6..7562f51a 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -2,6 +2,7 @@ from .code_interpreter_sync import Sandbox from .code_interpreter_async import AsyncSandbox from .models import ( + Context, Execution, ExecutionError, Result, diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 071b8a24..42cd070a 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -59,7 +59,7 @@ async def run_code( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param language: Language of the code. If not specified and context_id is not provided, the default Python context is used. + :param language: Language of the code. If not specified and context is not provided, the default Python context is used. :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages @@ -72,7 +72,9 @@ async def run_code( logger.debug(f"Executing code {code}") if context and language: - raise ValueError("Only one of context_id or language can be provided") + raise ValueError( + "You can provide context or language, but not both at the same time." + ) timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) request_timeout = request_timeout or self._connection_config.request_timeout diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index a1894121..7cf76e5a 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -55,7 +55,7 @@ def run_code( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param language: Language of the code. If not specified and context_id is not provided, the default Python context is used. + :param language: Language of the code. If not specified and context is not provided, the default Python context is used. :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages @@ -68,7 +68,9 @@ def run_code( logger.debug(f"Executing code {code}") if language and context: - raise ValueError("Only one of context_id or language can be provided") + raise ValueError( + "You can provide context or language, but not both at the same time." + ) timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) request_timeout = request_timeout or self._connection_config.request_timeout diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 08117365..f55cf99d 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -421,7 +421,7 @@ def parse_output( class Context: id: str language: str - cwd: Optional[str] = None + cwd: str def __init__(self, context_id: str, language: str, cwd: str, **kwargs): self.id = context_id diff --git a/template/README.md b/template/README.md index d860b118..4d00d588 100644 --- a/template/README.md +++ b/template/README.md @@ -35,9 +35,11 @@ If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled **JavaScript/TypeScript** + ```js - import { Sandbox } from '@e2b/code-interpreter' - const sandbox = await Sandbox.create({ template: 'your-custom-sandbox-name' }) - const execution = await sandbox.execCell('print("hello")') - await sandbox.close() + import {Sandbox} from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create({template: 'your-custom-sandbox-name'}) +const execution = await sandbox.runCode('print("hello")') +await sandbox.kill() ``` From 154c14f7ca25e4962552300c4e530b22f53b6e4d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 17:44:06 -0700 Subject: [PATCH 368/722] Fix test names --- js/tests/runtimes/deno/run.test.ts | 2 +- python/tests/async/test_async_env_vars.py | 2 +- python/tests/sync/test_env_vars.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index 1df66a3a..34343294 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -8,7 +8,7 @@ import { Sandbox } from '../../../dist/index.mjs' Deno.test('Deno test', async () => { const sbx = await Sandbox.create({ timeoutMs: 5_000 }) try { - const result = await sbx.execCell('print("Hello, World!")') + const result = await sbx.runCode('print("Hello, World!")') assertEquals(result.logs.stdout.join(''), 'Hello, World!\n') } finally { await sbx.kill() diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index aa317fc9..f587dcb6 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -11,7 +11,7 @@ async def test_env_vars_sandbox(): await sbx.kill() -async def test_env_vars_in_exec_cell(async_sandbox: AsyncSandbox): +async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( "import os; os.getenv('FOO')", envs={"FOO": "bar"} ) diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 2cf0dc5b..4d56b681 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -11,7 +11,7 @@ async def test_env_vars_sandbox(): sbx.kill() -async def test_env_vars_in_exec_cell(sandbox: Sandbox): +async def test_env_vars_in_run_code(sandbox: Sandbox): result = sandbox.run_code("import os; os.getenv('FOO')", envs={"FOO": "bar"}) assert result.text == "bar" From e26daa335690c17775938715a0c062613ec0046a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 17:52:50 -0700 Subject: [PATCH 369/722] Improve docstrings --- js/src/sandbox.ts | 4 ++-- python/e2b_code_interpreter/code_interpreter_async.py | 4 ++-- python/e2b_code_interpreter/code_interpreter_sync.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 40a84688..c88a8732 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -21,8 +21,8 @@ export class Sandbox extends BaseSandbox { * * @param code The code to execute * @param opts Options for executing the code - * @param opts.language Language of the code. If not specified and context is not provided, the default Python context is used. - * @param opts.context The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. + * @param opts.language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. + * @param opts.context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. * @param opts.onStdout Callback for handling stdout messages * @param opts.onStderr Callback for handling stderr messages * @param opts.onResult Callback for handling the final result diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 42cd070a..17a4438a 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -59,8 +59,8 @@ async def run_code( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param language: Language of the code. If not specified and context is not provided, the default Python context is used. - :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. + :param language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. + :param context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 7cf76e5a..3edc9f61 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -55,8 +55,8 @@ def run_code( You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute - :param language: Language of the code. If not specified and context is not provided, the default Python context is used. - :param context: The context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with language. + :param language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. + :param context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object From b441b05a0b6320e7f8439eb64b793368a7c183bb Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 18:10:05 -0700 Subject: [PATCH 370/722] Add tests --- js/tests/defaultKernels.test.ts | 9 +++++++++ python/e2b_code_interpreter/code_interpreter_async.py | 1 + python/tests/async/test_async_default_kernels.py | 8 ++++++++ python/tests/sync/test_default_kernels.py | 9 --------- template/server/api/models/execution_request.py | 2 +- 5 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 js/tests/defaultKernels.test.ts create mode 100644 python/tests/async/test_async_default_kernels.py diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts new file mode 100644 index 00000000..4c0779d1 --- /dev/null +++ b/js/tests/defaultKernels.test.ts @@ -0,0 +1,9 @@ +import { expect } from 'vitest' + +import { sandboxTest } from './setup' + +sandboxTest('test js kernel', async ({ sandbox }) => { + const output = await sandbox.runCode('console.log("Hello World!")', { language: 'js' }) + console.log(output) + expect(output.logs.stdout).toEqual(['Hello World!\n']) +}) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 17a4438a..a32a1445 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -87,6 +87,7 @@ async def run_code( json={ "code": code, "context_id": context_id, + "language": language, "env_vars": envs, }, timeout=(request_timeout, timeout, request_timeout, request_timeout), diff --git a/python/tests/async/test_async_default_kernels.py b/python/tests/async/test_async_default_kernels.py new file mode 100644 index 00000000..a632bda6 --- /dev/null +++ b/python/tests/async/test_async_default_kernels.py @@ -0,0 +1,8 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def test_js_kernel(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code( + "console.log('Hello, World!')", language="js" + ) + assert execution.logs.stdout == ["Hello, World!\n"] diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index 1176aa9c..cb21cdc5 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -4,12 +4,3 @@ def test_js_kernel(sandbox: Sandbox): execution = sandbox.run_code("console.log('Hello, World!')", language="js") assert execution.logs.stdout == ["Hello, World!\n"] - - -def test_independence_of_kernels(sandbox: Sandbox): - context = sandbox.create_code_context() - sandbox.run_code("x = 1") - - r = sandbox.run_code("x", context=context) - assert r.error is not None - assert r.error.value == "name 'x' is not defined" diff --git a/template/server/api/models/execution_request.py b/template/server/api/models/execution_request.py index 54824af6..bb691e9e 100644 --- a/template/server/api/models/execution_request.py +++ b/template/server/api/models/execution_request.py @@ -7,7 +7,7 @@ class ExecutionRequest(BaseModel): code: StrictStr = Field(description="Code to be executed") - context_id: Optional[StrictStr] = Field(default="default", description="Context ID") + context_id: Optional[StrictStr] = Field(default=None, description="Context ID") language: Optional[StrictStr] = Field( default=None, description="Language of the code" ) From 161711dc016a7dd4370fdedcca008c53e77657d7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 18:26:08 -0700 Subject: [PATCH 371/722] Improve errors --- js/src/sandbox.ts | 4 ++-- js/tests/kernels.test.ts | 5 +++++ python/e2b_code_interpreter/code_interpreter_async.py | 8 ++++++-- python/e2b_code_interpreter/code_interpreter_sync.py | 4 ++-- python/tests/async/test_async_kernels.py | 11 +++++++++++ python/tests/sync/test_kernels.py | 9 +++++++++ 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index c88a8732..51e915b1 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -1,4 +1,4 @@ -import { Sandbox as BaseSandbox } from 'e2b' +import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b' import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' import { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from "./utils"; @@ -45,7 +45,7 @@ export class Sandbox extends BaseSandbox { }, ): Promise { if (opts?.context && opts?.language) { - throw new Error("You can provide context or language, but not both at the same time.") + throw new InvalidArgumentError("You can provide context or language, but not both at the same time.") } const controller = new AbortController() diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 8c8e3096..810a9c23 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -13,3 +13,8 @@ sandboxTest('independence of kernels', async ({ sandbox }) => { expect(output.error!.value).toEqual("name 'x' is not defined") }) + +sandboxTest('pass context and language', async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + await expect(sandbox.runCode({context, language: 'python'})).rejects.toThrowError() +}) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index a32a1445..b99c265d 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -4,7 +4,11 @@ from typing import Optional, Dict from httpx import AsyncClient -from e2b import AsyncSandbox as BaseAsyncSandbox, ConnectionConfig +from e2b import ( + AsyncSandbox as BaseAsyncSandbox, + ConnectionConfig, + InvalidArgumentException, +) from e2b_code_interpreter.constants import ( DEFAULT_TEMPLATE, @@ -72,7 +76,7 @@ async def run_code( logger.debug(f"Executing code {code}") if context and language: - raise ValueError( + raise InvalidArgumentException( "You can provide context or language, but not both at the same time." ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 3edc9f61..2df46bf0 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -3,7 +3,7 @@ from typing import Optional, Dict from httpx import Client -from e2b import Sandbox as BaseSandbox +from e2b import Sandbox as BaseSandbox, InvalidArgumentException from e2b_code_interpreter.constants import ( DEFAULT_TEMPLATE, @@ -68,7 +68,7 @@ def run_code( logger.debug(f"Executing code {code}") if language and context: - raise ValueError( + raise InvalidArgumentException( "You can provide context or language, but not both at the same time." ) diff --git a/python/tests/async/test_async_kernels.py b/python/tests/async/test_async_kernels.py index b8950994..ce88967b 100644 --- a/python/tests/async/test_async_kernels.py +++ b/python/tests/async/test_async_kernels.py @@ -1,3 +1,6 @@ +import pytest +from e2b import InvalidArgumentException + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox @@ -12,3 +15,11 @@ async def test_independence_of_kernels(async_sandbox: AsyncSandbox): r = await async_sandbox.run_code("x", context=context) assert r.error is not None assert r.error.value == "name 'x' is not defined" + + +async def test_pass_context_and_language(async_sandbox: AsyncSandbox): + context = await async_sandbox.create_code_context(language="python") + with pytest.raises(InvalidArgumentException): + await async_sandbox.run_code( + "console.log('Hello, World!')", language="js", context=context + ) diff --git a/python/tests/sync/test_kernels.py b/python/tests/sync/test_kernels.py index 221413fe..17d6430f 100644 --- a/python/tests/sync/test_kernels.py +++ b/python/tests/sync/test_kernels.py @@ -1,3 +1,6 @@ +import pytest +from e2b import InvalidArgumentException + from e2b_code_interpreter.code_interpreter_sync import Sandbox @@ -12,3 +15,9 @@ def test_independence_of_kernels(sandbox: Sandbox): r = sandbox.run_code("x", context=context) assert r.error is not None assert r.error.value == "name 'x' is not defined" + + +def test_pass_context_and_language(sandbox: Sandbox): + context = sandbox.create_code_context(language="python") + with pytest.raises(InvalidArgumentException): + sandbox.run_code("console.log('Hello, World!')", language="js", context=context) From d4d71f18853940e124a4dfe1d71f126149c93451 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 19:22:39 -0700 Subject: [PATCH 372/722] Improve errors --- template/server/contexts.py | 12 ++++++------ template/server/main.py | 27 ++++++++++++++------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/template/server/contexts.py b/template/server/contexts.py index 2ae8e583..87b8cad5 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -3,7 +3,7 @@ from typing import Optional from api.models.context import Context -from fastapi import HTTPException +from fastapi.responses import PlainTextResponse from consts import JUPYTER_BASE_URL from errors import ExecutionError @@ -36,9 +36,9 @@ async def create_context(client, websockets: dict, language: str, cwd: str) -> C response = await client.post(f"{JUPYTER_BASE_URL}/api/sessions", json=data) if not response.is_success: - raise HTTPException( + return PlainTextResponse( + f"Failed to create context: {response.text}", status_code=500, - detail=f"Failed to create context: {response.text}", ) session_data = response.json() @@ -55,9 +55,9 @@ async def create_context(client, websockets: dict, language: str, cwd: str) -> C try: await ws.change_current_directory(cwd) except ExecutionError as e: - raise HTTPException( + return PlainTextResponse( + "Failed to set working directory", status_code=500, - detail="Failed to set working directory", - ) from e + ) return Context(language=language, id=context_id, cwd=cwd) diff --git a/template/server/main.py b/template/server/main.py index 465425fe..ce06a93c 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -5,7 +5,8 @@ from typing import Dict, Union, Literal, List from contextlib import asynccontextmanager -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI +from fastapi.responses import PlainTextResponse from api.models.context import Context from api.models.create_context import CreateContext @@ -73,9 +74,9 @@ async def post_execute(request: ExecutionRequest): logger.info(f"Executing code: {request.code}") if request.context_id and request.language: - raise HTTPException( + return PlainTextResponse( + "Only one of context_id or language can be provided", status_code=400, - detail="Only one of context_id or language can be provided", ) context_id = None @@ -96,9 +97,9 @@ async def post_execute(request: ExecutionRequest): ws = websockets["default"] if not ws: - raise HTTPException( + return PlainTextResponse( + f"Context {request.context_id} not found", status_code=404, - detail=f"Context {request.context_id} not found", ) return StreamingListJsonResponse( @@ -138,9 +139,9 @@ async def restart_context(context_id: str) -> None: ws = websockets.get(context_id, None) if not ws: - raise HTTPException( + return PlainTextResponse( + f"Context {context_id} not found", status_code=404, - detail=f"Context {context_id} not found", ) session_id = ws.session_id @@ -151,9 +152,9 @@ async def restart_context(context_id: str) -> None: f"{JUPYTER_BASE_URL}/api/kernels/{ws.context_id}/restart" ) if not response.is_success: - raise HTTPException( + return PlainTextResponse( + f"Failed to restart context {context_id}", status_code=500, - detail=f"Failed to restart context {context_id}", ) ws = ContextWebSocket( @@ -174,9 +175,9 @@ async def remove_context(context_id: str) -> None: ws = websockets.get(context_id, None) if not ws: - raise HTTPException( + return PlainTextResponse( + f"Context {context_id} not found", status_code=404, - detail=f"Context {context_id} not found", ) try: @@ -186,9 +187,9 @@ async def remove_context(context_id: str) -> None: response = await client.delete(f"{JUPYTER_BASE_URL}/api/kernels/{ws.context_id}") if not response.is_success: - raise HTTPException( + return PlainTextResponse( + f"Failed to remove context {context_id}", status_code=500, - detail=f"Failed to remove context {context_id}", ) del websockets[context_id] From 4913342999d714dd957654293842a7fd762b0521 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 19:31:11 -0700 Subject: [PATCH 373/722] Fix url --- template/server/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/template/server/main.py b/template/server/main.py index ce06a93c..96e0b856 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -11,6 +11,7 @@ from api.models.context import Context from api.models.create_context import CreateContext from api.models.execution_request import ExecutionRequest +from consts import JUPYTER_BASE_URL from contexts import create_context, normalize_language from messaging import ContextWebSocket from stream import StreamingListJsonResponse From 8aadc4c9d731b62a1f49dcc9ed7df9bf8b513158 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 14 Oct 2024 20:36:31 -0700 Subject: [PATCH 374/722] Add overloads --- js/src/sandbox.ts | 42 ++++++++++++++++++- .../code_interpreter_async.py | 30 ++++++++++++- .../code_interpreter_sync.py | 31 +++++++++++++- 3 files changed, 97 insertions(+), 6 deletions(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 51e915b1..4a6d74ad 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -16,13 +16,39 @@ export class Sandbox extends BaseSandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-beta' /** + * Run the code for the specified language. If no language is specified, Python is used. + * You can reference previously defined variables, imports, and functions in the code. + * + * @param code The code to execute + * @param opts Options for executing the code + * @param opts.language Based on the value, a default context for the language is used. If not defined, the default Python context is used. + * @param opts.onStdout Callback for handling stdout messages + * @param opts.onStderr Callback for handling stderr messages + * @param opts.onResult Callback for handling the final result + * @param opts.envs Environment variables to set for the execution + * @param opts.timeoutMs Max time to wait for the execution to finish + * @param opts.requestTimeoutMs Max time to wait for the request to finish + * @returns Execution object + */ +async runCode( + code: string, + opts?: { + language?: string, + onStdout?: (output: OutputMessage) => (Promise | any), + onStderr?: (output: OutputMessage) => (Promise | any), + onResult?: (data: Result) => (Promise | any), + envs?: Record, + timeoutMs?: number, + requestTimeoutMs?: number, + }, + ): Promise + /** * Runs the code in the specified context, if not specified, the default context is used. * You can reference previously defined variables, imports, and functions in the code. * * @param code The code to execute * @param opts Options for executing the code - * @param opts.language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. - * @param opts.context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. + * @param opts.context Concrete context to run the code in. If not specified, the default Python context is used. * @param opts.onStdout Callback for handling stdout messages * @param opts.onStderr Callback for handling stderr messages * @param opts.onResult Callback for handling the final result @@ -31,6 +57,18 @@ export class Sandbox extends BaseSandbox { * @param opts.requestTimeoutMs Max time to wait for the request to finish * @returns Execution object */ + async runCode( + code: string, + opts?: { + context?: Context, + onStdout?: (output: OutputMessage) => (Promise | any), + onStderr?: (output: OutputMessage) => (Promise | any), + onResult?: (data: Result) => (Promise | any), + envs?: Record, + timeoutMs?: number, + requestTimeoutMs?: number, + }, + ): Promise async runCode( code: string, opts?: { diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index b99c265d..750b38cc 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict +from typing import Optional, Dict, overload from httpx import AsyncClient from e2b import ( @@ -46,6 +46,32 @@ def _jupyter_url(self) -> str: def _client(self) -> AsyncClient: return AsyncClient(transport=self._transport) + @overload + async def run_code( + self, + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: ... + + @overload + async def run_code( + self, + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: ... + async def run_code( self, code: str, @@ -59,7 +85,7 @@ async def run_code( request_timeout: Optional[float] = None, ) -> Execution: """ - Runs the code in the specified context, if not specified, the default context is used. + Runs the code in the specified language/context, if not specified, the default context is used. You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 2df46bf0..b32ff91f 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict +from typing import Optional, Dict, overload from httpx import Client from e2b import Sandbox as BaseSandbox, InvalidArgumentException @@ -38,6 +38,32 @@ def _jupyter_url(self) -> str: def _client(self) -> Client: return Client(transport=self._transport) + @overload + def run_code( + self, + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: ... + + @overload + def run_code( + self, + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: ... + def run_code( self, code: str, @@ -51,7 +77,7 @@ def run_code( request_timeout: Optional[float] = None, ) -> Execution: """ - Runs the code in the specified context, if not specified, the default context is used. + Runs the code in the specified language/context, if not specified, the default context is used. You can reference previously defined variables, imports, and functions in the code. :param code: The code to execute @@ -65,6 +91,7 @@ def run_code( :param request_timeout: Max time to wait for the request to finish :return: Execution object """ + logger.debug(f"Executing code {code}") if language and context: From 4e6e0d488543e265297479758eb47565585924fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 15 Oct 2024 05:32:34 +0000 Subject: [PATCH 375/722] [skip ci] Release new versions --- js/package.json | 2 +- python/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index ac9394c6..05c508b8 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.71", + "version": "0.0.9-beta.72", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/pyproject.toml b/python/pyproject.toml index 200f6627..25ce3597 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b46" +version = "0.0.11b47" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From b26f575d6f580b3bae68062f9eec3894a632e2eb Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 10:46:41 -0700 Subject: [PATCH 376/722] Fix pnpm version --- .npmrc | 3 ++- package.json | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index 700c82c9..4e82b99c 100644 --- a/.npmrc +++ b/.npmrc @@ -2,4 +2,5 @@ enable-pre-post-scripts=true auto-install-peers=true exclude-links-from-lockfile=true prefer-workspace-packages=false -link-workspace-packages=false \ No newline at end of file +link-workspace-packages=false +engine-strict=true diff --git a/package.json b/package.json index a6ee8a34..8a5108bd 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,8 @@ "@changesets/cli": "^2.26.2", "@changesets/read": "^0.5.9", "changeset": "^0.2.6" + }, + "engines": { + "pnpm": ">=9.0.0 <10" } -} \ No newline at end of file +} From ce0f1a2ba2ed7768f2f72eee5655ba3d6ef82291 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 11:02:04 -0700 Subject: [PATCH 377/722] Fix bun version --- .github/workflows/js_tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 627fa640..f8ed2d6b 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -52,6 +52,8 @@ jobs: - name: Install Bun uses: oven-sh/setup-bun@v2 + with: + version: 1.1.21 - name: Run Bun tests run: pnpm test:bun @@ -67,4 +69,3 @@ jobs: run: pnpm test:deno env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} - \ No newline at end of file From d1f419c977887dc519262c6dd971c51dd7ca5c64 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 11:11:22 -0700 Subject: [PATCH 378/722] Improve release pipelines --- .github/workflows/js_tests.yml | 2 +- .github/workflows/pr.yml | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index f8ed2d6b..e2ab1110 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -53,7 +53,7 @@ jobs: - name: Install Bun uses: oven-sh/setup-bun@v2 with: - version: 1.1.21 + version: 1.1.x - name: Run Bun tests run: pnpm test:bun diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4eb9e701..3de134d8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -42,15 +42,13 @@ jobs: python-tests: needs: [ changes ] name: Tests Python package - # If the PR does not have the label 'python-rc', the code is already tested in the prerelease workflow - if: needs.changes.outputs.python == 'true' && !contains( github.event.pull_request.labels.*.name, 'python-rc') + if: needs.changes.outputs.python == 'true' uses: ./.github/workflows/python_tests.yml secrets: inherit js-tests: needs: [ changes ] name: Tests JS package - # If the PR does not have the label 'js-rc', the code is already tested in the prerelease workflow - if: needs.changes.outputs.js == 'true' && !contains( github.event.pull_request.labels.*.name, 'js-rc') + if: needs.changes.outputs.js == 'true' uses: ./.github/workflows/js_tests.yml secrets: inherit From 8666df58166f301f4696a60883b759bf4df212f3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 11:34:30 -0700 Subject: [PATCH 379/722] Rename to chart --- .github/workflows/template.yml | 2 - js/README.md | 2 +- js/src/{graphs.ts => charts.ts} | 86 +++++++------- js/src/index.ts | 20 ++-- js/src/messaging.ts | 10 +- js/tests/{graphs => charts}/bar.test.ts | 22 ++-- .../{graphs => charts}/boxAndWhisker.test.ts | 18 +-- js/tests/{graphs => charts}/line.test.ts | 32 ++--- js/tests/{graphs => charts}/log.test.ts | 32 ++--- js/tests/{graphs => charts}/pie.test.ts | 12 +- js/tests/{graphs => charts}/scales.test.ts | 20 ++-- js/tests/{graphs => charts}/scatter.test.ts | 24 ++-- js/tests/charts/superchart.test.ts | 64 ++++++++++ js/tests/{graphs => charts}/unknown.test.ts | 10 +- js/tests/displayData.test.ts | 2 +- js/tests/graphs/supergraph.test.ts | 64 ---------- python/README.md | 4 +- python/async_example.py | 4 - .../{graphs.py => charts.py} | 80 ++++++------- python/e2b_code_interpreter/models.py | 16 +-- python/example.py | 2 +- python/tests/async/test_async_data.py | 2 +- python/tests/async/test_async_display_data.py | 2 +- python/tests/graphs/test_bar.py | 28 ++--- python/tests/graphs/test_box_and_whiskers.py | 22 ++-- python/tests/graphs/test_line.py | 36 +++--- python/tests/graphs/test_log_graph.py | 38 +++--- python/tests/graphs/test_pie.py | 18 +-- python/tests/graphs/test_scale.py | 22 ++-- python/tests/graphs/test_scatter.py | 34 +++--- python/tests/graphs/test_supergraph.py | 56 ++++----- python/tests/graphs/test_unknown.py | 16 +-- python/tests/sync/test_data.py | 2 +- python/tests/sync/test_display_data.py | 2 +- template/server/api/models/result.py | 6 +- template/startup_scripts/0002_data.py | 110 +++++++++--------- 36 files changed, 457 insertions(+), 463 deletions(-) rename js/src/{graphs.ts => charts.ts} (50%) rename js/tests/{graphs => charts}/bar.test.ts (71%) rename js/tests/{graphs => charts}/boxAndWhisker.test.ts (76%) rename js/tests/{graphs => charts}/line.test.ts (67%) rename js/tests/{graphs => charts}/log.test.ts (54%) rename js/tests/{graphs => charts}/pie.test.ts (80%) rename js/tests/{graphs => charts}/scales.test.ts (70%) rename js/tests/{graphs => charts}/scatter.test.ts (67%) create mode 100644 js/tests/charts/superchart.test.ts rename js/tests/{graphs => charts}/unknown.test.ts (80%) delete mode 100644 js/tests/graphs/supergraph.test.ts rename python/e2b_code_interpreter/{graphs.py => charts.py} (70%) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index f96b41e5..6adf9eb3 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -5,8 +5,6 @@ on: paths: - 'template/**' - '.github/workflows/template.yml' - branches: - - beta permissions: contents: read diff --git a/js/README.md b/js/README.md index 1dc75b2c..cea8d492 100644 --- a/js/README.md +++ b/js/README.md @@ -5,7 +5,7 @@ The repository contains a template and modules for the code interpreter sandbox. ## Key Features - **Stateful Execution**: Unlike traditional sandboxes that treat each code execution independently, this package maintains context across executions. -- **Displaying Graph & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. +- **Displaying Charts & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. ## Installation diff --git a/js/src/graphs.ts b/js/src/charts.ts similarity index 50% rename from js/src/graphs.ts rename to js/src/charts.ts index 4ce19eeb..d711a4ef 100644 --- a/js/src/graphs.ts +++ b/js/src/charts.ts @@ -1,13 +1,13 @@ /** - * Graph types + * Chart types */ -export enum GraphType { +export enum ChartType { LINE = 'line', SCATTER = 'scatter', BAR = 'bar', PIE = 'pie', BOX_AND_WHISKER = 'box_and_whisker', - SUPERGRAPH = 'supergraph', + SUPERCHART = 'superchart', UNKNOWN = 'unknown', } @@ -27,13 +27,13 @@ export enum ScaleType { ASINH = "asinh", } -export type Graph = { - type: GraphType +export type Chart = { + type: ChartType title: string elements: any[] } -type Graph2D = Graph & { +type Chart2D = Chart & { x_label?: string y_label?: string x_unit?: string @@ -45,7 +45,7 @@ export type PointData = { points: [number | string, number | string][] } -type PointGraph = Graph2D & { +type PointChart = Chart2D & { x_ticks: (number | string)[] x_scale: ScaleType x_tick_labels: string[] @@ -55,12 +55,12 @@ type PointGraph = Graph2D & { elements: PointData[] } -export type LineGraph = PointGraph & { - type: GraphType.LINE +export type LineChart = PointChart & { + type: ChartType.LINE } -export type ScatterGraph = PointGraph & { - type: GraphType.SCATTER +export type ScatterChart = PointChart & { + type: ChartType.SCATTER } export type BarData = { @@ -69,8 +69,8 @@ export type BarData = { group: string } -export type BarGraph = Graph2D & { - type: GraphType.BAR +export type BarChart = Chart2D & { + type: ChartType.BAR elements: BarData[] } @@ -80,8 +80,8 @@ export type PieData = { radius: number } -export type PieGraph = Graph & { - type: GraphType.PIE +export type PieChart = Chart & { + type: ChartType.PIE elements: PieData[] } @@ -94,43 +94,43 @@ export type BoxAndWhiskerData = { max: number } -export type BoxAndWhiskerGraph = Graph2D & { - type: GraphType.BOX_AND_WHISKER +export type BoxAndWhiskerChart = Chart2D & { + type: ChartType.BOX_AND_WHISKER elements: BoxAndWhiskerData[] } -export type SuperGraph = Graph & { - type: GraphType.SUPERGRAPH - elements: Graph[] +export type SuperChart = Chart & { + type: ChartType.SUPERCHART + elements: Chart[] } -export type GraphTypes = - | LineGraph - | ScatterGraph - | BarGraph - | PieGraph - | BoxAndWhiskerGraph - | SuperGraph -export function deserializeGraph(data: any): Graph { +export type ChartTypes = + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart +export function deserializeChart(data: any): Chart { switch (data.type) { - case GraphType.LINE: - return { ...data } as LineGraph - case GraphType.SCATTER: - return { ...data } as ScatterGraph - case GraphType.BAR: - return { ...data } as BarGraph - case GraphType.PIE: - return { ...data } as PieGraph - case GraphType.BOX_AND_WHISKER: - return { ...data } as BoxAndWhiskerGraph - case GraphType.SUPERGRAPH: - const graphs = data.data.map((g: any) => deserializeGraph(g)) + case ChartType.LINE: + return { ...data } as LineChart + case ChartType.SCATTER: + return { ...data } as ScatterChart + case ChartType.BAR: + return { ...data } as BarChart + case ChartType.PIE: + return { ...data } as PieChart + case ChartType.BOX_AND_WHISKER: + return { ...data } as BoxAndWhiskerChart + case ChartType.SUPERCHART: + const charts = data.data.map((g: any) => deserializeChart(g)) delete data.data return { ...data, - data: graphs, - } as SuperGraph + data: charts, + } as SuperChart default: - return { ...data, type: GraphType.UNKNOWN } as Graph + return { ...data, type: ChartType.UNKNOWN } as Chart } } diff --git a/js/src/index.ts b/js/src/index.ts index 80a23823..69faa9d9 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -13,20 +13,20 @@ export type { } from './messaging' export type { ScaleType, - GraphType, - GraphTypes, - Graph, - BarGraph, + ChartType, + ChartTypes, + Chart, + BarChart, BarData, - LineGraph, - ScatterGraph, - BoxAndWhiskerGraph, + LineChart, + ScatterChart, + BoxAndWhiskerChart, BoxAndWhiskerData, - PieGraph, + PieChart, PieData, - SuperGraph, + SuperChart, PointData, -} from './graphs' +} from './charts' import { Sandbox } from './sandbox' export default Sandbox diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 0272cdd7..389b5cc1 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -1,5 +1,5 @@ import { NotFoundError, SandboxError, TimeoutError } from 'e2b' -import { GraphTypes } from './graphs' +import { ChartTypes } from './charts' export async function extractError(res: Response) { if (res.ok) { @@ -61,7 +61,7 @@ export type MIMEType = string type E2BData = { data: Record - graph: GraphTypes + chart: ChartTypes } /** @@ -126,9 +126,9 @@ export class Result { */ readonly data?: Record /** - * Contains the graph data. + * Contains the chart data. */ - readonly graph?: GraphTypes + readonly chart?: ChartTypes /** * Extra data that can be included. Not part of the standard types. */ @@ -155,7 +155,7 @@ export class Result { this.raw = data this.data = data['data'] - this.graph = data['graph'] + this.chart = data['chart'] this.extra = {} diff --git a/js/tests/graphs/bar.test.ts b/js/tests/charts/bar.test.ts similarity index 71% rename from js/tests/graphs/bar.test.ts rename to js/tests/charts/bar.test.ts index d4f56587..01a2b055 100644 --- a/js/tests/graphs/bar.test.ts +++ b/js/tests/charts/bar.test.ts @@ -11,31 +11,31 @@ import matplotlib.pyplot as plt authors = ['Author A', 'Author B', 'Author C', 'Author D'] sales = [100, 200, 300, 400] -# Create and customize the bar graph +# Create and customize the bar chart plt.figure(figsize=(10, 6)) plt.bar(authors, sales, label='Books Sold', color='blue') plt.xlabel('Authors') plt.ylabel('Number of Books Sold') plt.title('Book Sales by Authors') -# Display the graph +# Display the chart plt.tight_layout() plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() - expect(graph.type).toBe('bar') - expect(graph.title).toBe('Book Sales by Authors') + expect(chart).toBeDefined() + expect(chart.type).toBe('bar') + expect(chart.title).toBe('Book Sales by Authors') - expect(graph.x_label).toBe('Authors') - expect(graph.y_label).toBe('Number of Books Sold') + expect(chart.x_label).toBe('Authors') + expect(chart.y_label).toBe('Number of Books Sold') - expect(graph.x_unit).toBeNull() - expect(graph.y_unit).toBeNull() + expect(chart.x_unit).toBeNull() + expect(chart.y_unit).toBeNull() - const bars = graph.elements + const bars = chart.elements expect(bars.length).toBe(4) expect(bars.map((bar) => bar.value)).toEqual([100, 200, 300, 400]) diff --git a/js/tests/graphs/boxAndWhisker.test.ts b/js/tests/charts/boxAndWhisker.test.ts similarity index 76% rename from js/tests/graphs/boxAndWhisker.test.ts rename to js/tests/charts/boxAndWhisker.test.ts index 802cae49..c3698092 100644 --- a/js/tests/graphs/boxAndWhisker.test.ts +++ b/js/tests/charts/boxAndWhisker.test.ts @@ -36,20 +36,20 @@ plt.tight_layout() plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() + expect(chart).toBeDefined() - expect(graph.type).toBe('box_and_whisker') - expect(graph.title).toBe('Exam Scores Distribution') + expect(chart.type).toBe('box_and_whisker') + expect(chart.title).toBe('Exam Scores Distribution') - expect(graph.x_label).toBe('Class') - expect(graph.y_label).toBe('Score') + expect(chart.x_label).toBe('Class') + expect(chart.y_label).toBe('Score') - expect(graph.x_unit).toBeNull() - expect(graph.y_unit).toBeNull() + expect(chart.x_unit).toBeNull() + expect(chart.y_unit).toBeNull() - const bars = graph.elements + const bars = chart.elements expect(bars.length).toBe(3) bars.forEach((bar: any) => { diff --git a/js/tests/graphs/line.test.ts b/js/tests/charts/line.test.ts similarity index 67% rename from js/tests/graphs/line.test.ts rename to js/tests/charts/line.test.ts index 69b15d6b..5d34da70 100644 --- a/js/tests/graphs/line.test.ts +++ b/js/tests/charts/line.test.ts @@ -30,37 +30,37 @@ plt.title('Plot of sin(x) and cos(x)') plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() - expect(graph.type).toBe('line') + expect(chart).toBeDefined() + expect(chart.type).toBe('line') - expect(graph.title).toBe('Plot of sin(x) and cos(x)') - expect(graph.x_label).toBe('Time (s)') - expect(graph.y_label).toBe('Amplitude (Hz)') + expect(chart.title).toBe('Plot of sin(x) and cos(x)') + expect(chart.x_label).toBe('Time (s)') + expect(chart.y_label).toBe('Amplitude (Hz)') - expect(graph.x_scale).toBe('datetime') - expect(graph.y_scale).toBe('linear') + expect(chart.x_scale).toBe('datetime') + expect(chart.y_scale).toBe('linear') - expect(graph.x_unit).toBe('s') - expect(graph.y_unit).toBe('Hz') + expect(chart.x_unit).toBe('s') + expect(chart.y_unit).toBe('Hz') - expect(graph.x_ticks.every((tick: number) => typeof tick === 'string')).toBe( + expect(chart.x_ticks.every((tick: number) => typeof tick === 'string')).toBe( true, ) - expect(new Date(graph.x_ticks[0])).toBeInstanceOf(Date) - expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( + expect(new Date(chart.x_ticks[0])).toBeInstanceOf(Date) + expect(chart.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( true, ) expect( - graph.y_tick_labels.every((label: string) => typeof label === 'string'), + chart.y_tick_labels.every((label: string) => typeof label === 'string'), ).toBe(true) expect( - graph.x_tick_labels.every((label: string) => typeof label === 'string'), + chart.x_tick_labels.every((label: string) => typeof label === 'string'), ).toBe(true) - const lines = graph.elements + const lines = chart.elements expect(lines.length).toBe(2) const [firstLine, secondLine] = lines diff --git a/js/tests/graphs/log.test.ts b/js/tests/charts/log.test.ts similarity index 54% rename from js/tests/graphs/log.test.ts rename to js/tests/charts/log.test.ts index f2a1e33c..1569b9a4 100644 --- a/js/tests/graphs/log.test.ts +++ b/js/tests/charts/log.test.ts @@ -22,7 +22,7 @@ plt.yscale('log') # Add labels and title plt.xlabel('X-axis') plt.ylabel('Y-axis (log scale)') -plt.title('Graph with Log Scale on Y-axis') +plt.title('Chart with Log Scale on Y-axis') plt.legend() plt.grid(True) @@ -30,28 +30,28 @@ plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph - expect(graph).toBeDefined() - expect(graph.type).toBe('line') + const chart = result.results[0].chart + expect(chart).toBeDefined() + expect(chart.type).toBe('line') - expect(graph.title).toBe('Graph with Log Scale on Y-axis') + expect(chart.title).toBe('Chart with Log Scale on Y-axis') - expect(graph.x_label).toBe('X-axis') - expect(graph.y_label).toBe('Y-axis (log scale)') + expect(chart.x_label).toBe('X-axis') + expect(chart.y_label).toBe('Y-axis (log scale)') - expect(graph.x_unit).toBeNull() - expect(graph.y_unit).toBe('log scale') + expect(chart.x_unit).toBeNull() + expect(chart.y_unit).toBe('log scale') - expect(graph.x_scale).toBe('linear') - expect(graph.y_scale).toBe('log') + expect(chart.x_scale).toBe('linear') + expect(chart.y_scale).toBe('log') - expect(graph.x_ticks.every((x) => typeof x === 'number')).toBe(true) - expect(graph.y_ticks.every((y) => typeof y === 'number')).toBe(true) + expect(chart.x_ticks.every((x) => typeof x === 'number')).toBe(true) + expect(chart.y_ticks.every((y) => typeof y === 'number')).toBe(true) - expect(graph.x_tick_labels.every((x) => typeof x === 'string')).toBe(true) - expect(graph.y_tick_labels.every((y) => typeof y === 'string')).toBe(true) + expect(chart.x_tick_labels.every((x) => typeof x === 'string')).toBe(true) + expect(chart.y_tick_labels.every((y) => typeof y === 'string')).toBe(true) - const lines = graph.elements + const lines = chart.elements expect(lines.length).toBe(1) const line = lines[0] diff --git a/js/tests/graphs/pie.test.ts b/js/tests/charts/pie.test.ts similarity index 80% rename from js/tests/graphs/pie.test.ts rename to js/tests/charts/pie.test.ts index 72830243..1ee5ade8 100644 --- a/js/tests/graphs/pie.test.ts +++ b/js/tests/charts/pie.test.ts @@ -28,16 +28,16 @@ plt.title('Will I wake up early tomorrow?') plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() - expect(graph.type).toBe('pie') + expect(chart).toBeDefined() + expect(chart.type).toBe('pie') - expect(graph.title).toBe('Will I wake up early tomorrow?') + expect(chart.title).toBe('Will I wake up early tomorrow?') - expect(graph.elements.length).toBe(2) + expect(chart.elements.length).toBe(2) - const [firstData, secondData] = graph.elements + const [firstData, secondData] = chart.elements expect(firstData.label).toBe('No') expect(firstData.angle).toBe(324) // 90% of 360 degrees diff --git a/js/tests/graphs/scales.test.ts b/js/tests/charts/scales.test.ts similarity index 70% rename from js/tests/graphs/scales.test.ts rename to js/tests/charts/scales.test.ts index dd89fe85..6b6716f4 100644 --- a/js/tests/graphs/scales.test.ts +++ b/js/tests/charts/scales.test.ts @@ -19,12 +19,12 @@ sandboxTest('datetime scale', async ({ sandbox }) => { const result = await sandbox.runCode(code) - const graph = result.results[0].graph - expect(graph).toBeDefined() - expect(graph.type).toBe('line') + const chart = result.results[0].chart + expect(chart).toBeDefined() + expect(chart.type).toBe('line') - expect(graph.x_scale).toBe('datetime') - expect(graph.y_scale).toBe('linear') + expect(chart.x_scale).toBe('datetime') + expect(chart.y_scale).toBe('linear') }) sandboxTest('categorical scale', async ({ sandbox }) => { @@ -43,10 +43,10 @@ sandboxTest('categorical scale', async ({ sandbox }) => { const result = await sandbox.runCode(code) - const graph = result.results[0].graph - expect(graph).toBeTruthy() + const chart = result.results[0].chart + expect(chart).toBeTruthy() - expect(graph.type).toBe('line') - expect(graph.x_scale).toBe('linear') - expect(graph.y_scale).toBe('categorical') + expect(chart.type).toBe('line') + expect(chart.x_scale).toBe('linear') + expect(chart.y_scale).toBe('categorical') }) diff --git a/js/tests/graphs/scatter.test.ts b/js/tests/charts/scatter.test.ts similarity index 67% rename from js/tests/graphs/scatter.test.ts rename to js/tests/charts/scatter.test.ts index 7708e43b..2d514945 100644 --- a/js/tests/graphs/scatter.test.ts +++ b/js/tests/charts/scatter.test.ts @@ -23,32 +23,32 @@ plt.scatter(x2, y2, c='red', label='Dataset 2') plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() - expect(graph.type).toBe('scatter') + expect(chart).toBeDefined() + expect(chart.type).toBe('scatter') - expect(graph.title).toBeNull() - expect(graph.x_label).toBe('A') - expect(graph.y_label).toBe('B') + expect(chart.title).toBeNull() + expect(chart.x_label).toBe('A') + expect(chart.y_label).toBe('B') - expect(graph.x_ticks.every((tick: number) => typeof tick === 'number')).toBe( + expect(chart.x_ticks.every((tick: number) => typeof tick === 'number')).toBe( true ) - expect(graph.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( + expect(chart.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( true ) expect( - graph.x_tick_labels.every((label: string) => typeof label === 'string') + chart.x_tick_labels.every((label: string) => typeof label === 'string') ).toBe(true) expect( - graph.y_tick_labels.every((label: string) => typeof label === 'string') + chart.y_tick_labels.every((label: string) => typeof label === 'string') ).toBe(true) - expect(graph.elements.length).toBe(2) + expect(chart.elements.length).toBe(2) - const [firstData, secondData] = graph.elements + const [firstData, secondData] = chart.elements expect(firstData.label).toBe('Dataset 1') expect(firstData.points.length).toBe(5) diff --git a/js/tests/charts/superchart.test.ts b/js/tests/charts/superchart.test.ts new file mode 100644 index 00000000..33f3c2dd --- /dev/null +++ b/js/tests/charts/superchart.test.ts @@ -0,0 +1,64 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('superchart', async ({ sandbox }) => { + const code = ` +import matplotlib.pyplot as plt +import numpy as np + +# Data for plotting +x1 = np.linspace(0, 10, 100) +y1 = np.sin(x1) + +# Create a figure with multiple subplots +fig, axs = plt.subplots(1, 2, figsize=(10, 8)) +fig.suptitle('Multiple Charts Example', fontsize=16) + +# Plotting on the different axes +axs[0].plot(x1, y1, 'r') +axs[0].set_title('Sine Wave') +axs[0].grid(True) + +N = 5 +x2 = np.random.rand(N) +y2 = np.random.rand(N) + +axs[1].scatter(x2, y2, c='blue', label='Dataset 1') +axs[1].set_xlabel('X') +axs[1].set_ylabel('Y') +axs[1].set_title('Scatter Plot') +axs[1].grid(True) + +plt.show() +` + const result = await sandbox.runCode(code) + const chart = result.results[0].chart + + expect(chart).toBeDefined() + expect(chart.type).toBe('superchart') + expect(chart.title).toBe('Multiple Charts Example') + + const charts = chart.elements + expect(charts.length).toBe(2) + + const [firstChart, secondChart] = charts + + // Check the first chart (LineChart) + expect(firstChart.title).toBe('Sine Wave') + expect(firstChart.type).toBe('line') + + expect(firstChart.x_label).toBeNull() + expect(firstChart.y_label).toBeNull() + expect(firstChart.elements.length).toBe(1) + expect(firstChart.elements[0].points.length).toBe(100) + + // Check the second chart (ScatterChart) + expect(secondChart.title).toBe('Scatter Plot') + expect(secondChart.type).toBe('scatter') + + expect(secondChart.x_label).toBe('X') + expect(secondChart.y_label).toBe('Y') + expect(secondChart.elements.length).toBe(1) + expect(secondChart.elements[0].points.length).toBe(5) +}) diff --git a/js/tests/graphs/unknown.test.ts b/js/tests/charts/unknown.test.ts similarity index 80% rename from js/tests/graphs/unknown.test.ts rename to js/tests/charts/unknown.test.ts index 842d05ec..8ab40ebf 100644 --- a/js/tests/graphs/unknown.test.ts +++ b/js/tests/charts/unknown.test.ts @@ -29,11 +29,11 @@ plt.title('Two Concentric Circles') plt.show() ` const result = await sandbox.runCode(code) - const graph = result.results[0].graph + const chart = result.results[0].chart - expect(graph).toBeDefined() - expect(graph.type).toBe('unknown') - expect(graph.title).toBe('Two Concentric Circles') + expect(chart).toBeDefined() + expect(chart.type).toBe('unknown') + expect(chart.title).toBe('Two Concentric Circles') - expect(graph.elements.length).toBe(0) + expect(chart.elements.length).toBe(0) }) diff --git a/js/tests/displayData.test.ts b/js/tests/displayData.test.ts index 5e4684d1..a4fab813 100644 --- a/js/tests/displayData.test.ts +++ b/js/tests/displayData.test.ts @@ -3,7 +3,7 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('display data', async ({ sandbox }) => { - // plot random graph + // plot random chart const result = await sandbox.runCode(` import matplotlib.pyplot as plt import numpy as np diff --git a/js/tests/graphs/supergraph.test.ts b/js/tests/graphs/supergraph.test.ts deleted file mode 100644 index 74426bb3..00000000 --- a/js/tests/graphs/supergraph.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { expect } from 'vitest' - -import { sandboxTest } from '../setup' - -sandboxTest('supergraph', async ({ sandbox }) => { - const code = ` -import matplotlib.pyplot as plt -import numpy as np - -# Data for plotting -x1 = np.linspace(0, 10, 100) -y1 = np.sin(x1) - -# Create a figure with multiple subplots -fig, axs = plt.subplots(1, 2, figsize=(10, 8)) -fig.suptitle('Multiple Graphs Example', fontsize=16) - -# Plotting on the different axes -axs[0].plot(x1, y1, 'r') -axs[0].set_title('Sine Wave') -axs[0].grid(True) - -N = 5 -x2 = np.random.rand(N) -y2 = np.random.rand(N) - -axs[1].scatter(x2, y2, c='blue', label='Dataset 1') -axs[1].set_xlabel('X') -axs[1].set_ylabel('Y') -axs[1].set_title('Scatter Plot') -axs[1].grid(True) - -plt.show() -` - const result = await sandbox.runCode(code) - const graph = result.results[0].graph - - expect(graph).toBeDefined() - expect(graph.type).toBe('supergraph') - expect(graph.title).toBe('Multiple Graphs Example') - - const graphs = graph.elements - expect(graphs.length).toBe(2) - - const [firstGraph, secondGraph] = graphs - - // Check the first graph (LineGraph) - expect(firstGraph.title).toBe('Sine Wave') - expect(firstGraph.type).toBe('line') - - expect(firstGraph.x_label).toBeNull() - expect(firstGraph.y_label).toBeNull() - expect(firstGraph.elements.length).toBe(1) - expect(firstGraph.elements[0].points.length).toBe(100) - - // Check the second graph (ScatterGraph) - expect(secondGraph.title).toBe('Scatter Plot') - expect(secondGraph.type).toBe('scatter') - - expect(secondGraph.x_label).toBe('X') - expect(secondGraph.y_label).toBe('Y') - expect(secondGraph.elements.length).toBe(1) - expect(secondGraph.elements[0].points.length).toBe(5) -}) diff --git a/python/README.md b/python/README.md index 12a1acd6..d1584f7d 100644 --- a/python/README.md +++ b/python/README.md @@ -5,7 +5,7 @@ The repository contains a template and modules for the code interpreter sandbox. ## Key Features - **Stateful Execution**: Unlike traditional sandboxes that treat each code execution independently, this package maintains context across executions. -- **Displaying Graph & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. +- **Displaying Charts & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. ## Installation @@ -53,7 +53,7 @@ with Sandbox() as sandbox: # you can install dependencies in "jupyter notebook style" sandbox.run_code("!pip install matplotlib") - # plot random graph + # plot random chart execution = sandbox.run_code(code) # there's your image diff --git a/python/async_example.py b/python/async_example.py index 02eab3a7..a4df65a9 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -61,10 +61,6 @@ async def run(): print(result.results[0].formats()) print(result.results[0].elements.elements) - # print(result.results[0].data['graphs'][0]['data']) - # print(result.results[0].data['graphs'][0]['data'][0]) - # print(result.results[0].data['graphs'][0]['data'][1]) - # print(result.results[0].data['graphs'][0]['data'][2]) await sbx.kill() diff --git a/python/e2b_code_interpreter/graphs.py b/python/e2b_code_interpreter/charts.py similarity index 70% rename from python/e2b_code_interpreter/graphs.py rename to python/e2b_code_interpreter/charts.py index 9229087b..1ea55719 100644 --- a/python/e2b_code_interpreter/graphs.py +++ b/python/e2b_code_interpreter/charts.py @@ -2,9 +2,9 @@ from typing import List, Tuple, Any, Optional, Union -class GraphType(str, enum.Enum): +class ChartType(str, enum.Enum): """ - Graph types + Chart types """ LINE = "line" @@ -12,7 +12,7 @@ class GraphType(str, enum.Enum): BAR = "bar" PIE = "pie" BOX_AND_WHISKER = "box_and_whisker" - SUPERGRAPH = "supergraph" + SUPERCHART = "superchart" UNKNOWN = "unknown" @@ -33,23 +33,23 @@ class ScaleType(str, enum.Enum): UNKNOWN = "unknown" -class Graph: +class Chart: """ - Extracted data from a graph. It's useful for building an interactive graphs or custom visualizations. + Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. """ - type: GraphType + type: ChartType title: str elements: List[Any] def __init__(self, **kwargs): - self.type = GraphType(kwargs["type"] or GraphType.UNKNOWN) + self.type = ChartType(kwargs["type"] or ChartType.UNKNOWN) self.title = kwargs["title"] self.elements = kwargs["elements"] -class Graph2D(Graph): +class Chart2D(Chart): x_label: Optional[str] y_label: Optional[str] x_unit: Optional[str] @@ -72,7 +72,7 @@ def __init__(self, **kwargs): self.points = [(x, y) for x, y in kwargs["points"]] -class PointGraph(Graph2D): +class PointChart(Chart2D): x_ticks: List[Union[str, float]] x_tick_labels: List[str] x_scale: ScaleType @@ -108,12 +108,12 @@ def __init__(self, **kwargs): self.elements = [PointData(**d) for d in kwargs["elements"]] -class LineGraph(PointGraph): - type = GraphType.LINE +class LineChart(PointChart): + type = ChartType.LINE -class ScatterGraph(PointGraph): - type = GraphType.SCATTER +class ScatterChart(PointChart): + type = ChartType.SCATTER class BarData: @@ -127,8 +127,8 @@ def __init__(self, **kwargs): self.group = kwargs["group"] -class BarGraph(Graph2D): - type = GraphType.BAR +class BarChart(Chart2D): + type = ChartType.BAR elements: List[BarData] @@ -148,8 +148,8 @@ def __init__(self, **kwargs): self.radius = kwargs["radius"] -class PieGraph(Graph): - type = GraphType.PIE +class PieChart(Chart): + type = ChartType.PIE elements: List[PieData] @@ -175,8 +175,8 @@ def __init__(self, **kwargs): self.max = kwargs["max"] -class BoxAndWhiskerGraph(Graph2D): - type = GraphType.BOX_AND_WHISKER +class BoxAndWhiskerChart(Chart2D): + type = ChartType.BOX_AND_WHISKER elements: List[BoxAndWhiskerData] @@ -185,40 +185,40 @@ def __init__(self, **kwargs): self.elements = [BoxAndWhiskerData(**d) for d in kwargs["elements"]] -class SuperGraph(Graph): - type = GraphType.SUPERGRAPH +class SuperChart(Chart): + type = ChartType.SUPERCHART elements: List[ - Union[LineGraph, ScatterGraph, BarGraph, PieGraph, BoxAndWhiskerGraph] + Union[LineChart, ScatterChart, BarChart, PieChart, BoxAndWhiskerChart] ] def __init__(self, **kwargs): super().__init__(**kwargs) - self.elements = [deserialize_graph(g) for g in kwargs["elements"]] + self.elements = [_deserialize_chart(g) for g in kwargs["elements"]] -GraphTypes = Union[ - LineGraph, ScatterGraph, BarGraph, PieGraph, BoxAndWhiskerGraph, SuperGraph +ChartTypes = Union[ + LineChart, ScatterChart, BarChart, PieChart, BoxAndWhiskerChart, SuperChart ] -def deserialize_graph(data: Optional[dict]) -> Optional[GraphTypes]: +def _deserialize_chart(data: Optional[dict]) -> Optional[ChartTypes]: if not data: return None - if data["type"] == GraphType.LINE: - graph = LineGraph(**data) - elif data["type"] == GraphType.SCATTER: - graph = ScatterGraph(**data) - elif data["type"] == GraphType.BAR: - graph = BarGraph(**data) - elif data["type"] == GraphType.PIE: - graph = PieGraph(**data) - elif data["type"] == GraphType.BOX_AND_WHISKER: - graph = BoxAndWhiskerGraph(**data) - elif data["type"] == GraphType.SUPERGRAPH: - graph = SuperGraph(**data) + if data["type"] == ChartType.LINE: + chart = LineChart(**data) + elif data["type"] == ChartType.SCATTER: + chart = ScatterChart(**data) + elif data["type"] == ChartType.BAR: + chart = BarChart(**data) + elif data["type"] == ChartType.PIE: + chart = PieChart(**data) + elif data["type"] == ChartType.BOX_AND_WHISKER: + chart = BoxAndWhiskerChart(**data) + elif data["type"] == ChartType.SUPERCHART: + chart = SuperChart(**data) else: - graph = Graph(**data) + chart = Chart(**data) - return graph + return chart diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index f55cf99d..d15f848d 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -17,7 +17,7 @@ from httpx import Response -from .graphs import Graph, deserialize_graph +from .charts import Chart, _deserialize_chart T = TypeVar("T") OutputHandler = Union[ @@ -96,7 +96,7 @@ def __getitem__(self, item): json: Optional[dict] = None javascript: Optional[str] = None data: Optional[dict] = None - graph: Optional[Graph] = None + chart: Optional[Chart] = None is_main_result: bool = False """Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell.""" extra: Optional[dict] = None @@ -115,7 +115,7 @@ def __init__( json: Optional[dict] = None, javascript: Optional[str] = None, data: Optional[dict] = None, - graph: Optional[dict] = None, + chart: Optional[dict] = None, is_main_result: bool = False, extra: Optional[dict] = None, **kwargs, # Allows for future expansion @@ -131,12 +131,12 @@ def __init__( self.json = json self.javascript = javascript self.data = data - if graph: + if chart: try: - self.graph = deserialize_graph(graph) + self.chart = _deserialize_chart(chart) except Exception as e: logger.error( - f"Error deserializing graph, check if you are using the latest version of the library: {e}" + f"Error deserializing chart, check if you are using the latest version of the library: {e}" ) self.is_main_result = is_main_result self.extra = extra @@ -170,8 +170,8 @@ def formats(self) -> Iterable[str]: formats.append("javascript") if self.data: formats.append("data") - if self.graph: - formats.append("graph") + if self.chart: + formats.append("chart") if self.extra: for key in self.extra: diff --git a/python/example.py b/python/example.py index cb79406d..1557f794 100644 --- a/python/example.py +++ b/python/example.py @@ -36,7 +36,7 @@ async def run(): sbx = Sandbox(timeout=60) e = sbx.run_code(code) - print(e.results[0].graph) + print(e.results[0].chart) asyncio.run(run()) diff --git a/python/tests/async/test_async_data.py b/python/tests/async/test_async_data.py index ad43ffec..d11a67b8 100644 --- a/python/tests/async/test_async_data.py +++ b/python/tests/async/test_async_data.py @@ -2,7 +2,7 @@ async def test_data(async_sandbox: AsyncSandbox): - # plot random graph + # plot random chart result = await async_sandbox.run_code( """ import pandas as pd diff --git a/python/tests/async/test_async_display_data.py b/python/tests/async/test_async_display_data.py index e3756212..ecdb64e5 100644 --- a/python/tests/async/test_async_display_data.py +++ b/python/tests/async/test_async_display_data.py @@ -2,7 +2,7 @@ async def test_display_data(async_sandbox: AsyncSandbox): - # plot random graph + # plot random chart result = await async_sandbox.run_code( """ import matplotlib.pyplot as plt diff --git a/python/tests/graphs/test_bar.py b/python/tests/graphs/test_bar.py index 481d4306..a35b19c1 100644 --- a/python/tests/graphs/test_bar.py +++ b/python/tests/graphs/test_bar.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import GraphType, BarGraph +from e2b_code_interpreter.charts import ChartType, BarChart code = """ import matplotlib.pyplot as plt @@ -8,36 +8,36 @@ authors = ['Author A', 'Author B', 'Author C', 'Author D'] sales = [100, 200, 300, 400] -# Create and customize the bar graph +# Create and customize the bar chart plt.figure(figsize=(10, 6)) plt.bar(authors, sales, label='Books Sold', color='blue') plt.xlabel('Authors') plt.ylabel('Number of Books Sold') plt.title('Book Sales by Authors') -# Display the graph +# Display the chart plt.tight_layout() plt.show() """ -async def test_graph_bar(async_sandbox: AsyncSandbox): +async def test_chart_bar(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, BarGraph) - assert graph.type == GraphType.BAR - assert graph.title == "Book Sales by Authors" + assert isinstance(chart, BarChart) + assert chart.type == ChartType.BAR + assert chart.title == "Book Sales by Authors" - assert graph.x_label == "Authors" - assert graph.y_label == "Number of Books Sold" + assert chart.x_label == "Authors" + assert chart.y_label == "Number of Books Sold" - assert graph.x_unit is None - assert graph.y_unit is None + assert chart.x_unit is None + assert chart.y_unit is None - bars = graph.elements + bars = chart.elements assert len(bars) == 4 assert [bar.value for bar in bars] == [100, 200, 300, 400] diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/graphs/test_box_and_whiskers.py index fe561d23..641745c9 100644 --- a/python/tests/graphs/test_box_and_whiskers.py +++ b/python/tests/graphs/test_box_and_whiskers.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import BoxAndWhiskerGraph, GraphType +from e2b_code_interpreter.charts import BoxAndWhiskerChart, ChartType code = """ import matplotlib.pyplot as plt @@ -38,20 +38,20 @@ async def test_box_and_whiskers(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, BoxAndWhiskerGraph) - assert graph.type == GraphType.BOX_AND_WHISKER - assert graph.title == "Exam Scores Distribution" + assert isinstance(chart, BoxAndWhiskerChart) + assert chart.type == ChartType.BOX_AND_WHISKER + assert chart.title == "Exam Scores Distribution" - assert graph.x_label == "Class" - assert graph.y_label == "Score" + assert chart.x_label == "Class" + assert chart.y_label == "Score" - assert graph.x_unit is None - assert graph.y_unit is None + assert chart.x_unit is None + assert chart.y_unit is None - bars = graph.elements + bars = chart.elements assert len(bars) == 3 assert all(isinstance(bar.min, float) for bar in bars) diff --git a/python/tests/graphs/test_line.py b/python/tests/graphs/test_line.py index 7f88a6f3..e90b4bd3 100644 --- a/python/tests/graphs/test_line.py +++ b/python/tests/graphs/test_line.py @@ -1,7 +1,7 @@ import datetime from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import LineGraph +from e2b_code_interpreter.charts import LineChart code = """ import numpy as np @@ -31,33 +31,33 @@ """ -async def test_line_graph(async_sandbox: AsyncSandbox): +async def test_line_chart(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, LineGraph) - assert graph.title == "Plot of sin(x) and cos(x)" + assert isinstance(chart, LineChart) + assert chart.title == "Plot of sin(x) and cos(x)" - assert graph.x_label == "Time (s)" - assert graph.y_label == "Amplitude (Hz)" + assert chart.x_label == "Time (s)" + assert chart.y_label == "Amplitude (Hz)" - assert graph.x_unit == "s" - assert graph.y_unit == "Hz" + assert chart.x_unit == "s" + assert chart.y_unit == "Hz" - assert graph.x_scale == "datetime" - assert graph.y_scale == "linear" + assert chart.x_scale == "datetime" + assert chart.y_scale == "linear" - assert all(isinstance(x, str) for x in graph.x_ticks) - parsed_date = datetime.datetime.fromisoformat(graph.x_ticks[0]) + assert all(isinstance(x, str) for x in chart.x_ticks) + parsed_date = datetime.datetime.fromisoformat(chart.x_ticks[0]) assert isinstance(parsed_date, datetime.datetime) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.y_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.y_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - lines = graph.elements + lines = chart.elements assert len(lines) == 2 first_line = lines[0] diff --git a/python/tests/graphs/test_log_graph.py b/python/tests/graphs/test_log_graph.py index 31b62d6a..285085e8 100644 --- a/python/tests/graphs/test_log_graph.py +++ b/python/tests/graphs/test_log_graph.py @@ -1,7 +1,7 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import LineGraph +from e2b_code_interpreter.charts import LineChart -# Log graph +# Log chart code = """ import numpy as np import matplotlib.pyplot as plt @@ -21,7 +21,7 @@ # Add labels and title plt.xlabel('X-axis') plt.ylabel('Y-axis (log scale)') -plt.title('Graph with Log Scale on Y-axis') +plt.title('Chart with Log Scale on Y-axis') plt.legend() plt.grid(True) @@ -29,31 +29,31 @@ """ -async def test_log_graph(async_sandbox: AsyncSandbox): +async def test_log_chart(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, LineGraph) - assert graph.title == "Graph with Log Scale on Y-axis" + assert isinstance(chart, LineChart) + assert chart.title == "Chart with Log Scale on Y-axis" - assert graph.x_label == "X-axis" - assert graph.y_label == "Y-axis (log scale)" + assert chart.x_label == "X-axis" + assert chart.y_label == "Y-axis (log scale)" - assert graph.x_unit == None - assert graph.y_unit == "log scale" + assert chart.x_unit == None + assert chart.y_unit == "log scale" - assert graph.x_scale == "linear" - assert graph.y_scale == "log" + assert chart.x_scale == "linear" + assert chart.y_scale == "log" - assert all(isinstance(x, float) for x in graph.x_ticks) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(x, float) for x in chart.x_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.x_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.x_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - lines = graph.elements + lines = chart.elements assert len(lines) == 1 line = lines[0] diff --git a/python/tests/graphs/test_pie.py b/python/tests/graphs/test_pie.py index d78d14d7..f6ffefeb 100644 --- a/python/tests/graphs/test_pie.py +++ b/python/tests/graphs/test_pie.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import PieGraph +from e2b_code_interpreter.charts import PieChart code = """ import matplotlib.pyplot as plt @@ -27,24 +27,24 @@ """ -async def test_pie_graph(async_sandbox: AsyncSandbox): +async def test_pie_chart(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, PieGraph) + assert isinstance(chart, PieChart) - assert graph.title == "Will I wake up early tomorrow?" + assert chart.title == "Will I wake up early tomorrow?" - assert len(graph.elements) == 2 + assert len(chart.elements) == 2 - first_data = graph.elements[0] + first_data = chart.elements[0] assert first_data.label == "No" assert first_data.angle == 324 assert first_data.radius == 1 - second_data = graph.elements[1] + second_data = chart.elements[1] assert second_data.label == "No, in blue" assert second_data.angle == 36 assert second_data.radius == 1 diff --git a/python/tests/graphs/test_scale.py b/python/tests/graphs/test_scale.py index 38d1bf6c..e4e690f5 100644 --- a/python/tests/graphs/test_scale.py +++ b/python/tests/graphs/test_scale.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import LineGraph +from e2b_code_interpreter.charts import LineChart async def test_datetime_scale(async_sandbox: AsyncSandbox): @@ -20,12 +20,12 @@ async def test_datetime_scale(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, LineGraph) - assert graph.x_scale == "datetime" - assert graph.y_scale == "linear" + assert isinstance(chart, LineChart) + assert chart.x_scale == "datetime" + assert chart.y_scale == "linear" async def test_categorical_scale(async_sandbox: AsyncSandbox): @@ -44,9 +44,9 @@ async def test_categorical_scale(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, LineGraph) - assert graph.x_scale == "linear" - assert graph.y_scale == "categorical" + assert isinstance(chart, LineChart) + assert chart.x_scale == "linear" + assert chart.y_scale == "categorical" diff --git a/python/tests/graphs/test_scatter.py b/python/tests/graphs/test_scatter.py index 445daf16..1668f4cc 100644 --- a/python/tests/graphs/test_scatter.py +++ b/python/tests/graphs/test_scatter.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import ScatterGraph +from e2b_code_interpreter.charts import ScatterChart code = """ import matplotlib.pyplot as plt @@ -22,36 +22,36 @@ """ -async def test_scatter_graph(async_sandbox: AsyncSandbox): +async def test_scatter_chart(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, ScatterGraph) + assert isinstance(chart, ScatterChart) - assert graph.title is None - assert graph.x_label == "A" - assert graph.y_label == "B" + assert chart.title is None + assert chart.x_label == "A" + assert chart.y_label == "B" - assert graph.x_scale == "linear" - assert graph.y_scale == "linear" + assert chart.x_scale == "linear" + assert chart.y_scale == "linear" - assert all(isinstance(x, float) for x in graph.x_ticks) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(x, float) for x in chart.x_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.y_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.y_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - assert len(graph.elements) == 2 + assert len(chart.elements) == 2 - first_data = graph.elements[0] + first_data = chart.elements[0] assert first_data.label == "Dataset 1" assert len(first_data.points) == 5 print(first_data.points) assert all(isinstance(x, tuple) for x in first_data.points) - second_data = graph.elements[1] + second_data = chart.elements[1] assert second_data.label == "Dataset 2" assert len(second_data.points) == 10 assert all(isinstance(x, tuple) for x in second_data.points) diff --git a/python/tests/graphs/test_supergraph.py b/python/tests/graphs/test_supergraph.py index 0f71315b..ee2e324e 100644 --- a/python/tests/graphs/test_supergraph.py +++ b/python/tests/graphs/test_supergraph.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import GraphType, SuperGraph, LineGraph, ScatterGraph +from e2b_code_interpreter.charts import ChartType, SuperChart, LineChart, ScatterChart code = """ import matplotlib.pyplot as plt @@ -11,7 +11,7 @@ # Create a figure with multiple subplots fig, axs = plt.subplots(1, 2, figsize=(10, 8)) -fig.suptitle('Multiple Graphs Example', fontsize=16) +fig.suptitle('Multiple Charts Example', fontsize=16) # Plotting on the different axes axs[0].plot(x1, y1, 'r') @@ -32,30 +32,30 @@ """ -async def test_super_graph(async_sandbox: AsyncSandbox): +async def test_super_chart(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph - - assert isinstance(graph, SuperGraph) - assert graph.type == GraphType.SUPERGRAPH - assert graph.title == "Multiple Graphs Example" - - graphs = graph.elements - assert len(graphs) == 2 - - first_graph = graphs[0] - assert first_graph.title == "Sine Wave" - assert isinstance(first_graph, LineGraph) - assert first_graph.x_label is None - assert first_graph.y_label is None - assert len(first_graph.elements) == 1 - assert len(first_graph.elements[0].points) == 100 - - second_graph = graphs[1] - assert second_graph.title == "Scatter Plot" - assert isinstance(second_graph, ScatterGraph) - assert second_graph.x_label == "X" - assert second_graph.y_label == "Y" - assert len(second_graph.elements) == 1 - assert len(second_graph.elements[0].points) == 5 + chart = result.results[0].chart + assert chart + + assert isinstance(chart, SuperChart) + assert chart.type == ChartType.SUPERCHART + assert chart.title == "Multiple Charts Example" + + charts = chart.elements + assert len(charts) == 2 + + first_chart = charts[0] + assert first_chart.title == "Sine Wave" + assert isinstance(first_chart, LineChart) + assert first_chart.x_label is None + assert first_chart.y_label is None + assert len(first_chart.elements) == 1 + assert len(first_chart.elements[0].points) == 100 + + second_chart = charts[1] + assert second_chart.title == "Scatter Plot" + assert isinstance(second_chart, ScatterChart) + assert second_chart.x_label == "X" + assert second_chart.y_label == "Y" + assert len(second_chart.elements) == 1 + assert len(second_chart.elements[0].points) == 5 diff --git a/python/tests/graphs/test_unknown.py b/python/tests/graphs/test_unknown.py index 9d919252..87ca36b3 100644 --- a/python/tests/graphs/test_unknown.py +++ b/python/tests/graphs/test_unknown.py @@ -1,5 +1,5 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.graphs import GraphType, Graph +from e2b_code_interpreter.charts import ChartType, Chart code = """ import matplotlib.pyplot as plt @@ -27,14 +27,14 @@ """ -async def test_unknown_graphs(async_sandbox: AsyncSandbox): +async def test_unknown_charts(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code(code) - graph = result.results[0].graph - assert graph + chart = result.results[0].chart + assert chart - assert isinstance(graph, Graph) - assert graph.type == GraphType.UNKNOWN - assert graph.title == "Two Concentric Circles" + assert isinstance(chart, Chart) + assert chart.type == ChartType.UNKNOWN + assert chart.title == "Two Concentric Circles" - assert len(graph.elements) == 0 + assert len(chart.elements) == 0 diff --git a/python/tests/sync/test_data.py b/python/tests/sync/test_data.py index eecc11cf..4db51d65 100644 --- a/python/tests/sync/test_data.py +++ b/python/tests/sync/test_data.py @@ -2,7 +2,7 @@ def test_data(sandbox: Sandbox): - # plot random graph + # plot random chart result = sandbox.run_code( """ import pandas as pd diff --git a/python/tests/sync/test_display_data.py b/python/tests/sync/test_display_data.py index 50443957..22db9f99 100644 --- a/python/tests/sync/test_display_data.py +++ b/python/tests/sync/test_display_data.py @@ -2,7 +2,7 @@ def test_display_data(sandbox: Sandbox): - # plot random graph + # plot random chart result = sandbox.run_code( """ import matplotlib.pyplot as plt diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index d1ae16a4..e63cdd0e 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -33,7 +33,7 @@ class Result(BaseModel): json: Optional[dict] = None javascript: Optional[str] = None data: Optional[dict] = None - graph: Optional[dict] = None + chart: Optional[dict] = None extra: Optional[dict] = None "Extra data that can be included. Not part of the standard types." @@ -58,7 +58,7 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.json = data.pop("application/json", None) self.javascript = data.pop("application/javascript", None) self.data = data.pop("e2b/data", None) - self.graph = data.pop("e2b/graph", None) + self.chart = data.pop("e2b/chart", None) self.extra = data def formats(self) -> Iterable[str]: @@ -76,7 +76,7 @@ def formats(self) -> Iterable[str]: "json", "javascript", "data", - "graph", + "chart", ]: if getattr(self, key): formats.append(key) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index a0879649..e40ee7fb 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -35,18 +35,18 @@ def _is_grid_line(line: Line2D) -> bool: return False -class GraphType(str, enum.Enum): +class ChartType(str, enum.Enum): LINE = "line" SCATTER = "scatter" BAR = "bar" PIE = "pie" BOX_AND_WHISKER = "box_and_whisker" - SUPERGRAPH = "supergraph" + SUPERCHART = "superchart" UNKNOWN = "unknown" -class Graph(BaseModel): - type: GraphType +class Chart(BaseModel): + type: ChartType title: Optional[str] = None elements: List[Any] = Field(default_factory=list) @@ -58,7 +58,7 @@ def __init__(self, ax: Optional[Axes] = None, **kwargs): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for Graph + Function to extract information for Chart """ title = ax.get_title() if title == "": @@ -67,7 +67,7 @@ def _extract_info(self, ax: Axes) -> None: self.title = title -class Graph2D(Graph): +class Chart2D(Chart): x_label: Optional[str] = None y_label: Optional[str] = None x_unit: Optional[str] = None @@ -75,7 +75,7 @@ class Graph2D(Graph): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for Graph2D + Function to extract information for Chart2D """ super()._extract_info(ax) x_label = ax.get_xlabel() @@ -129,7 +129,7 @@ def transform_points( return parsed_value -class PointGraph(Graph2D): +class PointChart(Chart2D): x_ticks: List[Union[str, float]] = Field(default_factory=list) x_tick_labels: List[str] = Field(default_factory=list) x_scale: str = Field(default="linear") @@ -142,7 +142,7 @@ class PointGraph(Graph2D): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for PointGraph + Function to extract information for PointChart """ super()._extract_info(ax) @@ -194,8 +194,8 @@ def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: return list(ticks) -class LineGraph(PointGraph): - type: Literal[GraphType.LINE] = GraphType.LINE +class LineChart(PointChart): + type: Literal[ChartType.LINE] = ChartType.LINE def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) @@ -213,8 +213,8 @@ def _extract_info(self, ax: Axes) -> None: self.elements.append(line_data) -class ScatterGraph(PointGraph): - type: Literal[GraphType.SCATTER] = GraphType.SCATTER +class ScatterChart(PointChart): + type: Literal[ChartType.SCATTER] = ChartType.SCATTER def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) @@ -231,8 +231,8 @@ class BarData(BaseModel): value: float -class BarGraph(Graph2D): - type: Literal[GraphType.BAR] = GraphType.BAR +class BarChart(Chart2D): + type: Literal[ChartType.BAR] = ChartType.BAR elements: List[BarData] = Field(default_factory=list) @@ -266,8 +266,8 @@ class PieData(BaseModel): radius: float -class PieGraph(Graph): - type: Literal[GraphType.PIE] = GraphType.PIE +class PieChart(Chart): + type: Literal[ChartType.PIE] = ChartType.PIE elements: List[PieData] = Field(default_factory=list) @@ -293,8 +293,8 @@ class BoxAndWhiskerData(BaseModel): max: float -class BoxAndWhiskerGraph(Graph2D): - type: Literal[GraphType.BOX_AND_WHISKER] = GraphType.BOX_AND_WHISKER +class BoxAndWhiskerChart(Chart2D): + type: Literal[ChartType.BOX_AND_WHISKER] = ChartType.BOX_AND_WHISKER elements: List[BoxAndWhiskerData] = Field(default_factory=list) @@ -370,28 +370,28 @@ def _extract_info(self, ax: Axes) -> None: ] -class SuperGraph(Graph): - type: Literal[GraphType.SUPERGRAPH] = GraphType.SUPERGRAPH +class SuperChart(Chart): + type: Literal[ChartType.SUPERCHART] = ChartType.SUPERCHART elements: List[ - LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph + LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart ] = Field(default_factory=list) def __init__(self, figure: Figure): title = figure.get_suptitle() super().__init__(title=title) - self.elements = [get_graph_from_ax(ax) for ax in figure.axes] + self.elements = [get_chart_from_ax(ax) for ax in figure.axes] -def _get_type_of_graph(ax: Axes) -> GraphType: +def _get_type_of_chart(ax: Axes) -> ChartType: objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) # Check for Line plots if all(isinstance(line, Line2D) for line in objects): - return GraphType.LINE + return ChartType.LINE if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): - return GraphType.BOX_AND_WHISKER + return ChartType.BOX_AND_WHISKER filtered = [] for obj in objects: @@ -403,41 +403,41 @@ def _get_type_of_graph(ax: Axes) -> GraphType: # Check for Scatter plots if all(isinstance(path, PathCollection) for path in objects): - return GraphType.SCATTER + return ChartType.SCATTER # Check for Pie plots if all(isinstance(artist, Wedge) for artist in objects): - return GraphType.PIE + return ChartType.PIE # Check for Bar plots if all(isinstance(rect, Rectangle) for rect in objects): - return GraphType.BAR + return ChartType.BAR - return GraphType.UNKNOWN + return ChartType.UNKNOWN -def get_graph_from_ax( +def get_chart_from_ax( ax: Axes, -) -> LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph | Graph: - graph_type = _get_type_of_graph(ax) - - if graph_type == GraphType.LINE: - graph = LineGraph(ax=ax) - elif graph_type == GraphType.SCATTER: - graph = ScatterGraph(ax=ax) - elif graph_type == GraphType.BAR: - graph = BarGraph(ax=ax) - elif graph_type == GraphType.PIE: - graph = PieGraph(ax=ax) - elif graph_type == GraphType.BOX_AND_WHISKER: - graph = BoxAndWhiskerGraph(ax=ax) +) -> LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart | Chart: + chart_type = _get_type_of_chart(ax) + + if chart_type == ChartType.LINE: + chart = LineChart(ax=ax) + elif chart_type == ChartType.SCATTER: + chart = ScatterChart(ax=ax) + elif chart_type == ChartType.BAR: + chart = BarChart(ax=ax) + elif chart_type == ChartType.PIE: + chart = PieChart(ax=ax) + elif chart_type == ChartType.BOX_AND_WHISKER: + chart = BoxAndWhiskerChart(ax=ax) else: - graph = Graph(ax=ax, type=graph_type) + chart = Chart(ax=ax, type=chart_type) - return graph + return chart -def _figure_repr_e2b_graph_(self: Figure): +def _figure_repr_e2b_chart_(self: Figure): """ This method is used to extract data from the figure object to a dictionary """ @@ -448,11 +448,11 @@ def _figure_repr_e2b_graph_(self: Figure): if not axes: return {} elif len(axes) > 1: - graph = SuperGraph(figure=self) + chart = SuperChart(figure=self) else: ax = axes[0] - graph = get_graph_from_ax(ax) - return graph.model_dump() + chart = get_chart_from_ax(ax) + return chart.model_dump() except: return {} @@ -470,10 +470,10 @@ class E2BDataFormatter(BaseFormatter): type_printers = {pandas.DataFrame: _dataframe_repr_e2b_data_} -class E2BGraphFormatter(BaseFormatter): - format_type = Unicode("e2b/graph") +class E2BChartFormatter(BaseFormatter): + format_type = Unicode("e2b/chart") - print_method = ObjectName("_repr_e2b_data_") + print_method = ObjectName("_repr_e2b_chart_") _return_type = (dict, str) def __call__(self, obj): @@ -482,7 +482,7 @@ def __call__(self, obj): from matplotlib.pyplot import Figure if isinstance(obj, Figure): - return _figure_repr_e2b_graph_(obj) + return _figure_repr_e2b_chart_(obj) return super().__call__(obj) @@ -490,6 +490,6 @@ def __call__(self, obj): ip.display_formatter.formatters["e2b/data"] = E2BDataFormatter( parent=ip.display_formatter ) -ip.display_formatter.formatters["e2b/graph"] = E2BGraphFormatter( +ip.display_formatter.formatters["e2b/chart"] = E2BChartFormatter( parent=ip.display_formatter ) From 0146a2d1b3134cf202da7423a308e7620a0814b1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 11:35:25 -0700 Subject: [PATCH 380/722] Build template only on main --- .github/workflows/template.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index 6adf9eb3..4540b257 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -5,6 +5,8 @@ on: paths: - 'template/**' - '.github/workflows/template.yml' + branches: + - main permissions: contents: read From 5ee2c83258a675f05729b5105345690db2fb4c8b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 15 Oct 2024 11:51:27 -0700 Subject: [PATCH 381/722] Switch to new template --- js/src/sandbox.ts | 2 +- python/e2b_code_interpreter/constants.py | 2 +- template/e2b.toml | 11 ++++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 4a6d74ad..41f5a16d 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -13,7 +13,7 @@ export type Context = { * Code interpreter module for executing code in a stateful context. */ export class Sandbox extends BaseSandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-beta' + protected static override readonly defaultTemplate: string = 'code-interpreter-v1' /** * Run the code for the specified language. If no language is specified, Python is used. diff --git a/python/e2b_code_interpreter/constants.py b/python/e2b_code_interpreter/constants.py index 642dabc0..25d0ad73 100644 --- a/python/e2b_code_interpreter/constants.py +++ b/python/e2b_code_interpreter/constants.py @@ -1,3 +1,3 @@ -DEFAULT_TEMPLATE = "code-interpreter-beta" +DEFAULT_TEMPLATE = "code-interpreter-v1" JUPYTER_PORT = 49999 DEFAULT_TIMEOUT = 300 diff --git a/template/e2b.toml b/template/e2b.toml index 68c8bbfc..745d570e 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,16 +1,17 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (3e4rngfa34txe0gxc1zf) or 'template_name (code-interpreter-beta) from this config to spawn a sandbox: +# You can use 'template_id' (nlhz8vlwyupq845jsdg9) or 'template_name (code-interpreter-v1) from this config to spawn a sandbox: # Python SDK # from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-beta') +# sandbox = Sandbox(template='code-interpreter-v1') # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-beta' }) +# const sandbox = await Sandbox.create({ template: 'code-interpreter-v1' }) +team_id = "460355b3-4f64-48f9-9a16-4442817f79f5" memory_mb = 1_024 start_cmd = "/root/.jupyter/start-up.sh" dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-beta" -template_id = "3e4rngfa34txe0gxc1zf" +template_name = "code-interpreter-v1" +template_id = "nlhz8vlwyupq845jsdg9" From d363eaa9e4365903f14b9d1ae9efe9e69fe19148 Mon Sep 17 00:00:00 2001 From: Tereza Tizkova Date: Tue, 15 Oct 2024 16:15:18 -0700 Subject: [PATCH 382/722] Update readme --- README.md | 125 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 96 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 4c593087..e3d66644 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,51 @@

- e2b logo + e2b logo

+

- Code Interpreter SDK + E2B SDK

+

+ + Last 1 month downloads for the Python SDK + + + Last 1 month downloads for the Python SDK + +

+ + + +--- +### What is E2B? + +[E2B](https://www.e2b.dev/) is an open-source runtime for running AI-generated code in secure cloud Sandboxes. It's tailor-made for agentic & AI use cases. + +### E2B Sandbox +E2B Sandbox is a secure cloud environment that allows AI agents and apps. You can run multiple instances of Sandboxes, and have long-running sessions. Inside the Sandboxes, LLMs can use the same tools as humans do, e.g.: + +- Running LLM generated code +- Cloud browsers +- GitHub repositories and CLIs +- Coding tools like linters, autocomplete, "go-to defintion" +- Audio & video editing + -The Code Interpreter SDK is made to control the E2B Sandboxes - secure cloud environments for running LLM-generated code. The SDK lets you give your AI app a custom code interpreter. + +### E2B SDK + +The E2B SDK is made to control the E2B Sandboxes - secure cloud environments for running LLM-generated code. The SDK lets you give your AI app a custom code interpreter. - ✔️ Works with any LLM and AI framework (see [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) for examples) - ✔️ Supports streaming content like charts and stdout, stderr @@ -23,39 +57,72 @@ The Code Interpreter SDK is made to control the E2B Sandboxes - secure cloud env ##### 💻 Supported language runtimes - ✔️ Python -- [(Beta)](https://e2b.dev/docs/guide/beta-code-interpreter-language-runtimes) JavaScript, R, Java +- JavaScript +- R +- Java - -

- - Last 1 month downloads for the Python SDK - - - Last 1 month downloads for the Python SDK - -

+### 1. Install SDK ---- -### What is E2B? +JavaScript/TypeScript +``` +npm i @e2b/code-interpreter +``` -[E2B](https://www.e2b.dev/) is an open-source runtime for running AI-generated code in secure cloud Sandboxes. It's tailor-made for agentic & AI use cases. +Python +``` +pip install e2b_code_interpreter +``` - +### 2. Execute code with code interpreter inside Sandbox +**JavaScript** +```ts +import { CodeInterpreter } from '@e2b/code-interpreter' + +const sandbox = await CodeInterpreter.create() +await sandbox.notebook.execCell('x = 1') + +const execution = await sandbox.notebook.execCell('x+=1; x') +console.log(execution.text) // outputs 2 + +await sandbox.close() +``` + +**Python** +```py +from e2b_code_interpreter import CodeInterpreter + +with CodeInterpreter() as sandbox: + sandbox.notebook.exec_cell("x = 1") + + execution = sandbox.notebook.exec_cell("x+=1; x") + print(execution.text) # outputs 2 +``` + +### 3. More resources +> Check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to use our SDK. + +> See [E2B documentation](https://e2b.dev/docs) to get started. + +> Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. + + +## Repository Structure + +This repository is a monorepo containing: + +1. [Python SDK](/packages/python-sdk) +1. [JS SDK](/packages/js-sdk) +1. [CLI](/packages/cli) +1. [Documentation](/apps/web/) + +___
+ +linkedin + +discord + +linkedin +
\ No newline at end of file diff --git a/python/README.md b/python/README.md index 3756f4b6..d2b9db71 100644 --- a/python/README.md +++ b/python/README.md @@ -1,4 +1,22 @@ -# Code interpreter extension for Python +

+ e2b logo +

+ + +

+ Code interpreter extension for Python +

+ +

+ + Last 1 month downloads for the Python SDK + + + Last 1 month downloads for the Python SDK + +

The repository contains a template and modules for the code interpreter sandbox. It is based on the Jupyter server and implements the Jupyter Kernel messaging protocol. This allows for sharing context between code executions and improves support for plotting charts and other display-able data. @@ -87,3 +105,23 @@ print("world") with Sandbox() as sandbox: sandbox.run_code(code, on_stdout=print, on_stderr=print, on_result=(lambda result: print(result.text))) ``` + +### More resources +- Check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to use our SDK. + +- See [E2B documentation](https://e2b.dev/docs) to get started. + +- Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. + +___ + +
+ + +linkedin + +discord + +linkedin +
\ No newline at end of file From 0a43cf8b6d4c081df6f5b5fad0a88b9b8ca66227 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 01:04:01 -0700 Subject: [PATCH 388/722] Send error only once --- template/server/messaging.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/template/server/messaging.py b/template/server/messaging.py index cfa6786c..6d4635c8 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -41,6 +41,7 @@ def __init__(self, in_background: bool = False): ] ]() self.input_accepted = False + self.errored = False self.in_background = in_background @@ -232,6 +233,11 @@ async def _process_message(self, data: dict): logger.debug( f"Execution {parent_msg_ig} finished execution with error: {data['content']['ename']}: {data['content']['evalue']}" ) + + if execution.errored: + return + + execution.errored = True await queue.put( Error( name=data["content"]["ename"], @@ -295,6 +301,11 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "execute_reply": if data["content"]["status"] == "error": logger.debug(f"Execution {parent_msg_ig} finished execution with error") + + if execution.errored: + return + + execution.errored = True await queue.put( Error( name=data["content"]["ename"], From 3c9612a0728483dc23b9f8708374953be158371c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 01:12:16 -0700 Subject: [PATCH 389/722] Add on exit callback --- js/src/messaging.ts | 6 ++- js/src/sandbox.ts | 9 +++- js/tests/callbacks.test.ts | 44 +++++++++++++++++++ .../code_interpreter_async.py | 6 +++ .../code_interpreter_sync.py | 6 +++ python/e2b_code_interpreter/models.py | 3 ++ python/tests/async/test_async_callbacks.py | 38 ++++++++++++++++ python/tests/sync/test_callbacks.py | 36 +++++++++++++++ 8 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 js/tests/callbacks.test.ts create mode 100644 python/tests/async/test_async_callbacks.py create mode 100644 python/tests/sync/test_callbacks.py diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 389b5cc1..11f277f6 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -311,7 +311,8 @@ export async function parseOutput( line: string, onStdout?: (output: OutputMessage) => Promise | any, onStderr?: (output: OutputMessage) => Promise | any, - onResult?: (data: Result) => Promise | any + onResult?: (data: Result) => Promise | any, + onError?: (error: ExecutionError) => Promise | any ) { const msg = JSON.parse(line) @@ -348,6 +349,9 @@ export async function parseOutput( break case 'error': execution.error = new ExecutionError(msg.name, msg.value, msg.traceback) + if (onError) { + await onError(execution.error) + } break case 'number_of_executions': execution.executionCount = msg.execution_count diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 41f5a16d..a7386d9e 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -1,6 +1,6 @@ import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b' -import { Result, Execution, OutputMessage, parseOutput, extractError } from './messaging' +import {Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError} from './messaging' import { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from "./utils"; import { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts' export type Context = { @@ -25,6 +25,7 @@ export class Sandbox extends BaseSandbox { * @param opts.onStdout Callback for handling stdout messages * @param opts.onStderr Callback for handling stderr messages * @param opts.onResult Callback for handling the final result + * @param opts.onError Callback for handling the `ExecutionError` object * @param opts.envs Environment variables to set for the execution * @param opts.timeoutMs Max time to wait for the execution to finish * @param opts.requestTimeoutMs Max time to wait for the request to finish @@ -37,6 +38,7 @@ async runCode( onStdout?: (output: OutputMessage) => (Promise | any), onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), + onError?: (error: ExecutionError) => (Promise | any), envs?: Record, timeoutMs?: number, requestTimeoutMs?: number, @@ -52,6 +54,7 @@ async runCode( * @param opts.onStdout Callback for handling stdout messages * @param opts.onStderr Callback for handling stderr messages * @param opts.onResult Callback for handling the final result + * @param opts.onError Callback for handling the `ExecutionError` object * @param opts.envs Environment variables to set for the execution * @param opts.timeoutMs Max time to wait for the execution to finish * @param opts.requestTimeoutMs Max time to wait for the request to finish @@ -64,6 +67,7 @@ async runCode( onStdout?: (output: OutputMessage) => (Promise | any), onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), + onError?: (error: ExecutionError) => (Promise | any), envs?: Record, timeoutMs?: number, requestTimeoutMs?: number, @@ -77,6 +81,7 @@ async runCode( onStdout?: (output: OutputMessage) => (Promise | any), onStderr?: (output: OutputMessage) => (Promise | any), onResult?: (data: Result) => (Promise | any), + onError?: (error: ExecutionError) => (Promise | any), envs?: Record, timeoutMs?: number, requestTimeoutMs?: number, @@ -135,7 +140,7 @@ async runCode( try { for await (const chunk of readLines(res.body)) { - await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult) + await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError) } } catch (error) { throw formatExecutionTimeoutError(error) diff --git a/js/tests/callbacks.test.ts b/js/tests/callbacks.test.ts new file mode 100644 index 00000000..aeb26e22 --- /dev/null +++ b/js/tests/callbacks.test.ts @@ -0,0 +1,44 @@ +import { expect } from 'vitest' + +import { sandboxTest } from './setup' + +sandboxTest('callback results', async ({ sandbox }) => { + const results = [] + const result = await sandbox.runCode('x =1; x', { + onResult: (result) => results.push(result), + }) + + expect(results.length).toBe(1) + expect(result.results[0].text).toBe('1') +}) + + +sandboxTest('callback error', async ({ sandbox }) => { + const errors = [] + const result = await sandbox.runCode('xyz', { + onError: (error) => errors.push(error), + }) + + expect(errors.length).toBe(1) + expect(result.error.name).toBe('NameError') +}) + +sandboxTest('callback stdout', async ({ sandbox }) => { + const stdout = [] + const result = await sandbox.runCode('print("hello")', { + onStdout: (out) => stdout.push(out), + }) + + expect(stdout.length).toBe(1) + expect(result.logs.stdout).toEqual(['hello\n']) +}) + +sandboxTest('callback stderr', async ({ sandbox }) => { + const stderr = [] + const result = await sandbox.runCode('import sys;print("This is an error message", file=sys.stderr)', { + onStderr: (err) => stderr.push(err), + }) + + expect(stderr.length).toBe(1) + expect(result.logs.stderr).toEqual(['This is an error message\n']) +}) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 750b38cc..3083e748 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -17,6 +17,7 @@ ) from e2b_code_interpreter.models import ( Execution, + ExecutionError, Context, Result, aextract_exception, @@ -54,6 +55,7 @@ async def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -67,6 +69,7 @@ async def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -80,6 +83,7 @@ async def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -94,6 +98,7 @@ async def run_code( :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object :param envs: Environment variables :param timeout: Max time to wait for the execution to finish :param request_timeout: Max time to wait for the request to finish @@ -136,6 +141,7 @@ async def run_code( on_stdout=on_stdout, on_stderr=on_stderr, on_result=on_result, + on_error=on_error, ) return execution diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index b32ff91f..46b6d5bd 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -11,6 +11,7 @@ DEFAULT_TIMEOUT, ) from e2b_code_interpreter.models import ( + ExecutionError, Execution, Context, Result, @@ -46,6 +47,7 @@ def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -59,6 +61,7 @@ def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -72,6 +75,7 @@ def run_code( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -86,6 +90,7 @@ def run_code( :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object :param envs: Environment variables :param timeout: Max time to wait for the execution to finish :param request_timeout: Max time to wait for the request to finish @@ -128,6 +133,7 @@ def run_code( on_stdout=on_stdout, on_stderr=on_stderr, on_result=on_result, + on_error=on_error, ) return execution diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index d15f848d..fcb69e57 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -394,6 +394,7 @@ def parse_output( on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, ): data = json.loads(output) data_type = data.pop("type") @@ -413,6 +414,8 @@ def parse_output( on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": execution.error = ExecutionError(data["name"], data["value"], data["traceback"]) + if on_error: + on_error(execution.error) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] diff --git a/python/tests/async/test_async_callbacks.py b/python/tests/async/test_async_callbacks.py new file mode 100644 index 00000000..a4fb9d0a --- /dev/null +++ b/python/tests/async/test_async_callbacks.py @@ -0,0 +1,38 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def test_resuls(async_sandbox: AsyncSandbox): + results = [] + execution = await async_sandbox.run_code( + "x = 1;x", on_result=lambda result: results.append(result) + ) + assert len(results) == 1 + assert execution.results[0].text == "1" + + +async def test_error(async_sandbox: AsyncSandbox): + errors = [] + execution = await async_sandbox.run_code( + "xyz", on_error=lambda error: errors.append(error) + ) + assert len(errors) == 1 + assert execution.error.name == "NameError" + + +async def test_stdout(async_sandbox: AsyncSandbox): + stdout = [] + execution = await async_sandbox.run_code( + "print('Hello from e2b')", on_stdout=lambda out: stdout.append(out) + ) + assert len(stdout) == 1 + assert execution.logs.stdout == ["Hello from e2b\n"] + + +async def test_stderr(async_sandbox: AsyncSandbox): + stderr = [] + execution = await async_sandbox.run_code( + 'import sys;print("This is an error message", file=sys.stderr)', + on_stderr=lambda err: stderr.append(err), + ) + assert len(stderr) == 1 + assert execution.logs.stderr == ["This is an error message\n"] diff --git a/python/tests/sync/test_callbacks.py b/python/tests/sync/test_callbacks.py new file mode 100644 index 00000000..54c3359b --- /dev/null +++ b/python/tests/sync/test_callbacks.py @@ -0,0 +1,36 @@ +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +def test_resuls(sandbox: Sandbox): + results = [] + execution = sandbox.run_code( + "x = 1;x", on_result=lambda result: results.append(result) + ) + assert len(results) == 1 + assert execution.results[0].text == "1" + + +def test_error(sandbox: Sandbox): + errors = [] + execution = sandbox.run_code("xyz", on_error=lambda error: errors.append(error)) + assert len(errors) == 1 + assert execution.error.name == "NameError" + + +def test_stdout(sandbox: Sandbox): + stdout = [] + execution = sandbox.run_code( + "print('Hello from e2b')", on_stdout=lambda out: stdout.append(out) + ) + assert len(stdout) == 1 + assert execution.logs.stdout == ["Hello from e2b\n"] + + +def test_stderr(sandbox: Sandbox): + stderr = [] + execution = sandbox.run_code( + 'import sys;print("This is an error message", file=sys.stderr)', + on_stderr=lambda err: stderr.append(err), + ) + assert len(stderr) == 1 + assert execution.logs.stderr == ["This is an error message\n"] From d13e3602088c5fc322e6ad72b4f9f9c08d65e901 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 02:05:48 -0700 Subject: [PATCH 390/722] Add changeset --- .changeset/pink-weeks-call.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/pink-weeks-call.md diff --git a/.changeset/pink-weeks-call.md b/.changeset/pink-weeks-call.md new file mode 100644 index 00000000..3ffd0cad --- /dev/null +++ b/.changeset/pink-weeks-call.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': major +'@e2b/code-interpreter': major +--- + +New improved SDK From aa3699ea1800dbb0391abb7ef508d9d5233ff5cd Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 16 Oct 2024 02:12:50 -0700 Subject: [PATCH 391/722] Update JS docstrings --- js/src/charts.ts | 3 + js/src/index.ts | 2 +- js/src/messaging.ts | 18 +++- js/src/sandbox.ts | 211 +++++++++++++++++++++++++++++--------------- 4 files changed, 159 insertions(+), 75 deletions(-) diff --git a/js/src/charts.ts b/js/src/charts.ts index d711a4ef..821725b2 100644 --- a/js/src/charts.ts +++ b/js/src/charts.ts @@ -27,6 +27,9 @@ export enum ScaleType { ASINH = "asinh", } +/** + * Represents a chart. + */ export type Chart = { type: ChartType title: string diff --git a/js/src/index.ts b/js/src/index.ts index 69faa9d9..2ad762ba 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,7 +1,7 @@ export * from 'e2b' export { Sandbox } from './sandbox' -export type { Context } from './sandbox' +export type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox' export type { Logs, ExecutionError, diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 11f277f6..e6832936 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -18,15 +18,24 @@ export async function extractError(res: Response) { } } +/** + * Represents an output message from the sandbox code execution. + */ export class OutputMessage { constructor( + /** + * The output line. + */ public readonly line: string, /** - * Unix epoch in nanoseconds + * Unix epoch in nanoseconds. */ public readonly timestamp: number, + /** + * Whether the output is an error. + */ public readonly error: boolean - ) {} + ) { } public toString() { return this.line @@ -51,7 +60,7 @@ export class ExecutionError { * The raw traceback of the error. **/ public traceback: string - ) {} + ) { } } /** @@ -59,6 +68,7 @@ export class ExecutionError { */ export type MIMEType = string + type E2BData = { data: Record chart: ChartTypes @@ -281,7 +291,7 @@ export class Execution { * Execution count of the cell. */ public executionCount?: number - ) {} + ) { } /** * Returns the text representation of the main result of the cell. diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index a7386d9e..5a81a26c 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -1,90 +1,170 @@ import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b' -import {Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError} from './messaging' +import { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging' import { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from "./utils"; import { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts' + +/** + * Represents a context for code execution. + */ export type Context = { + /** + * The ID of the context. + */ id: string + /** + * The language of the context. + */ language: string + /** + * The working directory of the context. + */ cwd: string } /** - * Code interpreter module for executing code in a stateful context. + * Options for running code. + */ +export interface RunCodeOpts { + /** + * Callback for handling stdout messages. + */ + onStdout?: (output: OutputMessage) => (Promise | any), + /** + * Callback for handling stderr messages. + */ + onStderr?: (output: OutputMessage) => (Promise | any), + /** + * Callback for handling the final execution result. + */ + onResult?: (data: Result) => (Promise | any), + /** + * Callback for handling the `ExecutionError` object. + */ + onError?: (error: ExecutionError) => (Promise | any), + /** + * Custom environment variables for code execution. + * + * @default {} + */ + envs?: Record, + /** + * Timeout for the code execution in **milliseconds**. + * + * @default 60_000 // 60 seconds + */ + timeoutMs?: number, + /** + * Timeout for the request in **milliseconds**. + * + * @default 30_000 // 30 seconds + */ + requestTimeoutMs?: number, +} + +/** + * Options for creating a code context. + */ +export interface CreateCodeContextOpts { + /** + * Working directory for the context. + * + * @default /home/user + */ + cwd?: string, + /** + * Language for the context. + * + * @default python + */ + language?: string, + /** + * Timeout for the request in **milliseconds**. + * + * @default 30_000 // 30 seconds + */ + requestTimeoutMs?: number, +} + +/** + * Extension for Sandbox that allows executing code with a stateful context. */ export class Sandbox extends BaseSandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-v1' /** - * Run the code for the specified language. If no language is specified, Python is used. + * Run the code as Python. + * + * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + * * You can reference previously defined variables, imports, and functions in the code. * - * @param code The code to execute - * @param opts Options for executing the code - * @param opts.language Based on the value, a default context for the language is used. If not defined, the default Python context is used. - * @param opts.onStdout Callback for handling stdout messages - * @param opts.onStderr Callback for handling stderr messages - * @param opts.onResult Callback for handling the final result - * @param opts.onError Callback for handling the `ExecutionError` object - * @param opts.envs Environment variables to set for the execution - * @param opts.timeoutMs Max time to wait for the execution to finish - * @param opts.requestTimeoutMs Max time to wait for the request to finish - * @returns Execution object - */ -async runCode( + * @param code code to execute. + * @param opts options for executing the code. + * + * @returns `Execution` result object. + */ + async runCode( + code: string, + opts?: RunCodeOpts & { + /** + * Language to use for code execution. + * + * If not defined, the default Python context is used. + */ + language?: 'python', + }, + ): Promise + /** + * Run the code for the specified language. + * + * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + * If no language is specified, Python is used. + * + * You can reference previously defined variables, imports, and functions in the code. + * + * @param code code to execute. + * @param opts options for executing the code. + * + * @returns `Execution` result object. + */ + async runCode( code: string, - opts?: { + opts?: RunCodeOpts & { + /** + * Language to use for code execution. + * + * If not defined, the default Python context is used. + */ language?: string, - onStdout?: (output: OutputMessage) => (Promise | any), - onStderr?: (output: OutputMessage) => (Promise | any), - onResult?: (data: Result) => (Promise | any), - onError?: (error: ExecutionError) => (Promise | any), - envs?: Record, - timeoutMs?: number, - requestTimeoutMs?: number, }, ): Promise - /** + /** * Runs the code in the specified context, if not specified, the default context is used. + * + * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + * * You can reference previously defined variables, imports, and functions in the code. * - * @param code The code to execute - * @param opts Options for executing the code - * @param opts.context Concrete context to run the code in. If not specified, the default Python context is used. - * @param opts.onStdout Callback for handling stdout messages - * @param opts.onStderr Callback for handling stderr messages - * @param opts.onResult Callback for handling the final result - * @param opts.onError Callback for handling the `ExecutionError` object - * @param opts.envs Environment variables to set for the execution - * @param opts.timeoutMs Max time to wait for the execution to finish - * @param opts.requestTimeoutMs Max time to wait for the request to finish - * @returns Execution object + * @param code code to execute. + * @param opts options for executing the code + * + * @returns `Execution` result object */ async runCode( code: string, - opts?: { + opts?: RunCodeOpts & { + /** + * Context to run the code in. + */ context?: Context, - onStdout?: (output: OutputMessage) => (Promise | any), - onStderr?: (output: OutputMessage) => (Promise | any), - onResult?: (data: Result) => (Promise | any), - onError?: (error: ExecutionError) => (Promise | any), - envs?: Record, - timeoutMs?: number, - requestTimeoutMs?: number, }, ): Promise async runCode( code: string, - opts?: { + opts?: RunCodeOpts & { language?: string, context?: Context, - onStdout?: (output: OutputMessage) => (Promise | any), - onStderr?: (output: OutputMessage) => (Promise | any), - onResult?: (data: Result) => (Promise | any), - onError?: (error: ExecutionError) => (Promise | any), - envs?: Record, - timeoutMs?: number, - requestTimeoutMs?: number, }, ): Promise { if (opts?.context && opts?.language) { @@ -157,20 +237,11 @@ async runCode( /** * Creates a new context to run code in. * - * @param cwd The working directory for the context - * @param language The name of the context - * @param requestTimeoutMs Max time to wait for the request to finish - * @returns The context ID - */ - async createCodeContext({ - cwd, - language, - requestTimeoutMs, - }: { - cwd?: string, - language?: string, - requestTimeoutMs?: number, - } = {}): Promise { + * @param opts options for creating the context. + * + * @returns context object. + */ + async createCodeContext(opts?: CreateCodeContextOpts): Promise { try { const res = await fetch(`${this.jupyterUrl}/contexts`, { @@ -179,11 +250,11 @@ async runCode( 'Content-Type': 'application/json', }, body: JSON.stringify({ - language: language, - cwd, + language: opts?.language, + cwd: opts?.cwd, }), keepalive: true, - signal: this.connectionConfig.getSignal(requestTimeoutMs), + signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs), }) const error = await extractError(res) @@ -198,6 +269,6 @@ async runCode( } protected get jupyterUrl(): string { - return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}` + return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}` } } From 2c42a214c7d4f56ef81368bde71f4edffc0cee99 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 16 Oct 2024 02:18:28 -0700 Subject: [PATCH 392/722] Update JS class description --- js/src/sandbox.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 5a81a26c..63ee31fa 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -87,7 +87,25 @@ export interface CreateCodeContextOpts { } /** - * Extension for Sandbox that allows executing code with a stateful context. + * E2B cloud sandbox is a secure and isolated cloud environment. + * + * The sandbox allows you to: + * - Access Linux OS + * - Create, list, and delete files and directories + * - Run commands + * - Run isolated code + * - Access the internet + * + * Check docs [here](https://e2b.dev/docs). + * + * Use {@link Sandbox.create} to create a new sandbox. + * + * @example + * ```ts + * import { Sandbox } from '@e2b/code-interpreter' + * + * const sandbox = await Sandbox.create() + * ``` */ export class Sandbox extends BaseSandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-v1' From fc5c52a4243e628016d1364cb533e53bd7a86ee2 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Wed, 16 Oct 2024 02:41:44 -0700 Subject: [PATCH 393/722] Update python SDK docstrings --- js/src/sandbox.ts | 1 - .../code_interpreter_async.py | 121 ++++++++++++++---- .../code_interpreter_sync.py | 121 ++++++++++++++---- python/e2b_code_interpreter/models.py | 32 +++++ 4 files changed, 230 insertions(+), 45 deletions(-) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 63ee31fa..74db4c9e 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -261,7 +261,6 @@ export class Sandbox extends BaseSandbox { */ async createCodeContext(opts?: CreateCodeContextOpts): Promise { try { - const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'POST', headers: { diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 3083e748..9b835ca3 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload +from typing import Optional, Dict, overload, Union, Literal from httpx import AsyncClient from e2b import ( @@ -34,6 +34,27 @@ class AsyncSandbox(BaseAsyncSandbox): + """ + E2B cloud sandbox is a secure and isolated cloud environment. + + The sandbox allows you to: + - Access Linux OS + - Create, list, and delete files and directories + - Run commands + - Run isolated code + - Access the internet + + Check docs [here](https://e2b.dev/docs). + + Use the `AsyncSandbox.create()` to create a new sandbox. + + Example: + ```python + from e2b_code_interpreter import AsyncSandbox + sandbox = await AsyncSandbox.create() + ``` + """ + default_template = DEFAULT_TEMPLATE def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): @@ -51,7 +72,7 @@ def _client(self) -> AsyncClient: async def run_code( self, code: str, - language: Optional[str] = None, + language: Union[Literal["python"], None] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -59,13 +80,33 @@ async def run_code( envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ) -> Execution: ... + ) -> Execution: + """ + Runs the code as Python. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + + You can reference previously defined variables, imports, and functions in the code. + + :param code: Code to execute + :param language: Language to use for code execution. If not defined, the default Python context is used. + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object + """ + ... @overload async def run_code( self, code: str, - context: Optional[Context] = None, + language: Optional[str] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -73,12 +114,33 @@ async def run_code( envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ) -> Execution: ... + ) -> Execution: + """ + Runs the code for the specified language. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + If no language is specified, Python is used. + + You can reference previously defined variables, imports, and functions in the code. + :param code: Code to execute + :param language: Language to use for code execution. If not defined, the default Python context is used. + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object + """ + ... + + @overload async def run_code( self, code: str, - language: Optional[str] = None, context: Optional[Context] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, @@ -89,21 +151,39 @@ async def run_code( request_timeout: Optional[float] = None, ) -> Execution: """ - Runs the code in the specified language/context, if not specified, the default context is used. + Runs the code in the specified context, if not specified, the default context is used. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + You can reference previously defined variables, imports, and functions in the code. - :param code: The code to execute - :param language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. - :param context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. + :param code: Code to execute + :param context: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object :param on_error: Callback for the `ExecutionError` object - :param envs: Environment variables - :param timeout: Max time to wait for the execution to finish - :param request_timeout: Max time to wait for the request to finish - :return: Execution object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object """ + ... + + async def run_code( + self, + code: str, + language: Optional[str] = None, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: logger.debug(f"Executing code {code}") if context and language: @@ -154,17 +234,16 @@ async def create_code_context( self, cwd: Optional[str] = None, language: Optional[str] = None, - envs: Optional[Dict[str, str]] = None, request_timeout: Optional[float] = None, ) -> Context: """ Creates a new context to run code in. - :param cwd: Set the current working directory for the context - :param language: Language of the context. If not specified, the default Python context is used. - :param envs: Environment variables - :param request_timeout: Max time to wait for the request to finish - :return: Context id + :param cwd: Set the current working directory for the context, defaults to `/home/user` + :param language: Language of the context. If not specified, defaults to Python + :param request_timeout: Timeout for the request in **milliseconds** + + :return: Context object """ logger.debug(f"Creating new {language} context") @@ -173,8 +252,6 @@ async def create_code_context( data["language"] = language if cwd: data["cwd"] = cwd - if envs: - data["env_vars"] = envs try: response = await self._client.post( diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 46b6d5bd..22c47c0d 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload +from typing import Optional, Dict, overload, Literal, Union from httpx import Client from e2b import Sandbox as BaseSandbox, InvalidArgumentException @@ -29,6 +29,28 @@ class Sandbox(BaseSandbox): + """ + E2B cloud sandbox is a secure and isolated cloud environment. + + The sandbox allows you to: + - Access Linux OS + - Create, list, and delete files and directories + - Run commands + - Run isolated code + - Access the internet + + Check docs [here](https://e2b.dev/docs). + + Use the `Sandbox()` to create a new sandbox. + + Example: + ```python + from e2b_code_interpreter import Sandbox + + sandbox = Sandbox() + ``` + """ + default_template = DEFAULT_TEMPLATE @property @@ -43,7 +65,7 @@ def _client(self) -> Client: def run_code( self, code: str, - language: Optional[str] = None, + language: Union[Literal["python"], None] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -51,13 +73,33 @@ def run_code( envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ) -> Execution: ... + ) -> Execution: + """ + Runs the code as Python. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + + You can reference previously defined variables, imports, and functions in the code. + + :param code: Code to execute + :param language: Language to use for code execution. If not defined, the default Python context is used. + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object + """ + ... @overload def run_code( self, code: str, - context: Optional[Context] = None, + language: Optional[str] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -65,12 +107,33 @@ def run_code( envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, - ) -> Execution: ... + ) -> Execution: + """ + Runs the code for the specified language. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + If no language is specified, Python is used. + You can reference previously defined variables, imports, and functions in the code. + + :param code: Code to execute + :param language: Language to use for code execution. If not defined, the default Python context is used. + :param on_stdout: Callback for stdout messages + :param on_stderr: Callback for stderr messages + :param on_result: Callback for the `Result` object + :param on_error: Callback for the `ExecutionError` object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object + """ + ... + + @overload def run_code( self, code: str, - language: Optional[str] = None, context: Optional[Context] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, @@ -81,22 +144,39 @@ def run_code( request_timeout: Optional[float] = None, ) -> Execution: """ - Runs the code in the specified language/context, if not specified, the default context is used. + Runs the code in the specified context, if not specified, the default context is used. + + Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + You can reference previously defined variables, imports, and functions in the code. - :param code: The code to execute - :param language Based on the value, a default context for the language is used. If not defined and no context is provided, the default Python context is used. - :param context Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. + :param code: Code to execute + :param context: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. :param on_stdout: Callback for stdout messages :param on_stderr: Callback for stderr messages :param on_result: Callback for the `Result` object :param on_error: Callback for the `ExecutionError` object - :param envs: Environment variables - :param timeout: Max time to wait for the execution to finish - :param request_timeout: Max time to wait for the request to finish - :return: Execution object + :param envs: Custom environment variables + :param timeout: Timeout for the code execution in **seconds** + :param request_timeout: Timeout for the request in **seconds** + + :return: `Execution` result object """ + ... + def run_code( + self, + code: str, + language: Optional[str] = None, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None, + ) -> Execution: logger.debug(f"Executing code {code}") if language and context: @@ -146,17 +226,16 @@ def create_code_context( self, cwd: Optional[str] = None, language: Optional[str] = None, - envs: Optional[Dict[str, str]] = None, request_timeout: Optional[float] = None, ) -> Context: """ Creates a new context to run code in. - :param cwd: Set the current working directory for the context - :param language: Language of the context. If not specified, the default Python context is used. - :param envs: Environment variables - :param request_timeout: Max time to wait for the request to finish - :return: Context id + :param cwd: Set the current working directory for the context, defaults to `/home/user` + :param language: Language of the context. If not specified, defaults to Python + :param request_timeout: Timeout for the request in **milliseconds** + + :return: Context object """ logger.debug(f"Creating new {language} context") @@ -165,8 +244,6 @@ def create_code_context( data["language"] = language if cwd: data["cwd"] = cwd - if envs: - data["env_vars"] = envs try: response = self._client.post( diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index fcb69e57..04df1a0e 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -30,12 +30,22 @@ @dataclass class OutputMessage: + """ + Represents an output message from the sandbox code execution. + """ + line: str + """ + The output line. + """ timestamp: int """ Unix epoch in nanoseconds """ error: bool = False + """ + Whether the output is an error. + """ def __str__(self): return self.line @@ -49,8 +59,17 @@ class ExecutionError: """ name: str + """ + Name of the error. + """ value: str + """ + Value of the error. + """ traceback: str + """ + The raw traceback of the error. + """ def __init__(self, name: str, value: str, traceback: str, **kwargs): self.name = name @@ -422,9 +441,22 @@ def parse_output( @dataclass class Context: + """ + Represents a context for code execution. + """ + id: str + """ + The ID of the context. + """ language: str + """ + The language of the context. + """ cwd: str + """ + The working directory of the context. + """ def __init__(self, context_id: str, language: str, cwd: str, **kwargs): self.id = context_id From ec93ffe89b9f0bd49865d51a040e54c96f93132d Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 02:45:54 -0700 Subject: [PATCH 394/722] Update README.md --- README.md | 107 +++++++++++------------------------------------------- 1 file changed, 21 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 35bd1e86..970927ce 100644 --- a/README.md +++ b/README.md @@ -2,86 +2,48 @@ e2b logo

- -

- E2B SDK -

-

Last 1 month downloads for the Python SDK - Last 1 month downloads for the Python SDK

+## What is E2B? +[E2B](https://www.e2b.dev/) is an open-source infrastructure that allows you run to AI-generated code in secure isolated sandboxes in the cloud. To start and control sandboxes, use our [JavaScript SDK](https://www.npmjs.com/package/@e2b/code-interpreter) or [Python SDK](https://pypi.org/project/e2b_code_interpreter). ---- -### What is E2B? - -[E2B](https://www.e2b.dev/) is an open-source runtime for running AI-generated code in secure cloud Sandboxes. It's tailor-made for agentic & AI use cases. - -### E2B Sandbox -E2B Sandbox is a secure cloud environment that allows AI agents and apps. You can run multiple instances of Sandboxes, and have long-running sessions. Inside the Sandboxes, LLMs can use the same tools as humans do, e.g.: - -- Running LLM generated code -- Cloud browsers -- GitHub repositories and CLIs -- Coding tools like linters, autocomplete, "go-to defintion" -- Audio & video editing - - - -### E2B SDK - -The E2B SDK is made to control the E2B Sandboxes - secure cloud environments for running LLM-generated code. The SDK lets you give your AI app a custom code interpreter. - -- ✔️ Works with any LLM and AI framework (see [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) for examples) -- ✔️ Supports streaming content like charts and stdout, stderr -- ✔️ Python & JS SDK -- ✔️ Runs on serverless and edge functions -- ✔️ Runs AI-generated code in secure sandboxed environments -- ✔️ 100% open source (including [infrastructure](https://github.com/e2b-dev/infra)) - - -##### 💻 Supported language runtimes -- ✔️ Python -- JavaScript -- R -- Java - - -

- Start with E2B SDK -

- +## Run your first Sandbox ### 1. Install SDK -JavaScript/TypeScript +JavaScript / TypeScript ``` npm i @e2b/code-interpreter ``` Python ``` -pip install e2b +pip install e2b-code-interpreter +``` + +### 2. Get your E2B API key +1. Sign up to E2B [here](https://e2b.dev). +2. Get your API key [here](https://e2b.dev/dashboard?tab=keys). +3. Set environment variable with your API key ``` +E2B_API_KEY=e2b_*** +``` -### 2. Execute code with code interpreter inside Sandbox +### 3. Execute code with code interpreter inside Sandbox -**JavaScript** +JavaScript / TypeScript ```ts import { Sandbox } from '@e2b/code-interpreter' @@ -90,47 +52,20 @@ await sbx.runCode()('x = 1') const execution = await sbx.runCode()('x+=1; x') console.log(execution.text) // outputs 2 - -await sandbox.close() ``` -**Python** +Python ```py from e2b_code_interpreter import Sandbox with Sandbox() as sandbox: sandbox.run_code()("x = 1") - execution = sandbox.run_code()("x+=1; x") print(execution.text) # outputs 2 ``` -### 3. More resources -- Check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to use our SDK. - -- See [E2B documentation](https://e2b.dev/docs) to get started. - -- Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. - - -## Repository Structure - -This repository is a monorepo containing: - -1. [Python SDK](/packages/python-sdk) -1. [JS SDK](/packages/js-sdk) -1. [CLI](/packages/cli) -1. [Documentation](/apps/web/) - -___ +### 4. Check docs +Visit [E2B documentation](https://e2b.dev/docs). -
- - -linkedin - -discord - -linkedin -
\ No newline at end of file +### 5. E2B cookbook +Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. From c03f6bdffec55d1cd291c46a7e1325d39c077809 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 02:31:01 -0700 Subject: [PATCH 395/722] Improve order in Dockerfile --- template/Dockerfile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/template/Dockerfile b/template/Dockerfile index 91a43a4a..57171089 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -1,7 +1,6 @@ FROM python:3.10.14 ENV JAVA_HOME=/opt/java/openjdk -COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ @@ -23,11 +22,6 @@ RUN apt-get update && apt-get install -y r-base RUN R -e "install.packages('IRkernel')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" -# Java Kernel -RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ - unzip ijava-1.3.0.zip && \ - python install.py --sys-prefix - # Javascript Kernel RUN npm install -g node-gyp RUN npm install -g --unsafe-perm ijavascript @@ -58,5 +52,12 @@ COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup + +COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME +# Java Kernel +RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ + unzip ijava-1.3.0.zip && \ + python install.py --sys-prefix + # Setup entrypoint for local development ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh From 90cecaef3021fcd67b1224f1087783573a7744e0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 02:56:27 -0700 Subject: [PATCH 396/722] Skip Bun tests --- .github/workflows/js_tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index e2ab1110..eeea0e6b 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -54,11 +54,11 @@ jobs: uses: oven-sh/setup-bun@v2 with: version: 1.1.x - - - name: Run Bun tests - run: pnpm test:bun - env: - E2B_API_KEY: ${{ secrets.E2B_API_KEY }} +# +# - name: Run Bun tests +# run: pnpm test:bun +# env: +# E2B_API_KEY: ${{ secrets.E2B_API_KEY }} - name: Install Deno uses: denoland/setup-deno@v1 From 76d5b44f175d5d1e8164bb659035f5bbe37c1ddf Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 03:29:25 -0700 Subject: [PATCH 397/722] Use new SDK version --- js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/js/package.json b/js/package.json index 05c508b8..397278c9 100644 --- a/js/package.json +++ b/js/package.json @@ -63,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "0.16.2-beta.40" + "e2b": "^1.0.0" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e76d779..8b62a795 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: js: dependencies: e2b: - specifier: 0.16.2-beta.40 - version: 0.16.2-beta.40 + specifier: ^1.0.0 + version: 1.0.0 devDependencies: '@types/node': specifier: ^18.18.6 @@ -1111,8 +1111,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@0.16.2-beta.40: - resolution: {integrity: sha512-tWZiNUxuadG5S8nl/Yya29ZBojISzGxt9E+W6bhbJA/zB5iHI78u/bRRVueHL9FiCNVi1gviR+9O/IRpnmfSpA==} + e2b@1.0.0: + resolution: {integrity: sha512-HCxcLWrLbV+Si87QDRGPLbhS1o+Cm6voUW4mSbApAHnm4bZegIWhd3x80O4cwmYaMNWfhbJUmqasCN++iOgiew==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -4045,7 +4045,7 @@ snapshots: dotenv@16.4.5: {} - e2b@0.16.2-beta.40: + e2b@1.0.0: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) diff --git a/python/poetry.lock b/python/poetry.lock index f4dc0128..45de49fe 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -125,13 +125,13 @@ files = [ [[package]] name = "e2b" -version = "0.17.2a50" +version = "1.0.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-0.17.2a50-py3-none-any.whl", hash = "sha256:ff60a96df5df4fc2fe3bf104218f3c36f2ab98f21db0cddb29ac74f1922fcc02"}, - {file = "e2b-0.17.2a50.tar.gz", hash = "sha256:14989853ddee5f75d4b651a275ff2445f2c3cc24f53fb061921c12823f7d81de"}, + {file = "e2b-1.0.0-py3-none-any.whl", hash = "sha256:25815ce38781a5e3a0fb8d7249dfd3de2c8542434bf4e6b0b963cbd79bb46546"}, + {file = "e2b-1.0.0.tar.gz", hash = "sha256:c60af575d96ab0fef463f8ba59f721589857bbeadf856c9cc4359d1047d305d8"}, ] [package.dependencies] @@ -483,4 +483,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "29a10c991245e83e5aa9c70076b288e0d80cb6b7fe4b8e0611b051099a6757f2" +content-hash = "73cfafb6bfa149e04ecef81d45f5e944b0dce0ba826d44c36956d91aa2b0258d" diff --git a/python/pyproject.toml b/python/pyproject.toml index 25ce3597..c88679c0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "^0.17.2a50" +e2b = "^1.0.0" [tool.poetry.group.dev.dependencies] black = "^24.3.0" From 3862cbc41b8ab76033a8bff15cec2a447f9b63cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 10:44:21 +0000 Subject: [PATCH 398/722] [skip ci] Release new versions --- .changeset/pink-weeks-call.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/pink-weeks-call.md diff --git a/.changeset/pink-weeks-call.md b/.changeset/pink-weeks-call.md deleted file mode 100644 index 3ffd0cad..00000000 --- a/.changeset/pink-weeks-call.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': major -'@e2b/code-interpreter': major ---- - -New improved SDK diff --git a/js/package.json b/js/package.json index 397278c9..2d3ce2a5 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "0.0.9-beta.72", + "version": "1.0.0", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/package.json b/python/package.json index a263f022..c10b4e18 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "0.0.10", + "version": "1.0.0", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/python/pyproject.toml b/python/pyproject.toml index c88679c0..749a4515 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "0.0.11b47" +version = "1.0.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 26517a84563b650db33fd8b3c72c4ebd157045ef Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 03:48:52 -0700 Subject: [PATCH 399/722] [skip CI] Remove console log --- js/tests/defaultKernels.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts index 4c0779d1..8a7b7f65 100644 --- a/js/tests/defaultKernels.test.ts +++ b/js/tests/defaultKernels.test.ts @@ -4,6 +4,5 @@ import { sandboxTest } from './setup' sandboxTest('test js kernel', async ({ sandbox }) => { const output = await sandbox.runCode('console.log("Hello World!")', { language: 'js' }) - console.log(output) expect(output.logs.stdout).toEqual(['Hello World!\n']) }) From 18b3fb087b07fe9259389cca627f1465b1d4a510 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:12:33 -0700 Subject: [PATCH 400/722] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 970927ce..65b8ee56 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,9 @@ JavaScript / TypeScript import { Sandbox } from '@e2b/code-interpreter' const sandbox = await Sandbox.create() -await sbx.runCode()('x = 1') +await sbx.runCode('x = 1') -const execution = await sbx.runCode()('x+=1; x') +const execution = await sbx.runCode('x+=1; x') console.log(execution.text) // outputs 2 ``` @@ -59,8 +59,8 @@ Python from e2b_code_interpreter import Sandbox with Sandbox() as sandbox: - sandbox.run_code()("x = 1") - execution = sandbox.run_code()("x+=1; x") + sandbox.run_code("x = 1") + execution = sandbox.run_code("x+=1; x") print(execution.text) # outputs 2 ``` From 64df611519595c69825c7250795750a236548b5d Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:12:53 -0700 Subject: [PATCH 401/722] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65b8ee56..234d5dd8 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ pip install e2b-code-interpreter ### 2. Get your E2B API key 1. Sign up to E2B [here](https://e2b.dev). 2. Get your API key [here](https://e2b.dev/dashboard?tab=keys). -3. Set environment variable with your API key +3. Set environment variable with your API key. ``` E2B_API_KEY=e2b_*** ``` From 8fd67ae1d2e2cab7f5abf82165091eac8e940660 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:13:10 -0700 Subject: [PATCH 402/722] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 234d5dd8..1a2649f9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- e2b logo + e2b logo

From 822302a8114cfda354c080a7144261e248b3688a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 04:15:44 -0700 Subject: [PATCH 403/722] Add changeset --- .changeset/four-yaks-know.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/four-yaks-know.md diff --git a/.changeset/four-yaks-know.md b/.changeset/four-yaks-know.md new file mode 100644 index 00000000..c36f2311 --- /dev/null +++ b/.changeset/four-yaks-know.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Bump version From f8d7b82538cf13f81e5e1c0bd58c5df6350fbaab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 11:19:11 +0000 Subject: [PATCH 404/722] [skip ci] Release new versions --- .changeset/four-yaks-know.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/four-yaks-know.md diff --git a/.changeset/four-yaks-know.md b/.changeset/four-yaks-know.md deleted file mode 100644 index c36f2311..00000000 --- a/.changeset/four-yaks-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Bump version diff --git a/js/package.json b/js/package.json index 2d3ce2a5..2fbaa571 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.0", + "version": "1.0.1", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From 4e15ec3a6f895997101feeb230312da6360fc446 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:24:01 -0700 Subject: [PATCH 405/722] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a2649f9..d718fb34 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- e2b logo + e2b logo

From d61d41b79583a262ab52f1b7bdbcee32c92566ee Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:24:56 -0700 Subject: [PATCH 406/722] Update README.md --- python/README.md | 133 +++++++++++------------------------------------ 1 file changed, 31 insertions(+), 102 deletions(-) diff --git a/python/README.md b/python/README.md index d2b9db71..94973327 100644 --- a/python/README.md +++ b/python/README.md @@ -1,127 +1,56 @@

- e2b logo + e2b logo

- -

- Code interpreter extension for Python -

-

Last 1 month downloads for the Python SDK - - - Last 1 month downloads for the Python SDK - +

-The repository contains a template and modules for the code interpreter sandbox. It is based on the Jupyter server and implements the Jupyter Kernel messaging protocol. This allows for sharing context between code executions and improves support for plotting charts and other display-able data. + +## What is E2B? +[E2B](https://www.e2b.dev/) is an open-source infrastructure that allows you run to AI-generated code in secure isolated sandboxes in the cloud. To start and control sandboxes, use our [JavaScript SDK](https://www.npmjs.com/package/@e2b/code-interpreter) or [Python SDK](https://pypi.org/project/e2b_code_interpreter). -## Key Features +## Run your first Sandbox -- **Stateful Execution**: Unlike traditional sandboxes that treat each code execution independently, this package maintains context across executions. -- **Displaying Charts & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. +### 1. Install SDK -## Installation - -```sh -pip install e2b-code-interpreter +JavaScript / TypeScript ``` - -## Examples - -### Minimal example with the sharing context - -```python -from e2b_code_interpreter import Sandbox - -with Sandbox() as sandbox: - sandbox.run_code()("x = 1") - - execution = sandbox.run_code()("x+=1; x") - print(execution.text) # outputs 2 +npm i @e2b/code-interpreter ``` -### Get charts and any display-able data - -```python -import base64 -import io - -from matplotlib import image as mpimg, pyplot as plt - -from e2b_code_interpreter import Sandbox - -code = """ -import matplotlib.pyplot as plt -import numpy as np - -x = np.linspace(0, 20, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.show() -""" - -with Sandbox() as sandbox: - # you can install dependencies in "jupyter notebook style" - sandbox.run_code("!pip install matplotlib") - - # plot random chart - execution = sandbox.run_code(code) - -# there's your image -image = execution.results[0].png - -# example how to show the image / prove it works -i = base64.b64decode(image) -i = io.BytesIO(i) -i = mpimg.imread(i, format='PNG') +Python +``` +pip install e2b-code-interpreter +``` -plt.imshow(i, interpolation='nearest') -plt.show() +### 2. Get your E2B API key +1. Sign up to E2B [here](https://e2b.dev). +2. Get your API key [here](https://e2b.dev/dashboard?tab=keys). +3. Set environment variable with your API key. ``` +E2B_API_KEY=e2b_*** +``` -### Streaming code output +### 3. Execute code with code interpreter inside Sandbox -```python +Python +```py from e2b_code_interpreter import Sandbox -code = """ -import time -import pandas as pd - -print("hello") -time.sleep(3) -data = pd.DataFrame(data=[[1, 2], [3, 4]], columns=["A", "B"]) -display(data.head(10)) -time.sleep(3) -print("world") -""" - with Sandbox() as sandbox: - sandbox.run_code(code, on_stdout=print, on_stderr=print, on_result=(lambda result: print(result.text))) + sandbox.run_code("x = 1") + execution = sandbox.run_code("x+=1; x") + print(execution.text) # outputs 2 ``` -### More resources -- Check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to use our SDK. - -- See [E2B documentation](https://e2b.dev/docs) to get started. - -- Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. - -___ +### 4. Check docs +Visit [E2B documentation](https://e2b.dev/docs). -
- - -linkedin - -discord - -linkedin -
\ No newline at end of file +### 5. E2B cookbook +Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. From 6e16ad70dd75fe03a5609a96d300ea6bcb0b16d9 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:26:04 -0700 Subject: [PATCH 407/722] Update README.md --- js/README.md | 129 +++++++++++---------------------------------------- 1 file changed, 26 insertions(+), 103 deletions(-) diff --git a/js/README.md b/js/README.md index 3b480480..90c5c1ac 100644 --- a/js/README.md +++ b/js/README.md @@ -1,127 +1,50 @@

- e2b logo + e2b logo

- -

- Code interpreter extension for JavaScript -

- -

- - Last 1 month downloads for the Python SDK - +

- Last 1 month downloads for the Python SDK

+ +## What is E2B? +[E2B](https://www.e2b.dev/) is an open-source infrastructure that allows you run to AI-generated code in secure isolated sandboxes in the cloud. To start and control sandboxes, use our [JavaScript SDK](https://www.npmjs.com/package/@e2b/code-interpreter) or [Python SDK](https://pypi.org/project/e2b_code_interpreter). -The repository contains a template and modules for the code interpreter sandbox. It is based on the Jupyter server and implements the Jupyter Kernel messaging protocol. This allows for sharing context between code executions and improves support for plotting charts and other display-able data. - -## Key Features - -- **Stateful Execution**: Unlike traditional sandboxes that treat each code execution independently, this package maintains context across executions. -- **Displaying Charts & Data**: Implements parts of the [Jupyter Kernel messaging protocol](https://jupyter-client.readthedocs.io/en/latest/messaging.html), which support for interactive features like plotting charts, rendering DataFrames, etc. +## Run your first Sandbox -## Installation +### 1. Install SDK -```sh -npm install @e2b/code-interpreter ``` - -## Examples - -### Minimal example with the sharing context - -```js -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -await sbx.runCode()('x = 1') - -const execution = await sbx.runCode()('x+=1; x') -console.log(execution.text) // outputs 2 - -await sandbox.close() +npm i @e2b/code-interpreter ``` -### Get charts and any display-able data - -```js -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() - -const code = ` -import matplotlib.pyplot as plt -import numpy as np - -x = np.linspace(0, 20, 100) -y = np.sin(x) - -plt.plot(x, y) -plt.show() -` - -// you can install dependencies in "jupyter notebook style" -await sandbox.runCode('!pip install matplotlib') - -const execution = await sandbox.runCode(code) - -// this contains the image data, you can e.g. save it to file or send to frontend -execution.results[0].png - -await sandbox.kill() +### 2. Get your E2B API key +1. Sign up to E2B [here](https://e2b.dev). +2. Get your API key [here](https://e2b.dev/dashboard?tab=keys). +3. Set environment variable with your API key. ``` +E2B_API_KEY=e2b_*** +``` -### Streaming code output +### 3. Execute code with code interpreter inside Sandbox -```js +```ts import { Sandbox } from '@e2b/code-interpreter' -const code = ` -import time -import pandas as pd - -print("hello") -time.sleep(3) -data = pd.DataFrame(data=[[1, 2], [3, 4]], columns=["A", "B"]) -display(data.head(10)) -time.sleep(3) -print("world") -` - const sandbox = await Sandbox.create() +await sbx.runCode('x = 1') -await sandbox.runCode(code, { - onStdout: (out) => console.log(out), - onStderr: (outErr) => console.error(outErr), - onResult: (result) => console.log(result.text), -}) - -await sandbox.kill() +const execution = await sbx.runCode('x+=1; x') +console.log(execution.text) // outputs 2 ``` -### More resources -- Check out the [JavaScript/TypeScript](https://e2b.dev/docs/hello-world/js) and [Python](https://e2b.dev/docs/hello-world/py) "Hello World" guides to learn how to use our SDK. - -- See [E2B documentation](https://e2b.dev/docs) to get started. - -- Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. - - -___ +### 4. Check docs +Visit [E2B documentation](https://e2b.dev/docs). -
- - -linkedin - -discord - -linkedin -
\ No newline at end of file +### 5. E2B cookbook +Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. From 6628635281d9069c2b201fb9e27d72eceafb5028 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Wed, 16 Oct 2024 04:26:35 -0700 Subject: [PATCH 408/722] Update README.md --- python/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/python/README.md b/python/README.md index 94973327..4432c5d5 100644 --- a/python/README.md +++ b/python/README.md @@ -19,12 +19,6 @@ ### 1. Install SDK -JavaScript / TypeScript -``` -npm i @e2b/code-interpreter -``` - -Python ``` pip install e2b-code-interpreter ``` @@ -39,7 +33,6 @@ E2B_API_KEY=e2b_*** ### 3. Execute code with code interpreter inside Sandbox -Python ```py from e2b_code_interpreter import Sandbox From f87ab0d56109453825cdc7a5909fbcf6ad1ab560 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 16 Oct 2024 04:27:47 -0700 Subject: [PATCH 409/722] Add changeset --- .changeset/soft-wasps-marry.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/soft-wasps-marry.md diff --git a/.changeset/soft-wasps-marry.md b/.changeset/soft-wasps-marry.md new file mode 100644 index 00000000..051701ba --- /dev/null +++ b/.changeset/soft-wasps-marry.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter': patch +'@e2b/code-interpreter-python': patch +--- + +Fix logo in repository From 406dc66d212551db2c9d8a7be059d3e2a0ad18f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 11:31:15 +0000 Subject: [PATCH 410/722] [skip ci] Release new versions --- .changeset/soft-wasps-marry.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/soft-wasps-marry.md diff --git a/.changeset/soft-wasps-marry.md b/.changeset/soft-wasps-marry.md deleted file mode 100644 index 051701ba..00000000 --- a/.changeset/soft-wasps-marry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter': patch -'@e2b/code-interpreter-python': patch ---- - -Fix logo in repository diff --git a/js/package.json b/js/package.json index 2fbaa571..c1edf3f4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.1", + "version": "1.0.2", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/python/package.json b/python/package.json index c10b4e18..eefb7dc7 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.0", + "version": "1.0.1", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/python/pyproject.toml b/python/pyproject.toml index 749a4515..a9adce33 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.0" +version = "1.0.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" From 1cedd8368b8f5d7af0e149613eee533ac7943bb5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 21 Oct 2024 18:43:51 -0700 Subject: [PATCH 411/722] Increase timeout --- js/tests/runtimes/bun/run.test.ts | 2 +- js/tests/runtimes/deno/run.test.ts | 2 +- js/vitest.config.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts index 1497cdb6..6121b4a6 100644 --- a/js/tests/runtimes/bun/run.test.ts +++ b/js/tests/runtimes/bun/run.test.ts @@ -10,4 +10,4 @@ test('Bun test', async () => { } finally { await sbx.kill() } -}) +}, { timeout: 30_000 }) diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index 34343294..69cae53e 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -13,4 +13,4 @@ Deno.test('Deno test', async () => { } finally { await sbx.kill() } -}) +}, { timeout: 30_000 }) diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 409840e6..1705595d 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ include: ['tests/**/*.test.ts'], exclude: ['tests/runtimes/**'], globals: false, - testTimeout: 20000, + testTimeout: 30000, environment: 'node', bail: 1, server: {}, From 20c5d1fd1787837319e1bda380f32b6f53c68578 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 11:06:45 -0700 Subject: [PATCH 412/722] Remove chart and text from extras --- js/src/messaging.ts | 2 ++ js/tests/displayData.test.ts | 1 + python/tests/async/test_async_display_data.py | 1 + python/tests/sync/test_display_data.py | 1 + 4 files changed, 5 insertions(+) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index e6832936..bf08c58e 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -183,7 +183,9 @@ export class Result { 'json', 'javascript', 'data', + 'chart', 'extra', + "text" ].includes(key) ) { this.extra[key] = data[key] diff --git a/js/tests/displayData.test.ts b/js/tests/displayData.test.ts index a4fab813..ee320c4b 100644 --- a/js/tests/displayData.test.ts +++ b/js/tests/displayData.test.ts @@ -18,4 +18,5 @@ sandboxTest('display data', async ({ sandbox }) => { const image = result.results[0] expect(image.png).toBeDefined() expect(image.text).toBeDefined() + expect(image.extra).toEqual({}) }) diff --git a/python/tests/async/test_async_display_data.py b/python/tests/async/test_async_display_data.py index ecdb64e5..bb50647f 100644 --- a/python/tests/async/test_async_display_data.py +++ b/python/tests/async/test_async_display_data.py @@ -20,3 +20,4 @@ async def test_display_data(async_sandbox: AsyncSandbox): data = result.results[0] assert data.png assert data.text + assert not data.extra diff --git a/python/tests/sync/test_display_data.py b/python/tests/sync/test_display_data.py index 22db9f99..1cb44b97 100644 --- a/python/tests/sync/test_display_data.py +++ b/python/tests/sync/test_display_data.py @@ -20,3 +20,4 @@ def test_display_data(sandbox: Sandbox): data = result.results[0] assert data.png assert data.text + assert not data.extra From 747806ad49f018378f2bbdd6a6d485ecd8089115 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 11:07:52 -0700 Subject: [PATCH 413/722] Add changeset --- .changeset/dry-flowers-beg.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dry-flowers-beg.md diff --git a/.changeset/dry-flowers-beg.md b/.changeset/dry-flowers-beg.md new file mode 100644 index 00000000..20273d75 --- /dev/null +++ b/.changeset/dry-flowers-beg.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Remove chart and text from extra filed on Result From 1285d6af2e6c43bd7a31538ebdc60f2451ecc5be Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 14:01:10 -0700 Subject: [PATCH 414/722] Decrease number of concurrent tests --- .github/workflows/python_tests.yml | 2 +- .github/workflows/release.yml | 2 +- python/pytest.ini | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 8ab60a72..dd63624a 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -40,6 +40,6 @@ jobs: run: poetry build - name: Run tests - run: poetry run pytest -n 4 --verbose -x + run: poetry run pytest --verbose -x env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index feaa74cc..5876b58c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -99,7 +99,7 @@ jobs: release: needs: [python-tests, js-tests] - if: always() && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' + if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' name: Release runs-on: ubuntu-latest steps: diff --git a/python/pytest.ini b/python/pytest.ini index 8c25a4e4..7695413b 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,4 +4,4 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addopts = "--import-mode=importlib" "--numprocesses=4" +addopts = "--import-mode=importlib" "--numprocesses=2" From 21e892e156133dc3c5337a609aeb8815dfdfcafa Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 20:49:43 -0700 Subject: [PATCH 415/722] Add outliers, label and fix rounding issue --- python/e2b_code_interpreter/charts.py | 2 + python/tests/graphs/test_box_and_whiskers.py | 16 +++---- template/startup_scripts/0002_data.py | 45 ++++++++++++++++---- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/python/e2b_code_interpreter/charts.py b/python/e2b_code_interpreter/charts.py index 1ea55719..0fe32efb 100644 --- a/python/e2b_code_interpreter/charts.py +++ b/python/e2b_code_interpreter/charts.py @@ -165,6 +165,7 @@ class BoxAndWhiskerData: median: float third_quartile: float max: float + outliers: List[float] def __init__(self, **kwargs): self.label = kwargs["label"] @@ -173,6 +174,7 @@ def __init__(self, **kwargs): self.median = kwargs["median"] self.third_quartile = kwargs["third_quartile"] self.max = kwargs["max"] + self.outliers = kwargs.get("outliers") or [] class BoxAndWhiskerChart(Chart2D): diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/graphs/test_box_and_whiskers.py index 641745c9..4328faf6 100644 --- a/python/tests/graphs/test_box_and_whiskers.py +++ b/python/tests/graphs/test_box_and_whiskers.py @@ -15,9 +15,6 @@ # Create figure and axis fig, ax = plt.subplots(figsize=(10, 6)) -# Plot box plot -ax.boxplot(data.values(), labels=data.keys()) - # Customize plot ax.set_title('Exam Scores Distribution') ax.set_xlabel('Class') @@ -54,9 +51,10 @@ async def test_box_and_whiskers(async_sandbox: AsyncSandbox): bars = chart.elements assert len(bars) == 3 - assert all(isinstance(bar.min, float) for bar in bars) - assert all(isinstance(bar.first_quartile, float) for bar in bars) - assert all(isinstance(bar.median, float) for bar in bars) - assert all(isinstance(bar.third_quartile, float) for bar in bars) - assert all(isinstance(bar.max, float) for bar in bars) - assert all(isinstance(bar.label, str) for bar in bars) + assert [bar.outliers for bar in bars] == [[], [76], []] + assert [bar.min for bar in bars] == [78, 84, 75] + assert [bar.first_quartile for bar in bars] == [85, 84.75, 79] + assert [bar.median for bar in bars] == [88, 88, 82] + assert [bar.third_quartile for bar in bars] == [90, 90.5, 86] + assert [bar.max for bar in bars] == [92, 95, 88] + assert [bar.label for bar in bars] == ["Class A", "Class B", "Class C"] diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index e40ee7fb..c1970ee9 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,6 +1,7 @@ from datetime import date import enum import re +from decimal import Decimal, localcontext from typing import Optional, List, Tuple, Literal, Any, Union, Sequence import matplotlib @@ -35,6 +36,18 @@ def _is_grid_line(line: Line2D) -> bool: return False +def _dynamic_round(number): + # Convert to Decimal for precise control + decimal_number = Decimal(str(number)) + + # Dynamically determine precision based on magnitude + precision = max(1, 16 - decimal_number.adjusted()) # 16 digits of precision + + with localcontext() as ctx: + ctx.prec = precision # Set the dynamic precision + return +decimal_number # The + operator applies rounding + + class ChartType(str, enum.Enum): LINE = "line" SCATTER = "scatter" @@ -291,6 +304,7 @@ class BoxAndWhiskerData(BaseModel): median: float third_quartile: float max: float + outliers: List[float] = Field(default_factory=list) class BoxAndWhiskerChart(Chart2D): @@ -301,20 +315,23 @@ class BoxAndWhiskerChart(Chart2D): def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) + labels = [item.get_text() for item in ax.get_xticklabels()] + boxes = [] - for box in ax.patches: + for label, box in zip(labels, ax.patches): vertices = box.get_path().vertices - x_vertices = vertices[:, 0] - y_vertices = vertices[:, 1] + x_vertices = [_dynamic_round(x) for x in vertices[:, 0]] + y_vertices = [_dynamic_round(y) for y in vertices[:, 1]] x = min(x_vertices) y = min(y_vertices) boxes.append( { "x": x, "y": y, - "label": box.get_label(), - "width": round(max(x_vertices) - x, 4), - "height": round(max(y_vertices) - y, 4), + "label": label, + "width": max(x_vertices) - x, + "height": max(y_vertices) - y, + "outliers": [], } ) @@ -328,13 +345,21 @@ def _extract_info(self, ax: Axes) -> None: box["x"], box["y"] = box["y"], box["x"] box["width"], box["height"] = box["height"], box["width"] - for line in ax.lines: - xdata = line.get_xdata() - ydata = line.get_ydata() + for i, line in enumerate(ax.lines): + xdata = [_dynamic_round(x) for x in line.get_xdata()] + ydata = [_dynamic_round(y) for y in line.get_ydata()] if orientation == "vertical": xdata, ydata = ydata, xdata + if len(xdata) == 1: + for box in boxes: + if box["x"] <= xdata[0] <= box["x"] + box["width"]: + break + else: + continue + + box["outliers"].append(ydata[0]) if len(ydata) != 2: continue for box in boxes: @@ -344,6 +369,7 @@ def _extract_info(self, ax: Axes) -> None: continue if ( + # Check if the line is inside the box, prevent floating point errors ydata[0] == ydata[1] and box["y"] <= ydata[0] <= box["y"] + box["height"] ): @@ -365,6 +391,7 @@ def _extract_info(self, ax: Axes) -> None: median=box["median"], third_quartile=box["y"] + box["height"], max=box["whisker_upper"], + outliers=box["outliers"], ) for box in boxes ] From 6a8b9aed98ab391df0a36ee5683ca8cf6830956d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 20:50:41 -0700 Subject: [PATCH 416/722] Use better rounding for angle in pie chart --- template/startup_scripts/0002_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index c1970ee9..c9149c61 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -290,7 +290,7 @@ def _extract_info(self, ax: Axes) -> None: for wedge in ax.patches: pie_data = PieData( label=wedge.get_label(), - angle=abs(round(wedge.theta2 - wedge.theta1, 4)), + angle=abs(_dynamic_round(wedge.theta2 - wedge.theta1)), radius=wedge.r, ) From 0f718acff5fb8f793cb6b8fa375bc3d55e3f6443 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 21:09:22 -0700 Subject: [PATCH 417/722] Update box and whiskers in JS SDK --- js/src/charts.ts | 1 + js/tests/charts/boxAndWhisker.test.ts | 18 +++++++----------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/js/src/charts.ts b/js/src/charts.ts index 821725b2..584026a6 100644 --- a/js/src/charts.ts +++ b/js/src/charts.ts @@ -95,6 +95,7 @@ export type BoxAndWhiskerData = { median: number third_quartile: number max: number + outliers: number[] } export type BoxAndWhiskerChart = Chart2D & { diff --git a/js/tests/charts/boxAndWhisker.test.ts b/js/tests/charts/boxAndWhisker.test.ts index c3698092..cfa9109e 100644 --- a/js/tests/charts/boxAndWhisker.test.ts +++ b/js/tests/charts/boxAndWhisker.test.ts @@ -17,9 +17,6 @@ data = { # Create figure and axis fig, ax = plt.subplots(figsize=(10, 6)) -# Plot box plot -ax.boxplot(data.values(), labels=data.keys()) - # Customize plot ax.set_title('Exam Scores Distribution') ax.set_xlabel('Class') @@ -52,12 +49,11 @@ plt.show() const bars = chart.elements expect(bars.length).toBe(3) - bars.forEach((bar: any) => { - expect(typeof bar.min).toBe('number') - expect(typeof bar.first_quartile).toBe('number') - expect(typeof bar.median).toBe('number') - expect(typeof bar.third_quartile).toBe('number') - expect(typeof bar.max).toBe('number') - expect(typeof bar.label).toBe('string') - }) + expect(bars.map((bar) => bar.label)).toEqual(['Class A', 'Class B', 'Class C']) + expect(bars.map((bar) => bar.outliers)).toEqual([[], [76], []]) + expect(bars.map((bar) => bar.min)).toEqual([78, 84, 75]) + expect(bars.map((bar) => bar.first_quartile)).toEqual([85, 84.75, 79]) + expect(bars.map((bar) => bar.median)).toEqual([88, 88, 82]) + expect(bars.map((bar) => bar.third_quartile)).toEqual([90, 90.5, 86]) + expect(bars.map((bar) => bar.max)).toEqual([92, 95, 88]) }) From 0509adf2fbc6fb08d0830dd7294d9b72505f58ff Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 21:30:37 -0700 Subject: [PATCH 418/722] Fix rounding --- template/startup_scripts/0002_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index c9149c61..df856bba 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -290,7 +290,9 @@ def _extract_info(self, ax: Axes) -> None: for wedge in ax.patches: pie_data = PieData( label=wedge.get_label(), - angle=abs(_dynamic_round(wedge.theta2 - wedge.theta1)), + angle=abs( + _dynamic_round(Decimal(wedge.theta2) - Decimal(wedge.theta1)) + ), radius=wedge.r, ) From 6c8f6ba9f92cce794bb4f35022b9581e0d27b618 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 21:51:11 -0700 Subject: [PATCH 419/722] Decrease precision --- template/startup_scripts/0002_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index df856bba..2fd22b13 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -41,7 +41,7 @@ def _dynamic_round(number): decimal_number = Decimal(str(number)) # Dynamically determine precision based on magnitude - precision = max(1, 16 - decimal_number.adjusted()) # 16 digits of precision + precision = max(1, 8 - decimal_number.adjusted()) # 8 digits of precision with localcontext() as ctx: ctx.prec = precision # Set the dynamic precision From 3a61883bcae9edbe32036d898b61965cdfea7961 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 22:12:38 -0700 Subject: [PATCH 420/722] Fix deno test + enable bun --- .github/workflows/js_tests.yml | 10 +++++----- js/tests/runtimes/deno/run.test.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index eeea0e6b..e2ab1110 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -54,11 +54,11 @@ jobs: uses: oven-sh/setup-bun@v2 with: version: 1.1.x -# -# - name: Run Bun tests -# run: pnpm test:bun -# env: -# E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + + - name: Run Bun tests + run: pnpm test:bun + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} - name: Install Deno uses: denoland/setup-deno@v1 diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index 69cae53e..34343294 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -13,4 +13,4 @@ Deno.test('Deno test', async () => { } finally { await sbx.kill() } -}, { timeout: 30_000 }) +}) From f47d9e645afc96d0751d412ff86b2cb223c7ce32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 05:16:19 +0000 Subject: [PATCH 421/722] [skip ci] Release new versions --- .changeset/dry-flowers-beg.md | 5 ----- js/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/dry-flowers-beg.md diff --git a/.changeset/dry-flowers-beg.md b/.changeset/dry-flowers-beg.md deleted file mode 100644 index 20273d75..00000000 --- a/.changeset/dry-flowers-beg.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Remove chart and text from extra filed on Result diff --git a/js/package.json b/js/package.json index c1edf3f4..8bdb3c9c 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.2", + "version": "1.0.3", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", From eb452491ce855b99ff1c08e2597b61b2e88f7fb2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 13 Oct 2024 19:48:36 +0200 Subject: [PATCH 422/722] Move the graph data extraction to separate package --- template/packages/data/README.md | 3 + .../__init__.py | 1 + .../graphs/__init__.py | 4 + .../graphs/bars.py | 127 +++ .../graphs/base.py | 75 ++ .../graphs/pie.py | 30 + .../graphs/planar.py | 132 +++ .../main.py | 111 +++ .../utils/__init__.py | 0 .../utils/filtering.py | 16 + template/packages/data/poetry.lock | 847 ++++++++++++++++++ template/packages/data/pyproject.toml | 29 + template/packages/data/pytest.ini | 3 + .../packages/data/tests/graphs/test_bar.py | 49 + .../tests/graphs/test_box_and_whiskers.py | 57 ++ .../tests/graphs/test_categorical_scale.py | 27 + .../data/tests/graphs/test_datetime_scale.py | 30 + .../packages/data/tests/graphs/test_line.py | 74 ++ .../data/tests/graphs/test_log_graph.py | 63 ++ .../packages/data/tests/graphs/test_pie.py | 53 ++ .../data/tests/graphs/test_scatter.py | 58 ++ .../data/tests/graphs/test_supergraph.py | 66 ++ .../data/tests/graphs/test_unknown.py | 37 + .../data/tests/utils/test_detect_scale.py | 24 + .../data/tests/utils/test_is_grid_line.py | 17 + template/requirements.txt | 3 + template/startup_scripts/0002_data.py | 472 +--------- 27 files changed, 1938 insertions(+), 470 deletions(-) create mode 100644 template/packages/data/README.md create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/__init__.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/main.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py create mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py create mode 100644 template/packages/data/poetry.lock create mode 100644 template/packages/data/pyproject.toml create mode 100644 template/packages/data/pytest.ini create mode 100644 template/packages/data/tests/graphs/test_bar.py create mode 100644 template/packages/data/tests/graphs/test_box_and_whiskers.py create mode 100644 template/packages/data/tests/graphs/test_categorical_scale.py create mode 100644 template/packages/data/tests/graphs/test_datetime_scale.py create mode 100644 template/packages/data/tests/graphs/test_line.py create mode 100644 template/packages/data/tests/graphs/test_log_graph.py create mode 100644 template/packages/data/tests/graphs/test_pie.py create mode 100644 template/packages/data/tests/graphs/test_scatter.py create mode 100644 template/packages/data/tests/graphs/test_supergraph.py create mode 100644 template/packages/data/tests/graphs/test_unknown.py create mode 100644 template/packages/data/tests/utils/test_detect_scale.py create mode 100644 template/packages/data/tests/utils/test_is_grid_line.py diff --git a/template/packages/data/README.md b/template/packages/data/README.md new file mode 100644 index 00000000..178eaa2c --- /dev/null +++ b/template/packages/data/README.md @@ -0,0 +1,3 @@ +# Extracting data for Code Interpreter SDK + +This package is used to extract data in the Code Interpreter SDK from e.g. DataFrames and matplotlib plots. diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/__init__.py b/template/packages/data/e2b_code_interpreter_data_extraction/__init__.py new file mode 100644 index 00000000..3dbdc8fa --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/__init__.py @@ -0,0 +1 @@ +from .main import graph_figure_to_graph diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py new file mode 100644 index 00000000..f9914582 --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py @@ -0,0 +1,4 @@ +from .base import GraphType, Graph +from .bars import BarGraph, BoxAndWhiskerGraph +from .pie import PieGraph +from .planar import ScatterGraph, LineGraph diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py new file mode 100644 index 00000000..a7783076 --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py @@ -0,0 +1,127 @@ +from typing import Literal, List + +from matplotlib.axes import Axes +from pydantic import BaseModel, Field + +from .base import Graph2D, GraphType + + +class BarData(BaseModel): + label: str + group: str + value: float + + +class BarGraph(Graph2D): + type: Literal[GraphType.BAR] = GraphType.BAR + + elements: List[BarData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + for container in ax.containers: + group_label = container.get_label() + if group_label.startswith("_container"): + number = int(group_label[10:]) + group_label = f"Group {number}" + + heights = [rect.get_height() for rect in container] + if all(height == heights[0] for height in heights): + # vertical bars + self._change_orientation() + labels = [label.get_text() for label in ax.get_yticklabels()] + values = [rect.get_width() for rect in container] + else: + # horizontal bars + labels = [label.get_text() for label in ax.get_xticklabels()] + values = heights + for label, value in zip(labels, values): + + bar = BarData(label=label, value=value, group=group_label) + self.elements.append(bar) + + +class BoxAndWhiskerData(BaseModel): + label: str + min: float + first_quartile: float + median: float + third_quartile: float + max: float + + +class BoxAndWhiskerGraph(Graph2D): + type: Literal[GraphType.BOX_AND_WHISKER] = GraphType.BOX_AND_WHISKER + + elements: List[BoxAndWhiskerData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + boxes = [] + for box in ax.patches: + vertices = box.get_path().vertices + x_vertices = vertices[:, 0] + y_vertices = vertices[:, 1] + x = min(x_vertices) + y = min(y_vertices) + boxes.append( + { + "x": x, + "y": y, + "label": box.get_label(), + "width": round(max(x_vertices) - x, 4), + "height": round(max(y_vertices) - y, 4), + } + ) + + orientation = "horizontal" + if all(box["height"] == boxes[0]["height"] for box in boxes): + orientation = "vertical" + + if orientation == "vertical": + self._change_orientation() + for box in boxes: + box["x"], box["y"] = box["y"], box["x"] + box["width"], box["height"] = box["height"], box["width"] + + for line in ax.lines: + xdata = line.get_xdata() + ydata = line.get_ydata() + + if orientation == "vertical": + xdata, ydata = ydata, xdata + + if len(ydata) != 2: + continue + for box in boxes: + if box["x"] <= xdata[0] <= xdata[1] <= box["x"] + box["width"]: + break + else: + continue + + if ( + ydata[0] == ydata[1] + and box["y"] <= ydata[0] <= box["y"] + box["height"] + ): + box["median"] = ydata[0] + continue + + lower_value = min(ydata) + upper_value = max(ydata) + if upper_value == box["y"]: + box["whisker_lower"] = lower_value + elif lower_value == box["y"] + box["height"]: + box["whisker_upper"] = upper_value + + self.elements = [ + BoxAndWhiskerData( + label=box["label"], + min=box["whisker_lower"], + first_quartile=box["y"], + median=box["median"], + third_quartile=box["y"] + box["height"], + max=box["whisker_upper"], + ) + for box in boxes + ] diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py new file mode 100644 index 00000000..2dbc1afe --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py @@ -0,0 +1,75 @@ +import enum +import re +from typing import Optional, List, Any + +from matplotlib.axes import Axes +from pydantic import BaseModel, Field + + +class GraphType(str, enum.Enum): + LINE = "line" + SCATTER = "scatter" + BAR = "bar" + PIE = "pie" + BOX_AND_WHISKER = "box_and_whisker" + SUPERGRAPH = "supergraph" + UNKNOWN = "unknown" + + +class Graph(BaseModel): + type: GraphType + title: Optional[str] = None + + elements: List[Any] = Field(default_factory=list) + + def __init__(self, ax: Optional[Axes] = None, **kwargs): + super().__init__(**kwargs) + if ax: + self._extract_info(ax) + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for Graph + """ + title = ax.get_title() + if title == "": + title = None + + self.title = title + + +class Graph2D(Graph): + x_label: Optional[str] = None + y_label: Optional[str] = None + x_unit: Optional[str] = None + y_unit: Optional[str] = None + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for Graph2D + """ + super()._extract_info(ax) + x_label = ax.get_xlabel() + if x_label == "": + x_label = None + self.x_label = x_label + + y_label = ax.get_ylabel() + if y_label == "": + y_label = None + self.y_label = y_label + + regex = r"\s\((.*?)\)|\[(.*?)\]" + if self.x_label: + match = re.search(regex, self.x_label) + if match: + self.x_unit = match.group(1) or match.group(2) + + if self.y_label: + match = re.search(regex, self.y_label) + if match: + self.y_unit = match.group(1) or match.group(2) + + def _change_orientation(self): + self.x_label, self.y_label = self.y_label, self.x_label + self.x_unit, self.y_unit = self.y_unit, self.x_unit diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py new file mode 100644 index 00000000..9abcb5e6 --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py @@ -0,0 +1,30 @@ +from typing import Literal, List + +from matplotlib.axes import Axes +from pydantic import BaseModel, Field + +from .base import Graph, GraphType + + +class PieData(BaseModel): + label: str + angle: float + radius: float + + +class PieGraph(Graph): + type: Literal[GraphType.PIE] = GraphType.PIE + + elements: List[PieData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for wedge in ax.patches: + pie_data = PieData( + label=wedge.get_label(), + angle=abs(round(wedge.theta2 - wedge.theta1, 4)), + radius=wedge.r, + ) + + self.elements.append(pie_data) diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py new file mode 100644 index 00000000..d1a29d13 --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py @@ -0,0 +1,132 @@ +from datetime import date +from typing import List, Tuple, Union, Sequence, Any, Literal + +import matplotlib +import numpy +from matplotlib.axes import Axes +from matplotlib.dates import _SwitchableDateConverter +from pydantic import BaseModel, field_validator, Field + +from .base import Graph2D, GraphType +from ..utils.filtering import is_grid_line + + +class PointData(BaseModel): + label: str + points: List[Tuple[Union[str, float], Union[str, float]]] + + @field_validator("points", mode="before") + @classmethod + def transform_points( + cls, value + ) -> List[Tuple[Union[str, float], Union[str, float]]]: + parsed_value = [] + for x, y in value: + if isinstance(x, date): + x = x.isoformat() + if isinstance(x, numpy.datetime64): + x = x.astype("datetime64[s]").astype(str) + + if isinstance(y, date): + y = y.isoformat() + if isinstance(y, numpy.datetime64): + y = y.astype("datetime64[s]").astype(str) + + parsed_value.append((x, y)) + return parsed_value + + +class PointGraph(Graph2D): + x_ticks: List[Union[str, float]] = Field(default_factory=list) + x_tick_labels: List[str] = Field(default_factory=list) + x_scale: str = Field(default="linear") + + y_ticks: List[Union[str, float]] = Field(default_factory=list) + y_tick_labels: List[str] = Field(default_factory=list) + y_scale: str = Field(default="linear") + + elements: List[PointData] = Field(default_factory=list) + + def _extract_info(self, ax: Axes) -> None: + """ + Function to extract information for PointGraph + """ + super()._extract_info(ax) + + self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] + + x_ticks = ax.get_xticks() + self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) + self.x_scale = self._detect_scale( + ax.xaxis.converter, ax.get_xscale(), self.x_ticks, self.x_tick_labels + ) + + self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] + self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, ax.get_yticks()) + self.y_scale = self._detect_scale( + ax.yaxis.converter, ax.get_yscale(), self.y_ticks, self.y_tick_labels + ) + + @staticmethod + def _detect_scale(converter, scale: str, ticks: Sequence, labels: Sequence) -> str: + # If the converter is a date converter, it's a datetime scale + if isinstance(converter, _SwitchableDateConverter): + return "datetime" + + # If the scale is not linear, it can't be categorical + if scale != "linear": + return scale + + # If all the ticks are integers and are in order from 0 to n-1 + # and the labels aren't corresponding to the ticks, it's categorical + for i, tick_and_label in enumerate(zip(ticks, labels)): + tick, label = tick_and_label + if isinstance(tick, (int, float)) and tick == i and str(i) != label: + continue + # Found a tick, which wouldn't be in a categorical scale + return "linear" + + return "categorical" + + @staticmethod + def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: + if isinstance(converter, _SwitchableDateConverter): + return [matplotlib.dates.num2date(tick).isoformat() for tick in ticks] + else: + example_tick = ticks[0] + + if isinstance(example_tick, (int, float)): + return [float(tick) for tick in ticks] + else: + return list(ticks) + + +class LineGraph(PointGraph): + type: Literal[GraphType.LINE] = GraphType.LINE + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for line in ax.get_lines(): + if is_grid_line(line): + continue + label = line.get_label() + if label.startswith("_child"): + number = int(label[6:]) + label = f"Line {number}" + + points = [(x, y) for x, y in zip(line.get_xdata(), line.get_ydata())] + line_data = PointData(label=label, points=points) + self.elements.append(line_data) + + +class ScatterGraph(PointGraph): + type: Literal[GraphType.SCATTER] = GraphType.SCATTER + + def _extract_info(self, ax: Axes) -> None: + super()._extract_info(ax) + + for collection in ax.collections: + points = [(x, y) for x, y in collection.get_offsets()] + scatter_data = PointData(label=collection.get_label(), points=points) + self.elements.append(scatter_data) diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/main.py b/template/packages/data/e2b_code_interpreter_data_extraction/main.py new file mode 100644 index 00000000..7ce93a9a --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/main.py @@ -0,0 +1,111 @@ +from typing import Optional, List, Any, Literal + +from matplotlib.axes import Axes +from matplotlib.collections import PathCollection +from matplotlib.lines import Line2D +from matplotlib.patches import Rectangle, Wedge, PathPatch +from matplotlib.pyplot import Figure + +from matplotlib.text import Text +from pydantic import BaseModel, Field + +from e2b_code_interpreter_data_extraction.graphs import ( + GraphType, + Graph, + LineGraph, + BarGraph, + BoxAndWhiskerGraph, + PieGraph, + ScatterGraph, +) +from e2b_code_interpreter_data_extraction.utils.filtering import is_grid_line + + +class SuperGraph(Graph): + type: Literal[GraphType.SUPERGRAPH] = GraphType.SUPERGRAPH + elements: List[ + LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph + ] = Field(default_factory=list) + + def __init__(self, figure: Figure): + title = figure.get_suptitle() + super().__init__(title=title) + + self.elements = [get_graph_from_ax(ax) for ax in figure.axes] + + +def _get_type_of_graph(ax: Axes) -> GraphType: + objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) + + # Check for Line plots + if all(isinstance(line, Line2D) for line in objects): + return GraphType.LINE + + if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): + return GraphType.BOX_AND_WHISKER + + filtered = [] + for obj in objects: + if isinstance(obj, Line2D) and is_grid_line(obj): + continue + filtered.append(obj) + + objects = filtered + + # Check for Scatter plots + if all(isinstance(path, PathCollection) for path in objects): + return GraphType.SCATTER + + # Check for Pie plots + if all(isinstance(artist, Wedge) for artist in objects): + return GraphType.PIE + + # Check for Bar plots + if all(isinstance(rect, Rectangle) for rect in objects): + return GraphType.BAR + + return GraphType.UNKNOWN + + +def get_graph_from_ax( + ax: Axes, +) -> LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph | Graph: + graph_type = _get_type_of_graph(ax) + + if graph_type == GraphType.LINE: + graph = LineGraph(ax=ax) + elif graph_type == GraphType.SCATTER: + graph = ScatterGraph(ax=ax) + elif graph_type == GraphType.BAR: + graph = BarGraph(ax=ax) + elif graph_type == GraphType.PIE: + graph = PieGraph(ax=ax) + elif graph_type == GraphType.BOX_AND_WHISKER: + graph = BoxAndWhiskerGraph(ax=ax) + else: + graph = Graph(ax=ax, type=graph_type) + + return graph + + +def graph_figure_to_graph(figure: Figure) -> Optional[Graph]: + """ + This method is used to extract data from the figure object to a dictionary + """ + # Get all Axes objects from the Figure + axes = figure.get_axes() + + if not axes: + return + elif len(axes) > 1: + return SuperGraph(figure=figure) + else: + ax = axes[0] + return get_graph_from_ax(ax) + + +def graph_figure_to_dict(figure: Figure) -> dict: + graph = graph_figure_to_graph(figure) + if graph: + return graph.model_dump() + return {} diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py b/template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py b/template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py new file mode 100644 index 00000000..8394c27b --- /dev/null +++ b/template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py @@ -0,0 +1,16 @@ +from matplotlib.lines import Line2D + + +def is_grid_line(line: Line2D) -> bool: + x_data = line.get_xdata() + if len(x_data) != 2: + return False + + y_data = line.get_ydata() + if len(y_data) != 2: + return False + + if x_data[0] == x_data[1] or y_data[0] == y_data[1]: + return True + + return False diff --git a/template/packages/data/poetry.lock b/template/packages/data/poetry.lock new file mode 100644 index 00000000..c20048ec --- /dev/null +++ b/template/packages/data/poetry.lock @@ -0,0 +1,847 @@ +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.3.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + +[[package]] +name = "fonttools" +version = "4.54.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.7" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "matplotlib" +version = "3.9.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pydantic" +version = "2.9.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyparsing" +version = "3.2.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-dotenv" +version = "0.5.2" +description = "A py.test plugin that parses environment files before running tests" +optional = false +python-versions = "*" +files = [ + {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, + {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, +] + +[package.dependencies] +pytest = ">=5.0.0" +python-dotenv = ">=0.9.1" + +[[package]] +name = "pytest-xdist" +version = "3.6.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tomli" +version = "2.0.2" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "b21f4b46a6df85df1c6558a2e29a94691f80f7eb45558f207bc133641d1a75b1" diff --git a/template/packages/data/pyproject.toml b/template/packages/data/pyproject.toml new file mode 100644 index 00000000..4556def5 --- /dev/null +++ b/template/packages/data/pyproject.toml @@ -0,0 +1,29 @@ +[tool.poetry] +name = "e2b-code-interpreter-data-extraction" +version = "0.0.0" +description = "Package for extracting data for E2B Code Interpreter" +authors = ["e2b "] +license = "Apache-2.0" +readme = "README.md" +homepage = "https://e2b.dev/" +repository = "https://github.com/e2b-dev/e2b-code-interpreter/tree/python" +packages = [{ include = "e2b_code_interpreter_data_extraction" }] + +[tool.poetry.dependencies] +python = "^3.10" + +numpy = "^1.26.4" +matplotlib = "^3.9.2" +pydantic = "^2.8.2" + +[tool.poetry.group.dev.dependencies] +pytest = "^7.4.0" +python-dotenv = "^1.0.0" +pytest-dotenv = "^0.5.2" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/e2b-dev/code-interpreter/issues" diff --git a/template/packages/data/pytest.ini b/template/packages/data/pytest.ini new file mode 100644 index 00000000..71e3e2c8 --- /dev/null +++ b/template/packages/data/pytest.ini @@ -0,0 +1,3 @@ +# content of pytest.ini +[pytest] +addopts = "--numprocesses=4" diff --git a/template/packages/data/tests/graphs/test_bar.py b/template/packages/data/tests/graphs/test_bar.py new file mode 100644 index 00000000..44d157c3 --- /dev/null +++ b/template/packages/data/tests/graphs/test_bar.py @@ -0,0 +1,49 @@ +import matplotlib.pyplot as plt + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import BarGraph, GraphType + + +def _prep_graph_figure(): + # Prepare data + authors = ["Author A", "Author B", "Author C", "Author D"] + sales = [100, 200, 300, 400] + + # Create and customize the bar graph + plt.figure(figsize=(10, 6)) + plt.bar(authors, sales, label="Books Sold", color="blue") + plt.xlabel("Authors") + plt.ylabel("Number of Books Sold") + plt.title("Book Sales by Authors") + + # Display the graph + plt.tight_layout() + return plt.gcf() + + +def test_graph_bar(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, BarGraph) + assert graph.type == GraphType.BAR + assert graph.title == "Book Sales by Authors" + + assert graph.x_label == "Authors" + assert graph.y_label == "Number of Books Sold" + + assert graph.x_unit is None + assert graph.y_unit is None + + bars = graph.elements + assert len(bars) == 4 + + assert [bar.value for bar in bars] == [100, 200, 300, 400] + assert [bar.label for bar in bars] == [ + "Author A", + "Author B", + "Author C", + "Author D", + ] + assert [bar.group for bar in bars] == ["Books Sold"] * 4 diff --git a/template/packages/data/tests/graphs/test_box_and_whiskers.py b/template/packages/data/tests/graphs/test_box_and_whiskers.py new file mode 100644 index 00000000..7f77ee29 --- /dev/null +++ b/template/packages/data/tests/graphs/test_box_and_whiskers.py @@ -0,0 +1,57 @@ +import matplotlib.pyplot as plt + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import BoxAndWhiskerGraph, GraphType + + +def _prep_graph_figure(): + # Sample data + data = { + "Class A": [85, 90, 78, 92, 88], + "Class B": [95, 89, 76, 91, 84, 87], + "Class C": [75, 82, 88, 79, 86], + } + + # Create figure and axis + fig, ax = plt.subplots(figsize=(10, 6)) + + # Plot box plot + ax.boxplot(data.values(), tick_labels=data.keys()) + + # Customize plot + ax.set_title("Exam Scores Distribution") + ax.set_xlabel("Class") + ax.set_ylabel("Score") + + # Set custom colors + ax.boxplot(data.values(), tick_labels=data.keys(), patch_artist=True) + + # Adjust layout and show plot + plt.tight_layout() + return plt.gcf() + + +def test_box_and_whiskers(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, BoxAndWhiskerGraph) + assert graph.type == GraphType.BOX_AND_WHISKER + assert graph.title == "Exam Scores Distribution" + + assert graph.x_label == "Class" + assert graph.y_label == "Score" + + assert graph.x_unit is None + assert graph.y_unit is None + + bars = graph.elements + assert len(bars) == 3 + + assert all(isinstance(bar.min, float) for bar in bars) + assert all(isinstance(bar.first_quartile, float) for bar in bars) + assert all(isinstance(bar.median, float) for bar in bars) + assert all(isinstance(bar.third_quartile, float) for bar in bars) + assert all(isinstance(bar.max, float) for bar in bars) + assert all(isinstance(bar.label, str) for bar in bars) diff --git a/template/packages/data/tests/graphs/test_categorical_scale.py b/template/packages/data/tests/graphs/test_categorical_scale.py new file mode 100644 index 00000000..cc3449e6 --- /dev/null +++ b/template/packages/data/tests/graphs/test_categorical_scale.py @@ -0,0 +1,27 @@ +import numpy as np +import matplotlib.pyplot as plt +import datetime + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import LineGraph + + +def _prep_graph_figure(): + x = [1, 2, 3, 4, 5] + y = ["A", "B", "C", "D", "E"] + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(x, y) + + return plt.gcf() + + +def test_categorical_scale(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, LineGraph) + assert graph.x_scale == "linear" + assert graph.y_scale == "categorical" diff --git a/template/packages/data/tests/graphs/test_datetime_scale.py b/template/packages/data/tests/graphs/test_datetime_scale.py new file mode 100644 index 00000000..34a58ce7 --- /dev/null +++ b/template/packages/data/tests/graphs/test_datetime_scale.py @@ -0,0 +1,30 @@ +import numpy as np +import matplotlib.pyplot as plt +import datetime + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import LineGraph + + +def _prep_graph_figure(): + # Generate x values + dates = [ + datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100) + ] + y_sin = np.sin(np.linspace(0, 2 * np.pi, 100)) + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(dates, y_sin, label="sin(x)") + + return plt.gcf() + + +def test_datetime_scale(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, LineGraph) + assert graph.x_scale == "datetime" + assert graph.y_scale == "linear" diff --git a/template/packages/data/tests/graphs/test_line.py b/template/packages/data/tests/graphs/test_line.py new file mode 100644 index 00000000..ed9ff54c --- /dev/null +++ b/template/packages/data/tests/graphs/test_line.py @@ -0,0 +1,74 @@ +import numpy as np +import matplotlib.pyplot as plt +import datetime + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import LineGraph + + +def _prep_graph_figure(): + # Generate x values + dates = [ + datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100) + ] + + x = np.linspace(0, 2 * np.pi, 100) + # Calculate y values + y_sin = np.sin(x) + y_cos = np.cos(x) + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(dates, y_sin, label="sin(x)") + plt.plot(dates, y_cos, label="cos(x)") + + # Add labels and title + plt.xlabel("Time (s)") + plt.ylabel("Amplitude (Hz)") + plt.title("Plot of sin(x) and cos(x)") + + return plt.gcf() + + +def test_line_graph(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, LineGraph) + assert graph.title == "Plot of sin(x) and cos(x)" + + assert graph.x_label == "Time (s)" + assert graph.y_label == "Amplitude (Hz)" + + assert graph.x_unit == "s" + assert graph.y_unit == "Hz" + + assert graph.x_scale == "datetime" + assert graph.y_scale == "linear" + + assert all(isinstance(x, str) for x in graph.x_ticks) + parsed_date = datetime.datetime.fromisoformat(graph.x_ticks[0]) + assert isinstance(parsed_date, datetime.datetime) + assert all(isinstance(y, float) for y in graph.y_ticks) + + assert all(isinstance(x, str) for x in graph.y_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) + + lines = graph.elements + assert len(lines) == 2 + + first_line = lines[0] + assert first_line.label == "sin(x)" + assert len(first_line.points) == 100 + assert all(isinstance(point, tuple) for point in first_line.points) + assert all( + isinstance(x, str) and isinstance(y, float) for x, y in first_line.points + ) + + parsed_date = datetime.datetime.fromisoformat(first_line.points[0][0]) + assert isinstance(parsed_date, datetime.datetime) + + second_line = lines[1] + assert second_line.label == "cos(x)" + assert len(second_line.points) == 100 diff --git a/template/packages/data/tests/graphs/test_log_graph.py b/template/packages/data/tests/graphs/test_log_graph.py new file mode 100644 index 00000000..54b6feae --- /dev/null +++ b/template/packages/data/tests/graphs/test_log_graph.py @@ -0,0 +1,63 @@ +import numpy as np +import matplotlib.pyplot as plt + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import LineGraph + + +def _prep_graph_figure(): + # Generate x values + x = np.linspace(0, 100, 100) + # Calculate y values + y = np.exp(x) + + # Create the plot + plt.figure(figsize=(10, 6)) + plt.plot(x, y, label="y = e^x") + + # Set log scale for the y-axis + plt.yscale("log") + + # Add labels and title + plt.xlabel("X-axis") + plt.ylabel("Y-axis (log scale)") + plt.title("Graph with Log Scale on Y-axis") + + plt.legend() + plt.grid(True) + + return plt.gcf() + + +def test_log_graph(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, LineGraph) + assert graph.title == "Graph with Log Scale on Y-axis" + + assert graph.x_label == "X-axis" + assert graph.y_label == "Y-axis (log scale)" + + assert graph.x_unit == None + assert graph.y_unit == "log scale" + + assert graph.x_scale == "linear" + assert graph.y_scale == "log" + + assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(y, float) for y in graph.y_ticks) + + assert all(isinstance(x, str) for x in graph.x_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) + + lines = graph.elements + assert len(lines) == 1 + + line = lines[0] + assert line.label == "y = e^x" + assert len(line.points) == 100 + + assert all(isinstance(x, tuple) for x in line.points) + assert all(isinstance(x, float) and isinstance(y, float) for x, y in line.points) diff --git a/template/packages/data/tests/graphs/test_pie.py b/template/packages/data/tests/graphs/test_pie.py new file mode 100644 index 00000000..c267d1b7 --- /dev/null +++ b/template/packages/data/tests/graphs/test_pie.py @@ -0,0 +1,53 @@ +import matplotlib.pyplot as plt + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import PieGraph + + +def _prep_graph_figure(): + # Step 1: Define the data for the pie chart + categories = ["No", "No, in blue"] + sizes = [90, 10] + + # Step 2: Create the figure and axis objects + fig, ax = plt.subplots(figsize=(8, 8)) + + plt.xlabel("x") + plt.ylabel("y") + + # Step 3: Create the pie chart + ax.pie( + sizes, + labels=categories, + autopct="%1.1f%%", + startangle=90, + colors=plt.cm.Pastel1.colors[: len(categories)], + ) + + # Step 4: Add title and legend + ax.axis("equal") # Equal aspect ratio ensures that pie is drawn as a circle + plt.title("Will I wake up early tomorrow?") + + return plt.gcf() + + +def test_pie_graph(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, PieGraph) + + assert graph.title == "Will I wake up early tomorrow?" + + assert len(graph.elements) == 2 + + first_data = graph.elements[0] + assert first_data.label == "No" + assert first_data.angle == 324 + assert first_data.radius == 1 + + second_data = graph.elements[1] + assert second_data.label == "No, in blue" + assert second_data.angle == 36 + assert second_data.radius == 1 diff --git a/template/packages/data/tests/graphs/test_scatter.py b/template/packages/data/tests/graphs/test_scatter.py new file mode 100644 index 00000000..116a60aa --- /dev/null +++ b/template/packages/data/tests/graphs/test_scatter.py @@ -0,0 +1,58 @@ +import matplotlib.pyplot as plt +import numpy as np + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import ScatterGraph + + +def _prep_graph_figure(): + # Create data + N = 5 + x1 = np.random.rand(N) + y1 = np.random.rand(N) + x2 = np.random.rand(2 * N) + y2 = np.random.rand(2 * N) + + plt.figure(figsize=(10, 6)) + + plt.xlabel("A") + plt.ylabel("B") + + plt.scatter(x1, y1, c="blue", label="Dataset 1") + plt.scatter(x2, y2, c="red", label="Dataset 2") + + return plt.gcf() + + +def test_scatter_graph(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, ScatterGraph) + + assert graph.title is None + assert graph.x_label == "A" + assert graph.y_label == "B" + + assert graph.x_scale == "linear" + assert graph.y_scale == "linear" + + assert all(isinstance(x, float) for x in graph.x_ticks) + assert all(isinstance(y, float) for y in graph.y_ticks) + + assert all(isinstance(x, str) for x in graph.y_tick_labels) + assert all(isinstance(y, str) for y in graph.y_tick_labels) + + assert len(graph.elements) == 2 + + first_data = graph.elements[0] + assert first_data.label == "Dataset 1" + assert len(first_data.points) == 5 + print(first_data.points) + assert all(isinstance(x, tuple) for x in first_data.points) + + second_data = graph.elements[1] + assert second_data.label == "Dataset 2" + assert len(second_data.points) == 10 + assert all(isinstance(x, tuple) for x in second_data.points) diff --git a/template/packages/data/tests/graphs/test_supergraph.py b/template/packages/data/tests/graphs/test_supergraph.py new file mode 100644 index 00000000..7af44233 --- /dev/null +++ b/template/packages/data/tests/graphs/test_supergraph.py @@ -0,0 +1,66 @@ +import matplotlib.pyplot as plt +import numpy as np + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import ( + GraphType, + LineGraph, + ScatterGraph, +) +from e2b_code_interpreter_data_extraction.main import SuperGraph + + +def _prep_graph_figure(): + # Data for plotting + x1 = np.linspace(0, 10, 100) + y1 = np.sin(x1) + + # Create a figure with multiple subplots + fig, axs = plt.subplots(1, 2, figsize=(10, 8)) + fig.suptitle("Multiple Graphs Example", fontsize=16) + + # Plotting on the different axes + axs[0].plot(x1, y1, "r") + axs[0].set_title("Sine Wave") + axs[0].grid(True) + + N = 5 + x2 = np.random.rand(N) + y2 = np.random.rand(N) + + axs[1].scatter(x2, y2, c="blue", label="Dataset 1") + axs[1].set_xlabel("X") + axs[1].set_ylabel("Y") + axs[1].set_title("Scatter Plot") + axs[1].grid(True) + + return plt.gcf() + + +def test_super_graph(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, SuperGraph) + assert graph.type == GraphType.SUPERGRAPH + assert graph.title == "Multiple Graphs Example" + + graphs = graph.elements + assert len(graphs) == 2 + + first_graph = graphs[0] + assert first_graph.title == "Sine Wave" + assert isinstance(first_graph, LineGraph) + assert first_graph.x_label is None + assert first_graph.y_label is None + assert len(first_graph.elements) == 1 + assert len(first_graph.elements[0].points) == 100 + + second_graph = graphs[1] + assert second_graph.title == "Scatter Plot" + assert isinstance(second_graph, ScatterGraph) + assert second_graph.x_label == "X" + assert second_graph.y_label == "Y" + assert len(second_graph.elements) == 1 + assert len(second_graph.elements[0].points) == 5 diff --git a/template/packages/data/tests/graphs/test_unknown.py b/template/packages/data/tests/graphs/test_unknown.py new file mode 100644 index 00000000..4767d7eb --- /dev/null +++ b/template/packages/data/tests/graphs/test_unknown.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt + +from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_code_interpreter_data_extraction.graphs import Graph, GraphType + + +def _prep_graph_figure(): + # Create a figure and an axis + fig, ax = plt.subplots() + + # Create data for two concentric circles + circle1 = plt.Circle((0, 0), 1, color="blue", fill=False, linewidth=2) + circle2 = plt.Circle((0, 0), 2, color="red", fill=False, linewidth=2) + + # Add the circles to the axes + ax.add_artist(circle1) + ax.add_artist(circle2) + + # Set grid + ax.grid(True) + + # Set title + plt.title("Two Concentric Circles") + + return plt.gcf() + + +def test_unknown_graphs(): + figure = _prep_graph_figure() + graph = graph_figure_to_graph(figure) + assert graph + + assert isinstance(graph, Graph) + assert graph.type == GraphType.UNKNOWN + assert graph.title == "Two Concentric Circles" + + assert len(graph.elements) == 0 diff --git a/template/packages/data/tests/utils/test_detect_scale.py b/template/packages/data/tests/utils/test_detect_scale.py new file mode 100644 index 00000000..3c08a5ce --- /dev/null +++ b/template/packages/data/tests/utils/test_detect_scale.py @@ -0,0 +1,24 @@ +import datetime + +from matplotlib.dates import _SwitchableDateConverter + +from e2b_code_interpreter_data_extraction.graphs.planar import PointGraph + + +def test_detect_scale(): + datetime_converter = _SwitchableDateConverter() + scale = PointGraph._detect_scale( + datetime_converter, "linear", 3 * [datetime.date.today()], ["1", "2", "3"] + ) + assert scale == "datetime" + + scale = PointGraph._detect_scale(None, "linear", [1, 2, 3], ["1", "2", "3"]) + assert scale == "linear" + + scale = PointGraph._detect_scale( + None, "linear", [0, 1, 2], ["First", "Second", "Third"] + ) + assert scale == "categorical" + + scale = PointGraph._detect_scale(None, "log", [1, 10, 100], ["1", "10", "100"]) + assert scale == "log" diff --git a/template/packages/data/tests/utils/test_is_grid_line.py b/template/packages/data/tests/utils/test_is_grid_line.py new file mode 100644 index 00000000..63b071b5 --- /dev/null +++ b/template/packages/data/tests/utils/test_is_grid_line.py @@ -0,0 +1,17 @@ +from matplotlib.lines import Line2D + +from e2b_code_interpreter_data_extraction.utils.filtering import is_grid_line + + +def test_is_grid_line(): + not_a_grid_line = Line2D([1, 2], [2, 3]) + assert not is_grid_line(not_a_grid_line) + + horizontal_grid_line = Line2D([1, 2], [2, 2]) + assert is_grid_line(horizontal_grid_line) + + vertical_grid_line = Line2D([1, 1], [2, 3]) + assert is_grid_line(vertical_grid_line) + + long_line = Line2D([1, 1, 1, 1], [2, 3, 4, 5]) + assert not is_grid_line(long_line) diff --git a/template/requirements.txt b/template/requirements.txt index 01588ce5..2900258c 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,6 +3,9 @@ jupyter-server==2.13.0 ipykernel==6.29.3 ipython==8.22.2 +# Latest version for +e2b_code_interpreter_data_extraction + # Other packages aiohttp==3.9.3 beautifulsoup4==4.12.3 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 2fd22b13..6bce7306 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,469 +1,10 @@ -from datetime import date -import enum -import re -from decimal import Decimal, localcontext -from typing import Optional, List, Tuple, Literal, Any, Union, Sequence - -import matplotlib -import numpy import pandas -from matplotlib.axes import Axes -from matplotlib.collections import PathCollection -from matplotlib.lines import Line2D -from matplotlib.patches import Rectangle, Wedge, PathPatch from matplotlib.pyplot import Figure -from matplotlib.dates import _SwitchableDateConverter import IPython - from IPython.core.formatters import BaseFormatter -from matplotlib.text import Text -from pydantic import BaseModel, Field, field_validator from traitlets.traitlets import Unicode, ObjectName - -def _is_grid_line(line: Line2D) -> bool: - x_data = line.get_xdata() - if len(x_data) != 2: - return False - - y_data = line.get_ydata() - if len(y_data) != 2: - return False - - if x_data[0] == x_data[1] or y_data[0] == y_data[1]: - return True - - return False - - -def _dynamic_round(number): - # Convert to Decimal for precise control - decimal_number = Decimal(str(number)) - - # Dynamically determine precision based on magnitude - precision = max(1, 8 - decimal_number.adjusted()) # 8 digits of precision - - with localcontext() as ctx: - ctx.prec = precision # Set the dynamic precision - return +decimal_number # The + operator applies rounding - - -class ChartType(str, enum.Enum): - LINE = "line" - SCATTER = "scatter" - BAR = "bar" - PIE = "pie" - BOX_AND_WHISKER = "box_and_whisker" - SUPERCHART = "superchart" - UNKNOWN = "unknown" - - -class Chart(BaseModel): - type: ChartType - title: Optional[str] = None - - elements: List[Any] = Field(default_factory=list) - - def __init__(self, ax: Optional[Axes] = None, **kwargs): - super().__init__(**kwargs) - if ax: - self._extract_info(ax) - - def _extract_info(self, ax: Axes) -> None: - """ - Function to extract information for Chart - """ - title = ax.get_title() - if title == "": - title = None - - self.title = title - - -class Chart2D(Chart): - x_label: Optional[str] = None - y_label: Optional[str] = None - x_unit: Optional[str] = None - y_unit: Optional[str] = None - - def _extract_info(self, ax: Axes) -> None: - """ - Function to extract information for Chart2D - """ - super()._extract_info(ax) - x_label = ax.get_xlabel() - if x_label == "": - x_label = None - self.x_label = x_label - - y_label = ax.get_ylabel() - if y_label == "": - y_label = None - self.y_label = y_label - - regex = r"\s\((.*?)\)|\[(.*?)\]" - if self.x_label: - match = re.search(regex, self.x_label) - if match: - self.x_unit = match.group(1) or match.group(2) - - if self.y_label: - match = re.search(regex, self.y_label) - if match: - self.y_unit = match.group(1) or match.group(2) - - def _change_orientation(self): - self.x_label, self.y_label = self.y_label, self.x_label - self.x_unit, self.y_unit = self.y_unit, self.x_unit - - -class PointData(BaseModel): - label: str - points: List[Tuple[Union[str, float], Union[str, float]]] - - @field_validator("points", mode="before") - @classmethod - def transform_points( - cls, value - ) -> List[Tuple[Union[str, float], Union[str, float]]]: - parsed_value = [] - for x, y in value: - if isinstance(x, date): - x = x.isoformat() - if isinstance(x, numpy.datetime64): - x = x.astype("datetime64[s]").astype(str) - - if isinstance(y, date): - y = y.isoformat() - if isinstance(y, numpy.datetime64): - y = y.astype("datetime64[s]").astype(str) - - parsed_value.append((x, y)) - return parsed_value - - -class PointChart(Chart2D): - x_ticks: List[Union[str, float]] = Field(default_factory=list) - x_tick_labels: List[str] = Field(default_factory=list) - x_scale: str = Field(default="linear") - - y_ticks: List[Union[str, float]] = Field(default_factory=list) - y_tick_labels: List[str] = Field(default_factory=list) - y_scale: str = Field(default="linear") - - elements: List[PointData] = Field(default_factory=list) - - def _extract_info(self, ax: Axes) -> None: - """ - Function to extract information for PointChart - """ - super()._extract_info(ax) - - self.x_tick_labels = [label.get_text() for label in ax.get_xticklabels()] - - x_ticks = ax.get_xticks() - self.x_ticks = self._extract_ticks_info(ax.xaxis.converter, x_ticks) - self.x_scale = self._detect_scale( - ax.xaxis.converter, ax.get_xscale(), self.x_ticks, self.x_tick_labels - ) - - self.y_tick_labels = [label.get_text() for label in ax.get_yticklabels()] - self.y_ticks = self._extract_ticks_info(ax.yaxis.converter, ax.get_yticks()) - self.y_scale = self._detect_scale( - ax.yaxis.converter, ax.get_yscale(), self.y_ticks, self.y_tick_labels - ) - - @staticmethod - def _detect_scale(converter, scale: str, ticks: Sequence, labels: Sequence) -> str: - # If the converter is a date converter, it's a datetime scale - if isinstance(converter, _SwitchableDateConverter): - return "datetime" - - # If the scale is not linear, it can't be categorical - if scale != "linear": - return scale - - # If all the ticks are integers and are in order from 0 to n-1 - # and the labels aren't corresponding to the ticks, it's categorical - for i, tick_and_label in enumerate(zip(ticks, labels)): - tick, label = tick_and_label - if isinstance(tick, (int, float)) and tick == i and str(i) != label: - continue - # Found a tick, which wouldn't be in a categorical scale - return "linear" - - return "categorical" - - @staticmethod - def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: - if isinstance(converter, _SwitchableDateConverter): - return [matplotlib.dates.num2date(tick).isoformat() for tick in ticks] - else: - example_tick = ticks[0] - - if isinstance(example_tick, (int, float)): - return [float(tick) for tick in ticks] - else: - return list(ticks) - - -class LineChart(PointChart): - type: Literal[ChartType.LINE] = ChartType.LINE - - def _extract_info(self, ax: Axes) -> None: - super()._extract_info(ax) - - for line in ax.get_lines(): - if _is_grid_line(line): - continue - label = line.get_label() - if label.startswith("_child"): - number = int(label[6:]) - label = f"Line {number}" - - points = [(x, y) for x, y in zip(line.get_xdata(), line.get_ydata())] - line_data = PointData(label=label, points=points) - self.elements.append(line_data) - - -class ScatterChart(PointChart): - type: Literal[ChartType.SCATTER] = ChartType.SCATTER - - def _extract_info(self, ax: Axes) -> None: - super()._extract_info(ax) - - for collection in ax.collections: - points = [(x, y) for x, y in collection.get_offsets()] - scatter_data = PointData(label=collection.get_label(), points=points) - self.elements.append(scatter_data) - - -class BarData(BaseModel): - label: str - group: str - value: float - - -class BarChart(Chart2D): - type: Literal[ChartType.BAR] = ChartType.BAR - - elements: List[BarData] = Field(default_factory=list) - - def _extract_info(self, ax: Axes) -> None: - super()._extract_info(ax) - for container in ax.containers: - group_label = container.get_label() - if group_label.startswith("_container"): - number = int(group_label[10:]) - group_label = f"Group {number}" - - heights = [rect.get_height() for rect in container] - if all(height == heights[0] for height in heights): - # vertical bars - self._change_orientation() - labels = [label.get_text() for label in ax.get_yticklabels()] - values = [rect.get_width() for rect in container] - else: - # horizontal bars - labels = [label.get_text() for label in ax.get_xticklabels()] - values = heights - for label, value in zip(labels, values): - - bar = BarData(label=label, value=value, group=group_label) - self.elements.append(bar) - - -class PieData(BaseModel): - label: str - angle: float - radius: float - - -class PieChart(Chart): - type: Literal[ChartType.PIE] = ChartType.PIE - - elements: List[PieData] = Field(default_factory=list) - - def _extract_info(self, ax: Axes) -> None: - super()._extract_info(ax) - - for wedge in ax.patches: - pie_data = PieData( - label=wedge.get_label(), - angle=abs( - _dynamic_round(Decimal(wedge.theta2) - Decimal(wedge.theta1)) - ), - radius=wedge.r, - ) - - self.elements.append(pie_data) - - -class BoxAndWhiskerData(BaseModel): - label: str - min: float - first_quartile: float - median: float - third_quartile: float - max: float - outliers: List[float] = Field(default_factory=list) - - -class BoxAndWhiskerChart(Chart2D): - type: Literal[ChartType.BOX_AND_WHISKER] = ChartType.BOX_AND_WHISKER - - elements: List[BoxAndWhiskerData] = Field(default_factory=list) - - def _extract_info(self, ax: Axes) -> None: - super()._extract_info(ax) - - labels = [item.get_text() for item in ax.get_xticklabels()] - - boxes = [] - for label, box in zip(labels, ax.patches): - vertices = box.get_path().vertices - x_vertices = [_dynamic_round(x) for x in vertices[:, 0]] - y_vertices = [_dynamic_round(y) for y in vertices[:, 1]] - x = min(x_vertices) - y = min(y_vertices) - boxes.append( - { - "x": x, - "y": y, - "label": label, - "width": max(x_vertices) - x, - "height": max(y_vertices) - y, - "outliers": [], - } - ) - - orientation = "horizontal" - if all(box["height"] == boxes[0]["height"] for box in boxes): - orientation = "vertical" - - if orientation == "vertical": - self._change_orientation() - for box in boxes: - box["x"], box["y"] = box["y"], box["x"] - box["width"], box["height"] = box["height"], box["width"] - - for i, line in enumerate(ax.lines): - xdata = [_dynamic_round(x) for x in line.get_xdata()] - ydata = [_dynamic_round(y) for y in line.get_ydata()] - - if orientation == "vertical": - xdata, ydata = ydata, xdata - - if len(xdata) == 1: - for box in boxes: - if box["x"] <= xdata[0] <= box["x"] + box["width"]: - break - else: - continue - - box["outliers"].append(ydata[0]) - if len(ydata) != 2: - continue - for box in boxes: - if box["x"] <= xdata[0] <= xdata[1] <= box["x"] + box["width"]: - break - else: - continue - - if ( - # Check if the line is inside the box, prevent floating point errors - ydata[0] == ydata[1] - and box["y"] <= ydata[0] <= box["y"] + box["height"] - ): - box["median"] = ydata[0] - continue - - lower_value = min(ydata) - upper_value = max(ydata) - if upper_value == box["y"]: - box["whisker_lower"] = lower_value - elif lower_value == box["y"] + box["height"]: - box["whisker_upper"] = upper_value - - self.elements = [ - BoxAndWhiskerData( - label=box["label"], - min=box["whisker_lower"], - first_quartile=box["y"], - median=box["median"], - third_quartile=box["y"] + box["height"], - max=box["whisker_upper"], - outliers=box["outliers"], - ) - for box in boxes - ] - - -class SuperChart(Chart): - type: Literal[ChartType.SUPERCHART] = ChartType.SUPERCHART - elements: List[ - LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart - ] = Field(default_factory=list) - - def __init__(self, figure: Figure): - title = figure.get_suptitle() - super().__init__(title=title) - - self.elements = [get_chart_from_ax(ax) for ax in figure.axes] - - -def _get_type_of_chart(ax: Axes) -> ChartType: - objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) - - # Check for Line plots - if all(isinstance(line, Line2D) for line in objects): - return ChartType.LINE - - if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): - return ChartType.BOX_AND_WHISKER - - filtered = [] - for obj in objects: - if isinstance(obj, Line2D) and _is_grid_line(obj): - continue - filtered.append(obj) - - objects = filtered - - # Check for Scatter plots - if all(isinstance(path, PathCollection) for path in objects): - return ChartType.SCATTER - - # Check for Pie plots - if all(isinstance(artist, Wedge) for artist in objects): - return ChartType.PIE - - # Check for Bar plots - if all(isinstance(rect, Rectangle) for rect in objects): - return ChartType.BAR - - return ChartType.UNKNOWN - - -def get_chart_from_ax( - ax: Axes, -) -> LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart | Chart: - chart_type = _get_type_of_chart(ax) - - if chart_type == ChartType.LINE: - chart = LineChart(ax=ax) - elif chart_type == ChartType.SCATTER: - chart = ScatterChart(ax=ax) - elif chart_type == ChartType.BAR: - chart = BarChart(ax=ax) - elif chart_type == ChartType.PIE: - chart = PieChart(ax=ax) - elif chart_type == ChartType.BOX_AND_WHISKER: - chart = BoxAndWhiskerChart(ax=ax) - else: - chart = Chart(ax=ax, type=chart_type) - - return chart +from e2b_code_interpreter_data_extraction import graph_figure_to_graph def _figure_repr_e2b_chart_(self: Figure): @@ -471,17 +12,8 @@ def _figure_repr_e2b_chart_(self: Figure): This method is used to extract data from the figure object to a dictionary """ # Get all Axes objects from the Figure - axes = self.get_axes() - try: - if not axes: - return {} - elif len(axes) > 1: - chart = SuperChart(figure=self) - else: - ax = axes[0] - chart = get_chart_from_ax(ax) - return chart.model_dump() + return graph_figure_to_graph(self) except: return {} From 98d24f501e2ad388da735e30b0167865dda5e7aa Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 22 Oct 2024 10:04:47 -0700 Subject: [PATCH 423/722] Pipeline --- .github/workflows/charts_tests.yml | 40 +++++++++ .github/workflows/pr.yml | 11 +++ .github/workflows/release.yml | 88 ++++++++++++++++++- .github/workflows/template.yml | 50 ----------- chart_data_extractor/README.md | 3 + .../e2b_charts}/__init__.py | 0 .../e2b_charts}/graphs/__init__.py | 0 .../e2b_charts}/graphs/bars.py | 0 .../e2b_charts}/graphs/base.py | 0 .../e2b_charts}/graphs/pie.py | 0 .../e2b_charts}/graphs/planar.py | 22 ++--- .../e2b_charts}/main.py | 8 +- .../e2b_charts/utils/__init__.py | 1 + .../e2b_charts}/utils/filtering.py | 0 chart_data_extractor/package.json | 12 +++ .../data => chart_data_extractor}/poetry.lock | 36 +------- .../pyproject.toml | 2 +- .../data => chart_data_extractor}/pytest.ini | 0 .../tests/graphs/test_bar.py | 4 +- .../tests/graphs/test_box_and_whiskers.py | 4 +- .../tests/graphs/test_categorical_scale.py | 4 +- .../tests/graphs/test_datetime_scale.py | 4 +- .../tests/graphs/test_line.py | 4 +- .../tests/graphs/test_log_graph.py | 4 +- .../tests/graphs/test_pie.py | 4 +- .../tests/graphs/test_scatter.py | 4 +- .../tests/graphs/test_supergraph.py | 6 +- .../tests/graphs/test_unknown.py | 4 +- .../tests/utils/test_detect_scale.py | 2 +- .../tests/utils/test_is_grid_line.py | 2 +- pnpm-workspace.yaml | 1 + template/packages/data/README.md | 3 - .../utils/__init__.py | 0 33 files changed, 193 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/charts_tests.yml delete mode 100644 .github/workflows/template.yml create mode 100644 chart_data_extractor/README.md rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/__init__.py (100%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/graphs/__init__.py (100%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/graphs/bars.py (100%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/graphs/base.py (100%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/graphs/pie.py (100%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/graphs/planar.py (91%) rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/main.py (92%) create mode 100644 chart_data_extractor/e2b_charts/utils/__init__.py rename {template/packages/data/e2b_code_interpreter_data_extraction => chart_data_extractor/e2b_charts}/utils/filtering.py (100%) create mode 100644 chart_data_extractor/package.json rename {template/packages/data => chart_data_extractor}/poetry.lock (98%) rename {template/packages/data => chart_data_extractor}/pyproject.toml (91%) rename {template/packages/data => chart_data_extractor}/pytest.ini (100%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_bar.py (89%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_box_and_whiskers.py (90%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_categorical_scale.py (78%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_datetime_scale.py (82%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_line.py (93%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_log_graph.py (91%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_pie.py (90%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_scatter.py (91%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_supergraph.py (89%) rename {template/packages/data => chart_data_extractor}/tests/graphs/test_unknown.py (84%) rename {template/packages/data => chart_data_extractor}/tests/utils/test_detect_scale.py (90%) rename {template/packages/data => chart_data_extractor}/tests/utils/test_is_grid_line.py (84%) delete mode 100644 template/packages/data/README.md delete mode 100644 template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml new file mode 100644 index 00000000..3ed2c9f9 --- /dev/null +++ b/.github/workflows/charts_tests.yml @@ -0,0 +1,40 @@ +name: Test Python SDK + +on: + workflow_call: + +permissions: + contents: read + +jobs: + publish: + defaults: + run: + working-directory: ./chart_data_extractor + name: Build and test Chart Data Extractor + runs-on: ubuntu-20.04 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install dependencies + run: poetry install + + - name: Test build + run: poetry build + + - name: Run tests + run: poetry run pytest -n 4 --verbose -x diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 3de134d8..06447082 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -12,6 +12,7 @@ jobs: outputs: python: ${{ steps.filter.outputs.python }} js: ${{ steps.filter.outputs.js }} + charts: ${{ steps.filter.outputs.charts }} steps: - name: Checkout repository uses: actions/checkout@v3 @@ -38,6 +39,8 @@ jobs: - 'python/**' js: - 'js/**' + charts: + - 'chart_data_extractor/**' python-tests: needs: [ changes ] @@ -52,3 +55,11 @@ jobs: if: needs.changes.outputs.js == 'true' uses: ./.github/workflows/js_tests.yml secrets: inherit + + js-tests: + needs: [ changes ] + name: Tests JS package + # If the PR does not have the label 'js-rc', the code is already tested in the prerelease workflow + if: needs.changes.outputs.charts == 'true' && !contains( github.event.pull_request.labels.*.name, 'charts-rc') + uses: ./.github/workflows/charts_tests.yml + secrets: inherit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5876b58c..e3fea56b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -83,17 +83,99 @@ jobs: python: - 'python/**' + charts-tests: + name: Charts tests + needs: [changes] + if: needs.changes.outputs.charts == 'true' + uses: ./.github/workflows/charts_tests.yml + + charts-release: + name: Charts release + needs: [charts-tests] + if: needs.changes.outputs.charts == 'true' + defaults: + run: + working-directory: ./charts + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + + - name: Create new versions + run: pnpm run version + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Release new versions + uses: changesets/action@v1 + with: + publish: pnpm run publish + createGithubReleases: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + + build-docker-image: + name: Build Docker Image + runs-on: ubuntu-latest + needs: [changes, charts-release] + if: !cancelled() && needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push to DockerHub + working-directory: ./template + run: | + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true + docker buildx build \ + --file Dockerfile \ + --platform linux/amd64 \ + --push \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . + + build-template: + name: Build Docker Image + runs-on: ubuntu-latest + needs: [build-docker-image] + if: !cancelled() && needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Install E2B CLI + run: npm install -g @e2b/cli + + - name: Build e2b + run: e2b template build + working-directory: ./template + env: + E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} + python-tests: name: Python Tests - needs: [changes] - if: needs.changes.outputs.python == 'true' + needs: [changes, build-template] + if: !cancelled() && needs.changes.outputs.python == 'true' || needs.changes.outputs.template == 'true' uses: ./.github/workflows/python_tests.yml secrets: inherit js-tests: name: JS Tests needs: [changes] - if: needs.changes.outputs.js == 'true' + if: !cancelled() && needs.changes.outputs.js == 'true' || needs.changes.outputs.template == 'true' uses: ./.github/workflows/js_tests.yml secrets: inherit diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml deleted file mode 100644 index 4540b257..00000000 --- a/.github/workflows/template.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Build and push Code Interpreter template - -on: - push: - paths: - - 'template/**' - - '.github/workflows/template.yml' - branches: - - main - -permissions: - contents: read - -jobs: - buildAndPublish: - defaults: - run: - working-directory: ./template - - name: Build and Push Images - runs-on: ubuntu-20.04 - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push to DockerHub - run: | - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true - docker buildx build \ - --file Dockerfile \ - --platform linux/amd64 \ - --push \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . - - - name: Install E2B CLI - run: npm install -g @e2b/cli - - - name: Build e2b - run: e2b template build - env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} diff --git a/chart_data_extractor/README.md b/chart_data_extractor/README.md new file mode 100644 index 00000000..7c23e47f --- /dev/null +++ b/chart_data_extractor/README.md @@ -0,0 +1,3 @@ +# Extracting Data for Code Interpreter SDK + +This package is a utility used to extract data in the Code Interpreter SDK from, e.g., DataFrames and matplotlib plots. diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/__init__.py b/chart_data_extractor/e2b_charts/__init__.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/__init__.py rename to chart_data_extractor/e2b_charts/__init__.py diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py b/chart_data_extractor/e2b_charts/graphs/__init__.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/graphs/__init__.py rename to chart_data_extractor/e2b_charts/graphs/__init__.py diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py b/chart_data_extractor/e2b_charts/graphs/bars.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/graphs/bars.py rename to chart_data_extractor/e2b_charts/graphs/bars.py diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py b/chart_data_extractor/e2b_charts/graphs/base.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/graphs/base.py rename to chart_data_extractor/e2b_charts/graphs/base.py diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py b/chart_data_extractor/e2b_charts/graphs/pie.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/graphs/pie.py rename to chart_data_extractor/e2b_charts/graphs/pie.py diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py b/chart_data_extractor/e2b_charts/graphs/planar.py similarity index 91% rename from template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py rename to chart_data_extractor/e2b_charts/graphs/planar.py index d1a29d13..9753629b 100644 --- a/template/packages/data/e2b_code_interpreter_data_extraction/graphs/planar.py +++ b/chart_data_extractor/e2b_charts/graphs/planar.py @@ -8,7 +8,7 @@ from pydantic import BaseModel, field_validator, Field from .base import Graph2D, GraphType -from ..utils.filtering import is_grid_line +from ..utils import is_grid_line class PointData(BaseModel): @@ -22,19 +22,19 @@ def transform_points( ) -> List[Tuple[Union[str, float], Union[str, float]]]: parsed_value = [] for x, y in value: - if isinstance(x, date): - x = x.isoformat() - if isinstance(x, numpy.datetime64): - x = x.astype("datetime64[s]").astype(str) - - if isinstance(y, date): - y = y.isoformat() - if isinstance(y, numpy.datetime64): - y = y.astype("datetime64[s]").astype(str) - + x = cls._parse_point(x) + y = cls._parse_point(y) parsed_value.append((x, y)) return parsed_value + @staticmethod + def _parse_point(point): + if isinstance(point, date): + return point.isoformat() + if isinstance(point, numpy.datetime64): + return point.astype("datetime64[s]").astype(str) + return point + class PointGraph(Graph2D): x_ticks: List[Union[str, float]] = Field(default_factory=list) diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/main.py b/chart_data_extractor/e2b_charts/main.py similarity index 92% rename from template/packages/data/e2b_code_interpreter_data_extraction/main.py rename to chart_data_extractor/e2b_charts/main.py index 7ce93a9a..783b2612 100644 --- a/template/packages/data/e2b_code_interpreter_data_extraction/main.py +++ b/chart_data_extractor/e2b_charts/main.py @@ -1,4 +1,4 @@ -from typing import Optional, List, Any, Literal +from typing import Optional, List, Literal from matplotlib.axes import Axes from matplotlib.collections import PathCollection @@ -7,9 +7,9 @@ from matplotlib.pyplot import Figure from matplotlib.text import Text -from pydantic import BaseModel, Field +from pydantic import Field -from e2b_code_interpreter_data_extraction.graphs import ( +from e2b_data_extraction.graphs import ( GraphType, Graph, LineGraph, @@ -18,7 +18,7 @@ PieGraph, ScatterGraph, ) -from e2b_code_interpreter_data_extraction.utils.filtering import is_grid_line +from e2b_data_extraction.utils.filtering import is_grid_line class SuperGraph(Graph): diff --git a/chart_data_extractor/e2b_charts/utils/__init__.py b/chart_data_extractor/e2b_charts/utils/__init__.py new file mode 100644 index 00000000..7822a91f --- /dev/null +++ b/chart_data_extractor/e2b_charts/utils/__init__.py @@ -0,0 +1 @@ +from .filtering import is_grid_line diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py b/chart_data_extractor/e2b_charts/utils/filtering.py similarity index 100% rename from template/packages/data/e2b_code_interpreter_data_extraction/utils/filtering.py rename to chart_data_extractor/e2b_charts/utils/filtering.py diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json new file mode 100644 index 00000000..302606ca --- /dev/null +++ b/chart_data_extractor/package.json @@ -0,0 +1,12 @@ +{ + "name": "@e2b/data-extractor", + "private": true, + "version": "0.0.0", + "scripts": { + "test": "poetry run pytest -n 4 --verbose -x", + "example": "poetry run python3 example.py", + "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", + "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", + "pretest": "poetry install" + } +} diff --git a/template/packages/data/poetry.lock b/chart_data_extractor/poetry.lock similarity index 98% rename from template/packages/data/poetry.lock rename to chart_data_extractor/poetry.lock index c20048ec..1a4794e9 100644 --- a/template/packages/data/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -135,20 +135,6 @@ files = [ [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "execnet" -version = "2.1.1" -description = "execnet: rapid multi-Python deployment" -optional = false -python-versions = ">=3.8" -files = [ - {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, - {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, -] - -[package.extras] -testing = ["hatch", "pre-commit", "pytest", "tox"] - [[package]] name = "fonttools" version = "4.54.1" @@ -760,26 +746,6 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" -[[package]] -name = "pytest-xdist" -version = "3.6.1" -description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, - {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, -] - -[package.dependencies] -execnet = ">=2.1" -pytest = ">=7.0.0" - -[package.extras] -psutil = ["psutil (>=3.0)"] -setproctitle = ["setproctitle"] -testing = ["filelock"] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -844,4 +810,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "b21f4b46a6df85df1c6558a2e29a94691f80f7eb45558f207bc133641d1a75b1" +content-hash = "440d62778fbcd344ce5be61672491bf9e571ba5676add56b26296e30dd2f1bbf" diff --git a/template/packages/data/pyproject.toml b/chart_data_extractor/pyproject.toml similarity index 91% rename from template/packages/data/pyproject.toml rename to chart_data_extractor/pyproject.toml index 4556def5..40515dcf 100644 --- a/template/packages/data/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -7,7 +7,7 @@ license = "Apache-2.0" readme = "README.md" homepage = "https://e2b.dev/" repository = "https://github.com/e2b-dev/e2b-code-interpreter/tree/python" -packages = [{ include = "e2b_code_interpreter_data_extraction" }] +packages = [{ include = "e2b_charts" }] [tool.poetry.dependencies] python = "^3.10" diff --git a/template/packages/data/pytest.ini b/chart_data_extractor/pytest.ini similarity index 100% rename from template/packages/data/pytest.ini rename to chart_data_extractor/pytest.ini diff --git a/template/packages/data/tests/graphs/test_bar.py b/chart_data_extractor/tests/graphs/test_bar.py similarity index 89% rename from template/packages/data/tests/graphs/test_bar.py rename to chart_data_extractor/tests/graphs/test_bar.py index 44d157c3..ede91032 100644 --- a/template/packages/data/tests/graphs/test_bar.py +++ b/chart_data_extractor/tests/graphs/test_bar.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import BarGraph, GraphType +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import BarGraph, GraphType def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_box_and_whiskers.py b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py similarity index 90% rename from template/packages/data/tests/graphs/test_box_and_whiskers.py rename to chart_data_extractor/tests/graphs/test_box_and_whiskers.py index 7f77ee29..fcd74a2e 100644 --- a/template/packages/data/tests/graphs/test_box_and_whiskers.py +++ b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import BoxAndWhiskerGraph, GraphType +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import BoxAndWhiskerGraph, GraphType def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_categorical_scale.py b/chart_data_extractor/tests/graphs/test_categorical_scale.py similarity index 78% rename from template/packages/data/tests/graphs/test_categorical_scale.py rename to chart_data_extractor/tests/graphs/test_categorical_scale.py index cc3449e6..4a552ff5 100644 --- a/template/packages/data/tests/graphs/test_categorical_scale.py +++ b/chart_data_extractor/tests/graphs/test_categorical_scale.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import LineGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import LineGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_datetime_scale.py b/chart_data_extractor/tests/graphs/test_datetime_scale.py similarity index 82% rename from template/packages/data/tests/graphs/test_datetime_scale.py rename to chart_data_extractor/tests/graphs/test_datetime_scale.py index 34a58ce7..881df3db 100644 --- a/template/packages/data/tests/graphs/test_datetime_scale.py +++ b/chart_data_extractor/tests/graphs/test_datetime_scale.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import LineGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import LineGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_line.py b/chart_data_extractor/tests/graphs/test_line.py similarity index 93% rename from template/packages/data/tests/graphs/test_line.py rename to chart_data_extractor/tests/graphs/test_line.py index ed9ff54c..f73fa9e1 100644 --- a/template/packages/data/tests/graphs/test_line.py +++ b/chart_data_extractor/tests/graphs/test_line.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import LineGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import LineGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_log_graph.py b/chart_data_extractor/tests/graphs/test_log_graph.py similarity index 91% rename from template/packages/data/tests/graphs/test_log_graph.py rename to chart_data_extractor/tests/graphs/test_log_graph.py index 54b6feae..10748502 100644 --- a/template/packages/data/tests/graphs/test_log_graph.py +++ b/chart_data_extractor/tests/graphs/test_log_graph.py @@ -1,8 +1,8 @@ import numpy as np import matplotlib.pyplot as plt -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import LineGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import LineGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_pie.py b/chart_data_extractor/tests/graphs/test_pie.py similarity index 90% rename from template/packages/data/tests/graphs/test_pie.py rename to chart_data_extractor/tests/graphs/test_pie.py index c267d1b7..e0bc0c16 100644 --- a/template/packages/data/tests/graphs/test_pie.py +++ b/chart_data_extractor/tests/graphs/test_pie.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import PieGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import PieGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_scatter.py b/chart_data_extractor/tests/graphs/test_scatter.py similarity index 91% rename from template/packages/data/tests/graphs/test_scatter.py rename to chart_data_extractor/tests/graphs/test_scatter.py index 116a60aa..cc035247 100644 --- a/template/packages/data/tests/graphs/test_scatter.py +++ b/chart_data_extractor/tests/graphs/test_scatter.py @@ -1,8 +1,8 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import ScatterGraph +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import ScatterGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_supergraph.py b/chart_data_extractor/tests/graphs/test_supergraph.py similarity index 89% rename from template/packages/data/tests/graphs/test_supergraph.py rename to chart_data_extractor/tests/graphs/test_supergraph.py index 7af44233..abcba65a 100644 --- a/template/packages/data/tests/graphs/test_supergraph.py +++ b/chart_data_extractor/tests/graphs/test_supergraph.py @@ -1,13 +1,13 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import ( +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import ( GraphType, LineGraph, ScatterGraph, ) -from e2b_code_interpreter_data_extraction.main import SuperGraph +from e2b_data_extraction.main import SuperGraph def _prep_graph_figure(): diff --git a/template/packages/data/tests/graphs/test_unknown.py b/chart_data_extractor/tests/graphs/test_unknown.py similarity index 84% rename from template/packages/data/tests/graphs/test_unknown.py rename to chart_data_extractor/tests/graphs/test_unknown.py index 4767d7eb..da314c06 100644 --- a/template/packages/data/tests/graphs/test_unknown.py +++ b/chart_data_extractor/tests/graphs/test_unknown.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_code_interpreter_data_extraction import graph_figure_to_graph -from e2b_code_interpreter_data_extraction.graphs import Graph, GraphType +from e2b_data_extraction import graph_figure_to_graph +from e2b_data_extraction.graphs import Graph, GraphType def _prep_graph_figure(): diff --git a/template/packages/data/tests/utils/test_detect_scale.py b/chart_data_extractor/tests/utils/test_detect_scale.py similarity index 90% rename from template/packages/data/tests/utils/test_detect_scale.py rename to chart_data_extractor/tests/utils/test_detect_scale.py index 3c08a5ce..7eab4207 100644 --- a/template/packages/data/tests/utils/test_detect_scale.py +++ b/chart_data_extractor/tests/utils/test_detect_scale.py @@ -2,7 +2,7 @@ from matplotlib.dates import _SwitchableDateConverter -from e2b_code_interpreter_data_extraction.graphs.planar import PointGraph +from e2b_data_extraction.graphs.planar import PointGraph def test_detect_scale(): diff --git a/template/packages/data/tests/utils/test_is_grid_line.py b/chart_data_extractor/tests/utils/test_is_grid_line.py similarity index 84% rename from template/packages/data/tests/utils/test_is_grid_line.py rename to chart_data_extractor/tests/utils/test_is_grid_line.py index 63b071b5..df060ccb 100644 --- a/template/packages/data/tests/utils/test_is_grid_line.py +++ b/chart_data_extractor/tests/utils/test_is_grid_line.py @@ -1,6 +1,6 @@ from matplotlib.lines import Line2D -from e2b_code_interpreter_data_extraction.utils.filtering import is_grid_line +from e2b_data_extraction.utils.filtering import is_grid_line def test_is_grid_line(): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c9a0a34e..16b006b4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - js - python + - chart_data_extractor diff --git a/template/packages/data/README.md b/template/packages/data/README.md deleted file mode 100644 index 178eaa2c..00000000 --- a/template/packages/data/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Extracting data for Code Interpreter SDK - -This package is used to extract data in the Code Interpreter SDK from e.g. DataFrames and matplotlib plots. diff --git a/template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py b/template/packages/data/e2b_code_interpreter_data_extraction/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 From 12ec3bc121061d8590e5081e712489d7d7972bd4 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 24 Oct 2024 10:44:55 -0700 Subject: [PATCH 424/722] Fix repo link in code interpreter pyproject --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 749a4515..15c47049 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -6,7 +6,7 @@ authors = ["e2b "] license = "Apache-2.0" readme = "README.md" homepage = "https://e2b.dev/" -repository = "https://github.com/e2b-dev/e2b-code-interpreter/tree/python" +repository = "https://github.com/e2b-dev/code-interpreter/tree/main/python" packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] From 2d3fea6e33ff705084a9830945e03c67509c692b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 13:59:06 -0700 Subject: [PATCH 425/722] Correct the release chart package workflow --- .github/workflows/charts_tests.yml | 4 +- .github/workflows/pr.yml | 4 +- .github/workflows/release.yml | 70 +++++++++++++++---- .../e2b_charts/graphs/bars.py | 32 ++++++--- chart_data_extractor/e2b_charts/graphs/pie.py | 4 +- chart_data_extractor/e2b_charts/main.py | 4 +- .../e2b_charts/utils/rounding.py | 13 ++++ chart_data_extractor/package.json | 3 +- chart_data_extractor/pyproject.toml | 4 +- chart_data_extractor/pytest.ini | 3 - chart_data_extractor/tests/graphs/test_bar.py | 4 +- .../tests/graphs/test_box_and_whiskers.py | 4 +- .../tests/graphs/test_categorical_scale.py | 4 +- .../tests/graphs/test_datetime_scale.py | 4 +- .../tests/graphs/test_line.py | 4 +- .../tests/graphs/test_log_graph.py | 4 +- chart_data_extractor/tests/graphs/test_pie.py | 4 +- .../tests/graphs/test_scatter.py | 4 +- .../tests/graphs/test_supergraph.py | 6 +- .../tests/graphs/test_unknown.py | 4 +- .../tests/utils/test_detect_scale.py | 2 +- .../tests/utils/test_is_grid_line.py | 2 +- template/requirements.txt | 4 +- template/startup_scripts/0002_data.py | 2 +- 24 files changed, 129 insertions(+), 64 deletions(-) create mode 100644 chart_data_extractor/e2b_charts/utils/rounding.py delete mode 100644 chart_data_extractor/pytest.ini diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index 3ed2c9f9..bd1ef28e 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.10' - name: Install and configure Poetry uses: snok/install-poetry@v1 @@ -37,4 +37,4 @@ jobs: run: poetry build - name: Run tests - run: poetry run pytest -n 4 --verbose -x + run: poetry run pytest --verbose -x diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 06447082..40c3251b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -56,9 +56,9 @@ jobs: uses: ./.github/workflows/js_tests.yml secrets: inherit - js-tests: + charts-tests: needs: [ changes ] - name: Tests JS package + name: Tests Chart package # If the PR does not have the label 'js-rc', the code is already tested in the prerelease workflow if: needs.changes.outputs.charts == 'true' && !contains( github.event.pull_request.labels.*.name, 'charts-rc') uses: ./.github/workflows/charts_tests.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3fea56b..419e93a1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,6 +56,8 @@ jobs: outputs: js: ${{ steps.filter.outputs.js }} python: ${{ steps.filter.outputs.python }} + charts: ${{ steps.filter.outputs.charts }} + template: ${{ steps.filter.outputs.template }} steps: - name: Checkout repository uses: actions/checkout@v3 @@ -82,6 +84,10 @@ jobs: - 'js/**' python: - 'python/**' + charts: + - 'chart_data_extractor/**' + template: + - 'template/**' charts-tests: name: Charts tests @@ -93,34 +99,59 @@ jobs: name: Charts release needs: [charts-tests] if: needs.changes.outputs.charts == 'true' - defaults: - run: - working-directory: ./charts runs-on: ubuntu-latest steps: - name: Checkout Repo uses: actions/checkout@v3 + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install + with: + version: 9.5 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Create new versions run: pnpm run version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Release new versions - uses: changesets/action@v1 - with: - publish: pnpm run publish - createGithubReleases: true + run: | + poetry build + poetry config pypi-token.pypi ${PYPI_TOKEN} + poetry publish --skip-existing + working-directory: ./chart_data_extractor env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + PYPI_TOKEN: ${{ secrets.CHARTS_PYPI_TOKEN }} build-docker-image: name: Build Docker Image runs-on: ubuntu-latest needs: [changes, charts-release] - if: !cancelled() && needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + if: needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' steps: - name: Checkout repository uses: actions/checkout@v3 @@ -147,10 +178,10 @@ jobs: --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . build-template: - name: Build Docker Image + name: Build E2B template runs-on: ubuntu-latest needs: [build-docker-image] - if: !cancelled() && needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + if: needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' steps: - name: Checkout repository uses: actions/checkout@v3 @@ -168,20 +199,29 @@ jobs: python-tests: name: Python Tests needs: [changes, build-template] - if: !cancelled() && needs.changes.outputs.python == 'true' || needs.changes.outputs.template == 'true' + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + (needs.changes.outputs.python == 'true' || needs.changes.outputs.template == 'true') uses: ./.github/workflows/python_tests.yml secrets: inherit js-tests: name: JS Tests - needs: [changes] - if: !cancelled() && needs.changes.outputs.js == 'true' || needs.changes.outputs.template == 'true' + needs: [changes, build-template] + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + (needs.changes.outputs.js == 'true' || needs.changes.outputs.template == 'true') uses: ./.github/workflows/js_tests.yml secrets: inherit release: needs: [python-tests, js-tests] - if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true') name: Release runs-on: ubuntu-latest steps: diff --git a/chart_data_extractor/e2b_charts/graphs/bars.py b/chart_data_extractor/e2b_charts/graphs/bars.py index a7783076..9949333e 100644 --- a/chart_data_extractor/e2b_charts/graphs/bars.py +++ b/chart_data_extractor/e2b_charts/graphs/bars.py @@ -4,6 +4,7 @@ from pydantic import BaseModel, Field from .base import Graph2D, GraphType +from ..utils.rounding import dynamic_round class BarData(BaseModel): @@ -48,6 +49,7 @@ class BoxAndWhiskerData(BaseModel): median: float third_quartile: float max: float + outliers: List[float] class BoxAndWhiskerGraph(Graph2D): @@ -57,21 +59,23 @@ class BoxAndWhiskerGraph(Graph2D): def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) + labels = [item.get_text() for item in ax.get_xticklabels()] boxes = [] - for box in ax.patches: + for label, box in zip(labels, ax.patches): vertices = box.get_path().vertices - x_vertices = vertices[:, 0] - y_vertices = vertices[:, 1] + x_vertices = [dynamic_round(x) for x in vertices[:, 0]] + y_vertices = [dynamic_round(y) for y in vertices[:, 1]] x = min(x_vertices) y = min(y_vertices) boxes.append( { "x": x, "y": y, - "label": box.get_label(), - "width": round(max(x_vertices) - x, 4), - "height": round(max(y_vertices) - y, 4), + "label": label, + "width": max(x_vertices) - x, + "height": max(y_vertices) - y, + "outliers": [], } ) @@ -85,13 +89,21 @@ def _extract_info(self, ax: Axes) -> None: box["x"], box["y"] = box["y"], box["x"] box["width"], box["height"] = box["height"], box["width"] - for line in ax.lines: - xdata = line.get_xdata() - ydata = line.get_ydata() + for i, line in enumerate(ax.lines): + xdata = [dynamic_round(x) for x in line.get_xdata()] + ydata = [dynamic_round(y) for y in line.get_ydata()] if orientation == "vertical": xdata, ydata = ydata, xdata + if len(xdata) == 1: + for box in boxes: + if box["x"] <= xdata[0] <= box["x"] + box["width"]: + break + else: + continue + + box["outliers"].append(ydata[0]) if len(ydata) != 2: continue for box in boxes: @@ -101,6 +113,7 @@ def _extract_info(self, ax: Axes) -> None: continue if ( + # Check if the line is inside the box, prevent floating point errors ydata[0] == ydata[1] and box["y"] <= ydata[0] <= box["y"] + box["height"] ): @@ -122,6 +135,7 @@ def _extract_info(self, ax: Axes) -> None: median=box["median"], third_quartile=box["y"] + box["height"], max=box["whisker_upper"], + outliers=box["outliers"], ) for box in boxes ] diff --git a/chart_data_extractor/e2b_charts/graphs/pie.py b/chart_data_extractor/e2b_charts/graphs/pie.py index 9abcb5e6..e3039ab9 100644 --- a/chart_data_extractor/e2b_charts/graphs/pie.py +++ b/chart_data_extractor/e2b_charts/graphs/pie.py @@ -1,9 +1,11 @@ +from decimal import Decimal from typing import Literal, List from matplotlib.axes import Axes from pydantic import BaseModel, Field from .base import Graph, GraphType +from ..utils.rounding import dynamic_round class PieData(BaseModel): @@ -23,7 +25,7 @@ def _extract_info(self, ax: Axes) -> None: for wedge in ax.patches: pie_data = PieData( label=wedge.get_label(), - angle=abs(round(wedge.theta2 - wedge.theta1, 4)), + angle=abs(dynamic_round(Decimal(wedge.theta2) - Decimal(wedge.theta1))), radius=wedge.r, ) diff --git a/chart_data_extractor/e2b_charts/main.py b/chart_data_extractor/e2b_charts/main.py index 783b2612..2642525e 100644 --- a/chart_data_extractor/e2b_charts/main.py +++ b/chart_data_extractor/e2b_charts/main.py @@ -9,7 +9,7 @@ from matplotlib.text import Text from pydantic import Field -from e2b_data_extraction.graphs import ( +from .graphs import ( GraphType, Graph, LineGraph, @@ -18,7 +18,7 @@ PieGraph, ScatterGraph, ) -from e2b_data_extraction.utils.filtering import is_grid_line +from .utils.filtering import is_grid_line class SuperGraph(Graph): diff --git a/chart_data_extractor/e2b_charts/utils/rounding.py b/chart_data_extractor/e2b_charts/utils/rounding.py new file mode 100644 index 00000000..4efbb667 --- /dev/null +++ b/chart_data_extractor/e2b_charts/utils/rounding.py @@ -0,0 +1,13 @@ +from decimal import Decimal, localcontext + + +def dynamic_round(number): + # Convert to Decimal for precise control + decimal_number = Decimal(str(number)) + + # Dynamically determine precision based on magnitude + precision = max(1, 8 - decimal_number.adjusted()) # 8 digits of precision + + with localcontext() as ctx: + ctx.prec = precision # Set the dynamic precision + return +decimal_number # The + operator applies rounding diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 302606ca..7665dee7 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,12 +1,11 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.0", + "version": "0.0.1", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", - "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install" } } diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 40515dcf..1ee9e334 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] -name = "e2b-code-interpreter-data-extraction" -version = "0.0.0" +name = "e2b-charts" +version = "0.0.1" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "Apache-2.0" diff --git a/chart_data_extractor/pytest.ini b/chart_data_extractor/pytest.ini deleted file mode 100644 index 71e3e2c8..00000000 --- a/chart_data_extractor/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -# content of pytest.ini -[pytest] -addopts = "--numprocesses=4" diff --git a/chart_data_extractor/tests/graphs/test_bar.py b/chart_data_extractor/tests/graphs/test_bar.py index ede91032..86f27bb0 100644 --- a/chart_data_extractor/tests/graphs/test_bar.py +++ b/chart_data_extractor/tests/graphs/test_bar.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import BarGraph, GraphType +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import BarGraph, GraphType def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_box_and_whiskers.py b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py index fcd74a2e..06b17599 100644 --- a/chart_data_extractor/tests/graphs/test_box_and_whiskers.py +++ b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import BoxAndWhiskerGraph, GraphType +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import BoxAndWhiskerGraph, GraphType def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_categorical_scale.py b/chart_data_extractor/tests/graphs/test_categorical_scale.py index 4a552ff5..aaaea036 100644 --- a/chart_data_extractor/tests/graphs/test_categorical_scale.py +++ b/chart_data_extractor/tests/graphs/test_categorical_scale.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import LineGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import LineGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_datetime_scale.py b/chart_data_extractor/tests/graphs/test_datetime_scale.py index 881df3db..73807f3e 100644 --- a/chart_data_extractor/tests/graphs/test_datetime_scale.py +++ b/chart_data_extractor/tests/graphs/test_datetime_scale.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import LineGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import LineGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_line.py b/chart_data_extractor/tests/graphs/test_line.py index f73fa9e1..aa162afb 100644 --- a/chart_data_extractor/tests/graphs/test_line.py +++ b/chart_data_extractor/tests/graphs/test_line.py @@ -2,8 +2,8 @@ import matplotlib.pyplot as plt import datetime -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import LineGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import LineGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_log_graph.py b/chart_data_extractor/tests/graphs/test_log_graph.py index 10748502..deba7fb4 100644 --- a/chart_data_extractor/tests/graphs/test_log_graph.py +++ b/chart_data_extractor/tests/graphs/test_log_graph.py @@ -1,8 +1,8 @@ import numpy as np import matplotlib.pyplot as plt -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import LineGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import LineGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_pie.py b/chart_data_extractor/tests/graphs/test_pie.py index e0bc0c16..103b8a08 100644 --- a/chart_data_extractor/tests/graphs/test_pie.py +++ b/chart_data_extractor/tests/graphs/test_pie.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import PieGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import PieGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_scatter.py b/chart_data_extractor/tests/graphs/test_scatter.py index cc035247..a30bc2d9 100644 --- a/chart_data_extractor/tests/graphs/test_scatter.py +++ b/chart_data_extractor/tests/graphs/test_scatter.py @@ -1,8 +1,8 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import ScatterGraph +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import ScatterGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_supergraph.py b/chart_data_extractor/tests/graphs/test_supergraph.py index abcba65a..c5a1b23d 100644 --- a/chart_data_extractor/tests/graphs/test_supergraph.py +++ b/chart_data_extractor/tests/graphs/test_supergraph.py @@ -1,13 +1,13 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import ( +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import ( GraphType, LineGraph, ScatterGraph, ) -from e2b_data_extraction.main import SuperGraph +from e2b_charts.main import SuperGraph def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/graphs/test_unknown.py b/chart_data_extractor/tests/graphs/test_unknown.py index da314c06..52b3e6cd 100644 --- a/chart_data_extractor/tests/graphs/test_unknown.py +++ b/chart_data_extractor/tests/graphs/test_unknown.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt -from e2b_data_extraction import graph_figure_to_graph -from e2b_data_extraction.graphs import Graph, GraphType +from e2b_charts import graph_figure_to_graph +from e2b_charts.graphs import Graph, GraphType def _prep_graph_figure(): diff --git a/chart_data_extractor/tests/utils/test_detect_scale.py b/chart_data_extractor/tests/utils/test_detect_scale.py index 7eab4207..41314b71 100644 --- a/chart_data_extractor/tests/utils/test_detect_scale.py +++ b/chart_data_extractor/tests/utils/test_detect_scale.py @@ -2,7 +2,7 @@ from matplotlib.dates import _SwitchableDateConverter -from e2b_data_extraction.graphs.planar import PointGraph +from e2b_charts.graphs.planar import PointGraph def test_detect_scale(): diff --git a/chart_data_extractor/tests/utils/test_is_grid_line.py b/chart_data_extractor/tests/utils/test_is_grid_line.py index df060ccb..02dcd2fe 100644 --- a/chart_data_extractor/tests/utils/test_is_grid_line.py +++ b/chart_data_extractor/tests/utils/test_is_grid_line.py @@ -1,6 +1,6 @@ from matplotlib.lines import Line2D -from e2b_data_extraction.utils.filtering import is_grid_line +from e2b_charts.utils.filtering import is_grid_line def test_is_grid_line(): diff --git a/template/requirements.txt b/template/requirements.txt index 2900258c..502e79c6 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -4,7 +4,7 @@ ipykernel==6.29.3 ipython==8.22.2 # Latest version for -e2b_code_interpreter_data_extraction +e2b_charts # Other packages aiohttp==3.9.3 @@ -14,7 +14,7 @@ gensim==4.3.2 imageio==2.34.0 joblib==1.3.2 librosa==0.10.1 -matplotlib==3.8.3 +matplotlib==3.9.2 nltk==3.8.1 numpy==1.26.4 opencv-python==4.9.0.80 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 6bce7306..6308cf79 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -4,7 +4,7 @@ from IPython.core.formatters import BaseFormatter from traitlets.traitlets import Unicode, ObjectName -from e2b_code_interpreter_data_extraction import graph_figure_to_graph +from e2b_charts import graph_figure_to_graph def _figure_repr_e2b_chart_(self: Figure): From bf56befdbfb175b4bc46d7621b292b2150b3225f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 14:03:24 -0700 Subject: [PATCH 426/722] Detect only real changes --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 419e93a1..c2e4d7a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,11 +81,11 @@ jobs: base: ${{ steps.last_release.outputs.tag_name }} filters: | js: - - 'js/**' + - 'js/src/**' python: - - 'python/**' + - 'python/e2b_code_interpreter/**' charts: - - 'chart_data_extractor/**' + - 'chart_data_extractor/e2b_charts/**' template: - 'template/**' From d9ebb611b150a2604c3a70c5cb0faad6c73d41ac Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 14:06:59 -0700 Subject: [PATCH 427/722] Release chart package --- .changeset/mighty-carrots-heal.md | 5 +++++ chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/mighty-carrots-heal.md diff --git a/.changeset/mighty-carrots-heal.md b/.changeset/mighty-carrots-heal.md new file mode 100644 index 00000000..66eb92de --- /dev/null +++ b/.changeset/mighty-carrots-heal.md @@ -0,0 +1,5 @@ +--- +'@e2b/data-extractor': patch +--- + +Initial release diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 7665dee7..19e836ce 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.1", + "version": "0.0.0", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 1ee9e334..60981062 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.1" +version = "0.0.0" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "Apache-2.0" From 665570974a0e26845bfc0185d86d1a299b8e4b31 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 15:14:14 -0700 Subject: [PATCH 428/722] Rename to charts --- chart_data_extractor/e2b_charts/__init__.py | 2 +- .../e2b_charts/charts/__init__.py | 4 + .../e2b_charts/{graphs => charts}/bars.py | 10 +-- .../e2b_charts/{graphs => charts}/base.py | 14 ++-- .../e2b_charts/{graphs => charts}/pie.py | 6 +- .../e2b_charts/{graphs => charts}/planar.py | 14 ++-- .../e2b_charts/graphs/__init__.py | 4 - chart_data_extractor/e2b_charts/main.py | 84 +++++++++---------- chart_data_extractor/tests/graphs/test_bar.py | 34 ++++---- .../tests/graphs/test_box_and_whiskers.py | 28 +++---- .../tests/graphs/test_categorical_scale.py | 18 ++-- .../tests/graphs/test_datetime_scale.py | 18 ++-- .../tests/graphs/test_line.py | 42 +++++----- .../tests/graphs/test_log_graph.py | 42 +++++----- chart_data_extractor/tests/graphs/test_pie.py | 24 +++--- .../tests/graphs/test_scatter.py | 40 ++++----- .../tests/graphs/test_supergraph.py | 62 +++++++------- .../tests/graphs/test_unknown.py | 22 ++--- .../tests/utils/test_detect_scale.py | 10 +-- 19 files changed, 239 insertions(+), 239 deletions(-) create mode 100644 chart_data_extractor/e2b_charts/charts/__init__.py rename chart_data_extractor/e2b_charts/{graphs => charts}/bars.py (95%) rename chart_data_extractor/e2b_charts/{graphs => charts}/base.py (87%) rename chart_data_extractor/e2b_charts/{graphs => charts}/pie.py (86%) rename chart_data_extractor/e2b_charts/{graphs => charts}/planar.py (93%) delete mode 100644 chart_data_extractor/e2b_charts/graphs/__init__.py diff --git a/chart_data_extractor/e2b_charts/__init__.py b/chart_data_extractor/e2b_charts/__init__.py index 3dbdc8fa..adb4954c 100644 --- a/chart_data_extractor/e2b_charts/__init__.py +++ b/chart_data_extractor/e2b_charts/__init__.py @@ -1 +1 @@ -from .main import graph_figure_to_graph +from .main import chart_figure_to_chart, chart_figure_to_dict diff --git a/chart_data_extractor/e2b_charts/charts/__init__.py b/chart_data_extractor/e2b_charts/charts/__init__.py new file mode 100644 index 00000000..0cfbebd3 --- /dev/null +++ b/chart_data_extractor/e2b_charts/charts/__init__.py @@ -0,0 +1,4 @@ +from .base import ChartType, Chart +from .bars import BarChart, BoxAndWhiskerChart +from .pie import PieChart +from .planar import ScatterChart, LineChart diff --git a/chart_data_extractor/e2b_charts/graphs/bars.py b/chart_data_extractor/e2b_charts/charts/bars.py similarity index 95% rename from chart_data_extractor/e2b_charts/graphs/bars.py rename to chart_data_extractor/e2b_charts/charts/bars.py index 9949333e..a386ccdc 100644 --- a/chart_data_extractor/e2b_charts/graphs/bars.py +++ b/chart_data_extractor/e2b_charts/charts/bars.py @@ -3,7 +3,7 @@ from matplotlib.axes import Axes from pydantic import BaseModel, Field -from .base import Graph2D, GraphType +from .base import Chart2D, ChartType from ..utils.rounding import dynamic_round @@ -13,8 +13,8 @@ class BarData(BaseModel): value: float -class BarGraph(Graph2D): - type: Literal[GraphType.BAR] = GraphType.BAR +class BarChart(Chart2D): + type: Literal[ChartType.BAR] = ChartType.BAR elements: List[BarData] = Field(default_factory=list) @@ -52,8 +52,8 @@ class BoxAndWhiskerData(BaseModel): outliers: List[float] -class BoxAndWhiskerGraph(Graph2D): - type: Literal[GraphType.BOX_AND_WHISKER] = GraphType.BOX_AND_WHISKER +class BoxAndWhiskerChart(Chart2D): + type: Literal[ChartType.BOX_AND_WHISKER] = ChartType.BOX_AND_WHISKER elements: List[BoxAndWhiskerData] = Field(default_factory=list) diff --git a/chart_data_extractor/e2b_charts/graphs/base.py b/chart_data_extractor/e2b_charts/charts/base.py similarity index 87% rename from chart_data_extractor/e2b_charts/graphs/base.py rename to chart_data_extractor/e2b_charts/charts/base.py index 2dbc1afe..0985a9d8 100644 --- a/chart_data_extractor/e2b_charts/graphs/base.py +++ b/chart_data_extractor/e2b_charts/charts/base.py @@ -6,18 +6,18 @@ from pydantic import BaseModel, Field -class GraphType(str, enum.Enum): +class ChartType(str, enum.Enum): LINE = "line" SCATTER = "scatter" BAR = "bar" PIE = "pie" BOX_AND_WHISKER = "box_and_whisker" - SUPERGRAPH = "supergraph" + SUPERCHART = "superchart" UNKNOWN = "unknown" -class Graph(BaseModel): - type: GraphType +class Chart(BaseModel): + type: ChartType title: Optional[str] = None elements: List[Any] = Field(default_factory=list) @@ -29,7 +29,7 @@ def __init__(self, ax: Optional[Axes] = None, **kwargs): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for Graph + Function to extract information for Chart """ title = ax.get_title() if title == "": @@ -38,7 +38,7 @@ def _extract_info(self, ax: Axes) -> None: self.title = title -class Graph2D(Graph): +class Chart2D(Chart): x_label: Optional[str] = None y_label: Optional[str] = None x_unit: Optional[str] = None @@ -46,7 +46,7 @@ class Graph2D(Graph): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for Graph2D + Function to extract information for Chart2D """ super()._extract_info(ax) x_label = ax.get_xlabel() diff --git a/chart_data_extractor/e2b_charts/graphs/pie.py b/chart_data_extractor/e2b_charts/charts/pie.py similarity index 86% rename from chart_data_extractor/e2b_charts/graphs/pie.py rename to chart_data_extractor/e2b_charts/charts/pie.py index e3039ab9..bf722a1f 100644 --- a/chart_data_extractor/e2b_charts/graphs/pie.py +++ b/chart_data_extractor/e2b_charts/charts/pie.py @@ -4,7 +4,7 @@ from matplotlib.axes import Axes from pydantic import BaseModel, Field -from .base import Graph, GraphType +from .base import Chart, ChartType from ..utils.rounding import dynamic_round @@ -14,8 +14,8 @@ class PieData(BaseModel): radius: float -class PieGraph(Graph): - type: Literal[GraphType.PIE] = GraphType.PIE +class PieChart(Chart): + type: Literal[ChartType.PIE] = ChartType.PIE elements: List[PieData] = Field(default_factory=list) diff --git a/chart_data_extractor/e2b_charts/graphs/planar.py b/chart_data_extractor/e2b_charts/charts/planar.py similarity index 93% rename from chart_data_extractor/e2b_charts/graphs/planar.py rename to chart_data_extractor/e2b_charts/charts/planar.py index 9753629b..bb7d025d 100644 --- a/chart_data_extractor/e2b_charts/graphs/planar.py +++ b/chart_data_extractor/e2b_charts/charts/planar.py @@ -7,7 +7,7 @@ from matplotlib.dates import _SwitchableDateConverter from pydantic import BaseModel, field_validator, Field -from .base import Graph2D, GraphType +from .base import Chart2D, ChartType from ..utils import is_grid_line @@ -36,7 +36,7 @@ def _parse_point(point): return point -class PointGraph(Graph2D): +class PointChart(Chart2D): x_ticks: List[Union[str, float]] = Field(default_factory=list) x_tick_labels: List[str] = Field(default_factory=list) x_scale: str = Field(default="linear") @@ -49,7 +49,7 @@ class PointGraph(Graph2D): def _extract_info(self, ax: Axes) -> None: """ - Function to extract information for PointGraph + Function to extract information for PointChart """ super()._extract_info(ax) @@ -101,8 +101,8 @@ def _extract_ticks_info(converter: Any, ticks: Sequence) -> list: return list(ticks) -class LineGraph(PointGraph): - type: Literal[GraphType.LINE] = GraphType.LINE +class LineChart(PointChart): + type: Literal[ChartType.LINE] = ChartType.LINE def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) @@ -120,8 +120,8 @@ def _extract_info(self, ax: Axes) -> None: self.elements.append(line_data) -class ScatterGraph(PointGraph): - type: Literal[GraphType.SCATTER] = GraphType.SCATTER +class ScatterChart(PointChart): + type: Literal[ChartType.SCATTER] = ChartType.SCATTER def _extract_info(self, ax: Axes) -> None: super()._extract_info(ax) diff --git a/chart_data_extractor/e2b_charts/graphs/__init__.py b/chart_data_extractor/e2b_charts/graphs/__init__.py deleted file mode 100644 index f9914582..00000000 --- a/chart_data_extractor/e2b_charts/graphs/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .base import GraphType, Graph -from .bars import BarGraph, BoxAndWhiskerGraph -from .pie import PieGraph -from .planar import ScatterGraph, LineGraph diff --git a/chart_data_extractor/e2b_charts/main.py b/chart_data_extractor/e2b_charts/main.py index 2642525e..7e748add 100644 --- a/chart_data_extractor/e2b_charts/main.py +++ b/chart_data_extractor/e2b_charts/main.py @@ -9,40 +9,40 @@ from matplotlib.text import Text from pydantic import Field -from .graphs import ( - GraphType, - Graph, - LineGraph, - BarGraph, - BoxAndWhiskerGraph, - PieGraph, - ScatterGraph, +from .charts import ( + ChartType, + Chart, + LineChart, + BarChart, + BoxAndWhiskerChart, + PieChart, + ScatterChart, ) from .utils.filtering import is_grid_line -class SuperGraph(Graph): - type: Literal[GraphType.SUPERGRAPH] = GraphType.SUPERGRAPH +class SuperChart(Chart): + type: Literal[ChartType.SUPERCHART] = ChartType.SUPERCHART elements: List[ - LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph + LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart ] = Field(default_factory=list) def __init__(self, figure: Figure): title = figure.get_suptitle() super().__init__(title=title) - self.elements = [get_graph_from_ax(ax) for ax in figure.axes] + self.elements = [get_chart_from_ax(ax) for ax in figure.axes] -def _get_type_of_graph(ax: Axes) -> GraphType: +def _get_type_of_chart(ax: Axes) -> ChartType: objects = list(filter(lambda obj: not isinstance(obj, Text), ax._children)) # Check for Line plots if all(isinstance(line, Line2D) for line in objects): - return GraphType.LINE + return ChartType.LINE if all(isinstance(box_or_path, (PathPatch, Line2D)) for box_or_path in objects): - return GraphType.BOX_AND_WHISKER + return ChartType.BOX_AND_WHISKER filtered = [] for obj in objects: @@ -54,41 +54,41 @@ def _get_type_of_graph(ax: Axes) -> GraphType: # Check for Scatter plots if all(isinstance(path, PathCollection) for path in objects): - return GraphType.SCATTER + return ChartType.SCATTER # Check for Pie plots if all(isinstance(artist, Wedge) for artist in objects): - return GraphType.PIE + return ChartType.PIE # Check for Bar plots if all(isinstance(rect, Rectangle) for rect in objects): - return GraphType.BAR + return ChartType.BAR - return GraphType.UNKNOWN + return ChartType.UNKNOWN -def get_graph_from_ax( +def get_chart_from_ax( ax: Axes, -) -> LineGraph | ScatterGraph | BarGraph | PieGraph | BoxAndWhiskerGraph | Graph: - graph_type = _get_type_of_graph(ax) - - if graph_type == GraphType.LINE: - graph = LineGraph(ax=ax) - elif graph_type == GraphType.SCATTER: - graph = ScatterGraph(ax=ax) - elif graph_type == GraphType.BAR: - graph = BarGraph(ax=ax) - elif graph_type == GraphType.PIE: - graph = PieGraph(ax=ax) - elif graph_type == GraphType.BOX_AND_WHISKER: - graph = BoxAndWhiskerGraph(ax=ax) +) -> LineChart | ScatterChart | BarChart | PieChart | BoxAndWhiskerChart | Chart: + chart_type = _get_type_of_chart(ax) + + if chart_type == ChartType.LINE: + chart = LineChart(ax=ax) + elif chart_type == ChartType.SCATTER: + chart = ScatterChart(ax=ax) + elif chart_type == ChartType.BAR: + chart = BarChart(ax=ax) + elif chart_type == ChartType.PIE: + chart = PieChart(ax=ax) + elif chart_type == ChartType.BOX_AND_WHISKER: + chart = BoxAndWhiskerChart(ax=ax) else: - graph = Graph(ax=ax, type=graph_type) + chart = Chart(ax=ax, type=chart_type) - return graph + return chart -def graph_figure_to_graph(figure: Figure) -> Optional[Graph]: +def chart_figure_to_chart(figure: Figure) -> Optional[Chart]: """ This method is used to extract data from the figure object to a dictionary """ @@ -98,14 +98,14 @@ def graph_figure_to_graph(figure: Figure) -> Optional[Graph]: if not axes: return elif len(axes) > 1: - return SuperGraph(figure=figure) + return SuperChart(figure=figure) else: ax = axes[0] - return get_graph_from_ax(ax) + return get_chart_from_ax(ax) -def graph_figure_to_dict(figure: Figure) -> dict: - graph = graph_figure_to_graph(figure) - if graph: - return graph.model_dump() +def chart_figure_to_dict(figure: Figure) -> dict: + chart = chart_figure_to_chart(figure) + if chart: + return chart.model_dump() return {} diff --git a/chart_data_extractor/tests/graphs/test_bar.py b/chart_data_extractor/tests/graphs/test_bar.py index 86f27bb0..246b4d62 100644 --- a/chart_data_extractor/tests/graphs/test_bar.py +++ b/chart_data_extractor/tests/graphs/test_bar.py @@ -1,42 +1,42 @@ import matplotlib.pyplot as plt -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import BarGraph, GraphType +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import BarChart, ChartType -def _prep_graph_figure(): +def _prep_chart_figure(): # Prepare data authors = ["Author A", "Author B", "Author C", "Author D"] sales = [100, 200, 300, 400] - # Create and customize the bar graph + # Create and customize the bar chart plt.figure(figsize=(10, 6)) plt.bar(authors, sales, label="Books Sold", color="blue") plt.xlabel("Authors") plt.ylabel("Number of Books Sold") plt.title("Book Sales by Authors") - # Display the graph + # Display the chart plt.tight_layout() return plt.gcf() -def test_graph_bar(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_chart_bar(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, BarGraph) - assert graph.type == GraphType.BAR - assert graph.title == "Book Sales by Authors" + assert isinstance(chart, BarChart) + assert chart.type == ChartType.BAR + assert chart.title == "Book Sales by Authors" - assert graph.x_label == "Authors" - assert graph.y_label == "Number of Books Sold" + assert chart.x_label == "Authors" + assert chart.y_label == "Number of Books Sold" - assert graph.x_unit is None - assert graph.y_unit is None + assert chart.x_unit is None + assert chart.y_unit is None - bars = graph.elements + bars = chart.elements assert len(bars) == 4 assert [bar.value for bar in bars] == [100, 200, 300, 400] diff --git a/chart_data_extractor/tests/graphs/test_box_and_whiskers.py b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py index 06b17599..799e3ffd 100644 --- a/chart_data_extractor/tests/graphs/test_box_and_whiskers.py +++ b/chart_data_extractor/tests/graphs/test_box_and_whiskers.py @@ -1,10 +1,10 @@ import matplotlib.pyplot as plt -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import BoxAndWhiskerGraph, GraphType +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import BoxAndWhiskerChart, ChartType -def _prep_graph_figure(): +def _prep_chart_figure(): # Sample data data = { "Class A": [85, 90, 78, 92, 88], @@ -32,21 +32,21 @@ def _prep_graph_figure(): def test_box_and_whiskers(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, BoxAndWhiskerGraph) - assert graph.type == GraphType.BOX_AND_WHISKER - assert graph.title == "Exam Scores Distribution" + assert isinstance(chart, BoxAndWhiskerChart) + assert chart.type == ChartType.BOX_AND_WHISKER + assert chart.title == "Exam Scores Distribution" - assert graph.x_label == "Class" - assert graph.y_label == "Score" + assert chart.x_label == "Class" + assert chart.y_label == "Score" - assert graph.x_unit is None - assert graph.y_unit is None + assert chart.x_unit is None + assert chart.y_unit is None - bars = graph.elements + bars = chart.elements assert len(bars) == 3 assert all(isinstance(bar.min, float) for bar in bars) diff --git a/chart_data_extractor/tests/graphs/test_categorical_scale.py b/chart_data_extractor/tests/graphs/test_categorical_scale.py index aaaea036..e20ced61 100644 --- a/chart_data_extractor/tests/graphs/test_categorical_scale.py +++ b/chart_data_extractor/tests/graphs/test_categorical_scale.py @@ -2,11 +2,11 @@ import matplotlib.pyplot as plt import datetime -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import LineGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import LineChart -def _prep_graph_figure(): +def _prep_chart_figure(): x = [1, 2, 3, 4, 5] y = ["A", "B", "C", "D", "E"] @@ -18,10 +18,10 @@ def _prep_graph_figure(): def test_categorical_scale(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, LineGraph) - assert graph.x_scale == "linear" - assert graph.y_scale == "categorical" + assert isinstance(chart, LineChart) + assert chart.x_scale == "linear" + assert chart.y_scale == "categorical" diff --git a/chart_data_extractor/tests/graphs/test_datetime_scale.py b/chart_data_extractor/tests/graphs/test_datetime_scale.py index 73807f3e..a851d16b 100644 --- a/chart_data_extractor/tests/graphs/test_datetime_scale.py +++ b/chart_data_extractor/tests/graphs/test_datetime_scale.py @@ -2,11 +2,11 @@ import matplotlib.pyplot as plt import datetime -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import LineGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import LineChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Generate x values dates = [ datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100) @@ -21,10 +21,10 @@ def _prep_graph_figure(): def test_datetime_scale(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, LineGraph) - assert graph.x_scale == "datetime" - assert graph.y_scale == "linear" + assert isinstance(chart, LineChart) + assert chart.x_scale == "datetime" + assert chart.y_scale == "linear" diff --git a/chart_data_extractor/tests/graphs/test_line.py b/chart_data_extractor/tests/graphs/test_line.py index aa162afb..ed58e655 100644 --- a/chart_data_extractor/tests/graphs/test_line.py +++ b/chart_data_extractor/tests/graphs/test_line.py @@ -2,11 +2,11 @@ import matplotlib.pyplot as plt import datetime -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import LineGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import LineChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Generate x values dates = [ datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100) @@ -30,32 +30,32 @@ def _prep_graph_figure(): return plt.gcf() -def test_line_graph(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_line_chart(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, LineGraph) - assert graph.title == "Plot of sin(x) and cos(x)" + assert isinstance(chart, LineChart) + assert chart.title == "Plot of sin(x) and cos(x)" - assert graph.x_label == "Time (s)" - assert graph.y_label == "Amplitude (Hz)" + assert chart.x_label == "Time (s)" + assert chart.y_label == "Amplitude (Hz)" - assert graph.x_unit == "s" - assert graph.y_unit == "Hz" + assert chart.x_unit == "s" + assert chart.y_unit == "Hz" - assert graph.x_scale == "datetime" - assert graph.y_scale == "linear" + assert chart.x_scale == "datetime" + assert chart.y_scale == "linear" - assert all(isinstance(x, str) for x in graph.x_ticks) - parsed_date = datetime.datetime.fromisoformat(graph.x_ticks[0]) + assert all(isinstance(x, str) for x in chart.x_ticks) + parsed_date = datetime.datetime.fromisoformat(chart.x_ticks[0]) assert isinstance(parsed_date, datetime.datetime) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.y_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.y_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - lines = graph.elements + lines = chart.elements assert len(lines) == 2 first_line = lines[0] diff --git a/chart_data_extractor/tests/graphs/test_log_graph.py b/chart_data_extractor/tests/graphs/test_log_graph.py index deba7fb4..d5482211 100644 --- a/chart_data_extractor/tests/graphs/test_log_graph.py +++ b/chart_data_extractor/tests/graphs/test_log_graph.py @@ -1,11 +1,11 @@ import numpy as np import matplotlib.pyplot as plt -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import LineGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import LineChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Generate x values x = np.linspace(0, 100, 100) # Calculate y values @@ -21,7 +21,7 @@ def _prep_graph_figure(): # Add labels and title plt.xlabel("X-axis") plt.ylabel("Y-axis (log scale)") - plt.title("Graph with Log Scale on Y-axis") + plt.title("Chart with Log Scale on Y-axis") plt.legend() plt.grid(True) @@ -29,30 +29,30 @@ def _prep_graph_figure(): return plt.gcf() -def test_log_graph(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_log_chart(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, LineGraph) - assert graph.title == "Graph with Log Scale on Y-axis" + assert isinstance(chart, LineChart) + assert chart.title == "Chart with Log Scale on Y-axis" - assert graph.x_label == "X-axis" - assert graph.y_label == "Y-axis (log scale)" + assert chart.x_label == "X-axis" + assert chart.y_label == "Y-axis (log scale)" - assert graph.x_unit == None - assert graph.y_unit == "log scale" + assert chart.x_unit == None + assert chart.y_unit == "log scale" - assert graph.x_scale == "linear" - assert graph.y_scale == "log" + assert chart.x_scale == "linear" + assert chart.y_scale == "log" - assert all(isinstance(x, float) for x in graph.x_ticks) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(x, float) for x in chart.x_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.x_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.x_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - lines = graph.elements + lines = chart.elements assert len(lines) == 1 line = lines[0] diff --git a/chart_data_extractor/tests/graphs/test_pie.py b/chart_data_extractor/tests/graphs/test_pie.py index 103b8a08..28e7ac99 100644 --- a/chart_data_extractor/tests/graphs/test_pie.py +++ b/chart_data_extractor/tests/graphs/test_pie.py @@ -1,10 +1,10 @@ import matplotlib.pyplot as plt -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import PieGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import PieChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Step 1: Define the data for the pie chart categories = ["No", "No, in blue"] sizes = [90, 10] @@ -31,23 +31,23 @@ def _prep_graph_figure(): return plt.gcf() -def test_pie_graph(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_pie_chart(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, PieGraph) + assert isinstance(chart, PieChart) - assert graph.title == "Will I wake up early tomorrow?" + assert chart.title == "Will I wake up early tomorrow?" - assert len(graph.elements) == 2 + assert len(chart.elements) == 2 - first_data = graph.elements[0] + first_data = chart.elements[0] assert first_data.label == "No" assert first_data.angle == 324 assert first_data.radius == 1 - second_data = graph.elements[1] + second_data = chart.elements[1] assert second_data.label == "No, in blue" assert second_data.angle == 36 assert second_data.radius == 1 diff --git a/chart_data_extractor/tests/graphs/test_scatter.py b/chart_data_extractor/tests/graphs/test_scatter.py index a30bc2d9..e57582f1 100644 --- a/chart_data_extractor/tests/graphs/test_scatter.py +++ b/chart_data_extractor/tests/graphs/test_scatter.py @@ -1,11 +1,11 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import ScatterGraph +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import ScatterChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Create data N = 5 x1 = np.random.rand(N) @@ -24,35 +24,35 @@ def _prep_graph_figure(): return plt.gcf() -def test_scatter_graph(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_scatter_chart(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, ScatterGraph) + assert isinstance(chart, ScatterChart) - assert graph.title is None - assert graph.x_label == "A" - assert graph.y_label == "B" + assert chart.title is None + assert chart.x_label == "A" + assert chart.y_label == "B" - assert graph.x_scale == "linear" - assert graph.y_scale == "linear" + assert chart.x_scale == "linear" + assert chart.y_scale == "linear" - assert all(isinstance(x, float) for x in graph.x_ticks) - assert all(isinstance(y, float) for y in graph.y_ticks) + assert all(isinstance(x, float) for x in chart.x_ticks) + assert all(isinstance(y, float) for y in chart.y_ticks) - assert all(isinstance(x, str) for x in graph.y_tick_labels) - assert all(isinstance(y, str) for y in graph.y_tick_labels) + assert all(isinstance(x, str) for x in chart.y_tick_labels) + assert all(isinstance(y, str) for y in chart.y_tick_labels) - assert len(graph.elements) == 2 + assert len(chart.elements) == 2 - first_data = graph.elements[0] + first_data = chart.elements[0] assert first_data.label == "Dataset 1" assert len(first_data.points) == 5 print(first_data.points) assert all(isinstance(x, tuple) for x in first_data.points) - second_data = graph.elements[1] + second_data = chart.elements[1] assert second_data.label == "Dataset 2" assert len(second_data.points) == 10 assert all(isinstance(x, tuple) for x in second_data.points) diff --git a/chart_data_extractor/tests/graphs/test_supergraph.py b/chart_data_extractor/tests/graphs/test_supergraph.py index c5a1b23d..ca3e569e 100644 --- a/chart_data_extractor/tests/graphs/test_supergraph.py +++ b/chart_data_extractor/tests/graphs/test_supergraph.py @@ -1,23 +1,23 @@ import matplotlib.pyplot as plt import numpy as np -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import ( - GraphType, - LineGraph, - ScatterGraph, +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import ( + ChartType, + LineChart, + ScatterChart, ) -from e2b_charts.main import SuperGraph +from e2b_charts.main import SuperChart -def _prep_graph_figure(): +def _prep_chart_figure(): # Data for plotting x1 = np.linspace(0, 10, 100) y1 = np.sin(x1) # Create a figure with multiple subplots fig, axs = plt.subplots(1, 2, figsize=(10, 8)) - fig.suptitle("Multiple Graphs Example", fontsize=16) + fig.suptitle("Multiple Charts Example", fontsize=16) # Plotting on the different axes axs[0].plot(x1, y1, "r") @@ -37,30 +37,30 @@ def _prep_graph_figure(): return plt.gcf() -def test_super_graph(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_super_chart(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, SuperGraph) - assert graph.type == GraphType.SUPERGRAPH - assert graph.title == "Multiple Graphs Example" + assert isinstance(chart, SuperChart) + assert chart.type == ChartType.SUPERCHART + assert chart.title == "Multiple Charts Example" - graphs = graph.elements - assert len(graphs) == 2 + charts = chart.elements + assert len(charts) == 2 - first_graph = graphs[0] - assert first_graph.title == "Sine Wave" - assert isinstance(first_graph, LineGraph) - assert first_graph.x_label is None - assert first_graph.y_label is None - assert len(first_graph.elements) == 1 - assert len(first_graph.elements[0].points) == 100 + first_chart = charts[0] + assert first_chart.title == "Sine Wave" + assert isinstance(first_chart, LineChart) + assert first_chart.x_label is None + assert first_chart.y_label is None + assert len(first_chart.elements) == 1 + assert len(first_chart.elements[0].points) == 100 - second_graph = graphs[1] - assert second_graph.title == "Scatter Plot" - assert isinstance(second_graph, ScatterGraph) - assert second_graph.x_label == "X" - assert second_graph.y_label == "Y" - assert len(second_graph.elements) == 1 - assert len(second_graph.elements[0].points) == 5 + second_chart = charts[1] + assert second_chart.title == "Scatter Plot" + assert isinstance(second_chart, ScatterChart) + assert second_chart.x_label == "X" + assert second_chart.y_label == "Y" + assert len(second_chart.elements) == 1 + assert len(second_chart.elements[0].points) == 5 diff --git a/chart_data_extractor/tests/graphs/test_unknown.py b/chart_data_extractor/tests/graphs/test_unknown.py index 52b3e6cd..848afe98 100644 --- a/chart_data_extractor/tests/graphs/test_unknown.py +++ b/chart_data_extractor/tests/graphs/test_unknown.py @@ -1,10 +1,10 @@ import matplotlib.pyplot as plt -from e2b_charts import graph_figure_to_graph -from e2b_charts.graphs import Graph, GraphType +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import Chart, ChartType -def _prep_graph_figure(): +def _prep_chart_figure(): # Create a figure and an axis fig, ax = plt.subplots() @@ -25,13 +25,13 @@ def _prep_graph_figure(): return plt.gcf() -def test_unknown_graphs(): - figure = _prep_graph_figure() - graph = graph_figure_to_graph(figure) - assert graph +def test_unknown_charts(): + figure = _prep_chart_figure() + chart = chart_figure_to_chart(figure) + assert chart - assert isinstance(graph, Graph) - assert graph.type == GraphType.UNKNOWN - assert graph.title == "Two Concentric Circles" + assert isinstance(chart, Chart) + assert chart.type == ChartType.UNKNOWN + assert chart.title == "Two Concentric Circles" - assert len(graph.elements) == 0 + assert len(chart.elements) == 0 diff --git a/chart_data_extractor/tests/utils/test_detect_scale.py b/chart_data_extractor/tests/utils/test_detect_scale.py index 41314b71..62eaaa64 100644 --- a/chart_data_extractor/tests/utils/test_detect_scale.py +++ b/chart_data_extractor/tests/utils/test_detect_scale.py @@ -2,23 +2,23 @@ from matplotlib.dates import _SwitchableDateConverter -from e2b_charts.graphs.planar import PointGraph +from e2b_charts.charts.planar import PointChart def test_detect_scale(): datetime_converter = _SwitchableDateConverter() - scale = PointGraph._detect_scale( + scale = PointChart._detect_scale( datetime_converter, "linear", 3 * [datetime.date.today()], ["1", "2", "3"] ) assert scale == "datetime" - scale = PointGraph._detect_scale(None, "linear", [1, 2, 3], ["1", "2", "3"]) + scale = PointChart._detect_scale(None, "linear", [1, 2, 3], ["1", "2", "3"]) assert scale == "linear" - scale = PointGraph._detect_scale( + scale = PointChart._detect_scale( None, "linear", [0, 1, 2], ["First", "Second", "Third"] ) assert scale == "categorical" - scale = PointGraph._detect_scale(None, "log", [1, 10, 100], ["1", "10", "100"]) + scale = PointChart._detect_scale(None, "log", [1, 10, 100], ["1", "10", "100"]) assert scale == "log" From 664f3f52907216d492c5a4dbaf79098082d60029 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 15:14:44 -0700 Subject: [PATCH 429/722] Improve tests --- Makefile | 2 +- template/test.Dockerfile | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 251a98db..db252514 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ start-template-server: - docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build -q ./template -f ./template/test.Dockerfile) + docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build . -q -f ./template/test.Dockerfile) kill-template-server: docker kill $(shell docker ps --filter expose=49999 --format {{.ID}}) diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 97b7113d..195f3ab9 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -15,7 +15,7 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ SERVER_PATH="/root/.server" # Install Jupyter -COPY ./requirements.txt requirements.txt +COPY ./template/requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # Javascript Kernel @@ -28,22 +28,24 @@ RUN python -m venv $SERVER_PATH/.venv # Copy server and its requirements RUN mkdir -p $SERVER_PATH/ -COPY ./server/requirements.txt $SERVER_PATH +COPY ./template/server/requirements.txt $SERVER_PATH RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt -COPY ./server $SERVER_PATH +COPY ./template/server $SERVER_PATH # Copy Jupyter configuration -COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ +COPY ./template/start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh -COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ +COPY ./template/jupyter_server_config.py $JUPYTER_CONFIG_PATH/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default -COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ +COPY ./template/ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup -COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup +COPY ./template/startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup # Setup entrypoint for local development WORKDIR /home/user +COPY ./chart_data_extractor ./chart_data_extractor +RUN pip install -e ./chart_data_extractor ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh From 2f88ab4cca12f78c8124cce71b9fe8015c201b73 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 15:14:54 -0700 Subject: [PATCH 430/722] Fix wrong import --- template/startup_scripts/0002_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 6308cf79..d46aeaee 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -4,7 +4,7 @@ from IPython.core.formatters import BaseFormatter from traitlets.traitlets import Unicode, ObjectName -from e2b_charts import graph_figure_to_graph +from e2b_charts import chart_figure_to_dict def _figure_repr_e2b_chart_(self: Figure): @@ -13,7 +13,7 @@ def _figure_repr_e2b_chart_(self: Figure): """ # Get all Axes objects from the Figure try: - return graph_figure_to_graph(self) + return chart_figure_to_dict(self) except: return {} From effbd82a01b760dbdcda0d1495b616a52993d550 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 15:15:05 -0700 Subject: [PATCH 431/722] Update e2b.toml --- template/e2b.toml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/template/e2b.toml b/template/e2b.toml index 745d570e..a488e5d9 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -1,13 +1,14 @@ # This is a config for E2B sandbox template. -# You can use 'template_id' (nlhz8vlwyupq845jsdg9) or 'template_name (code-interpreter-v1) from this config to spawn a sandbox: +# You can use template ID (nlhz8vlwyupq845jsdg9) or template name (code-interpreter-v1) to create a sandbox: # Python SDK -# from e2b import Sandbox -# sandbox = Sandbox(template='code-interpreter-v1') +# from e2b import Sandbox, AsyncSandbox +# sandbox = Sandbox("code-interpreter-v1") # Sync sandbox +# sandbox = await AsyncSandbox.create("code-interpreter-v1") # Async sandbox # JS SDK # import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create({ template: 'code-interpreter-v1' }) +# const sandbox = await Sandbox.create('code-interpreter-v1') team_id = "460355b3-4f64-48f9-9a16-4442817f79f5" memory_mb = 1_024 From d235edcfa8b1e3c62fcf70d6e6807c82cd5655aa Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 16:04:51 -0700 Subject: [PATCH 432/722] Bump e2b charts version and make sure the latest version is installed --- .github/workflows/release.yml | 15 ++++++++++++++- chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c2e4d7a0..4ce8ff5e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -100,6 +100,8 @@ jobs: needs: [charts-tests] if: needs.changes.outputs.charts == 'true' runs-on: ubuntu-latest + outputs: + version: ${{ steps.output_version.outputs.version }} steps: - name: Checkout Repo uses: actions/checkout@v3 @@ -146,12 +148,20 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PYPI_TOKEN: ${{ secrets.CHARTS_PYPI_TOKEN }} + - name: Output new version + id: output_version + working-directory: ./chart_data_extractor + run: | + echo "::set-output name=version::$(pnpm pkg get version --workspaces=false | tr -d \\\")" build-docker-image: name: Build Docker Image runs-on: ubuntu-latest needs: [changes, charts-release] - if: needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') steps: - name: Checkout repository uses: actions/checkout@v3 @@ -170,6 +180,9 @@ jobs: - name: Build and push to DockerHub working-directory: ./template run: | + CHARTS_VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) + VERSION=${{ needs.charts-release.outputs.version || CHARTS_VERSION }} + sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" Dockerfile docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true docker buildx build \ --file Dockerfile \ diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 19e836ce..7665dee7 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.0", + "version": "0.0.1", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 60981062..1ee9e334 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.0" +version = "0.0.1" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "Apache-2.0" From 24954ff98f177ea04e4cbb644aece1dfaf5aff83 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 16:06:38 -0700 Subject: [PATCH 433/722] Use if statement --- .github/workflows/release.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4ce8ff5e..96297393 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -180,8 +180,12 @@ jobs: - name: Build and push to DockerHub working-directory: ./template run: | - CHARTS_VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) - VERSION=${{ needs.charts-release.outputs.version || CHARTS_VERSION }} + if [ -z "${{ needs.charts-release.outputs.version }}" ]; then + VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) + else + VERSION=${{ needs.charts-release.outputs.version }} + fi + sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" Dockerfile docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true docker buildx build \ From 262b61593bfc719f2141f14817934f709c13c000 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 16:11:24 -0700 Subject: [PATCH 434/722] Replace the version in requirements.txt --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 96297393..cf18e2a7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: VERSION=${{ needs.charts-release.outputs.version }} fi - sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" Dockerfile + sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true docker buildx build \ --file Dockerfile \ From c0aa8ab245ea4c96dffd301c42ebd40ce16747f1 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 24 Oct 2024 16:29:32 -0700 Subject: [PATCH 435/722] Don't skip release if charts released --- .github/workflows/release.yml | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cf18e2a7..fa66afd0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,7 +177,7 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push to DockerHub + - name: Set package version working-directory: ./template run: | if [ -z "${{ needs.charts-release.outputs.version }}" ]; then @@ -187,12 +187,24 @@ jobs: fi sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest || true - docker buildx build \ - --file Dockerfile \ - --platform linux/amd64 \ - --push \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest . + + - name: Cache Docker layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Build Docker image + uses: docker/build-push-action@v6 + with: + context: ./template + push: true + platforms: linux/amd64 + tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max build-template: name: Build E2B template @@ -238,7 +250,7 @@ jobs: if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && - (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true') + (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true' || needs.changes.outputs.charts == 'true') name: Release runs-on: ubuntu-latest steps: From 51adafc838d37936826abccfe7bdeff223fd3a20 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 24 Oct 2024 23:51:18 +0000 Subject: [PATCH 436/722] [skip ci] Release new versions --- .changeset/mighty-carrots-heal.md | 5 ----- chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- pnpm-lock.yaml | 2 ++ 4 files changed, 4 insertions(+), 7 deletions(-) delete mode 100644 .changeset/mighty-carrots-heal.md diff --git a/.changeset/mighty-carrots-heal.md b/.changeset/mighty-carrots-heal.md deleted file mode 100644 index 66eb92de..00000000 --- a/.changeset/mighty-carrots-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/data-extractor': patch ---- - -Initial release diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 7665dee7..62bf9e57 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.1", + "version": "0.0.2", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 1ee9e334..1b2e3042 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.1" +version = "0.0.2" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "Apache-2.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b62a795..11ff886e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,8 @@ importers: specifier: ^0.2.6 version: 0.2.6 + chart_data_extractor: {} + js: dependencies: e2b: From e46e092f9f05f08c68269276bd5428d0f71142d6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:02:48 -0700 Subject: [PATCH 437/722] Return images --- js/tests/images/bar.test.ts | 55 +++++++++++++++++++++++++ python/tests/images/test_images.py | 51 +++++++++++++++++++++++ template/startup_scripts/0003_images.py | 43 +++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 js/tests/images/bar.test.ts create mode 100644 python/tests/images/test_images.py create mode 100644 template/startup_scripts/0003_images.py diff --git a/js/tests/images/bar.test.ts b/js/tests/images/bar.test.ts new file mode 100644 index 00000000..34741550 --- /dev/null +++ b/js/tests/images/bar.test.ts @@ -0,0 +1,55 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. +sandboxTest('test show image', async ({ sandbox }) => { + const code = ` + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image.show() + ` + + const execution = await sandbox.runCode(code) + + const image = execution.results[0].png + expect(image).toBeDefined() +}) + +sandboxTest('test image represent', async ({ sandbox }) => { + const code = ` + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image + ` + const execution = await sandbox.runCode(code) + + const image = execution.results[0].png + expect(image).toBeDefined() +}) + + + sandboxTest('get image on save', async ({ sandbox }) => { + const code = ` + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image.save("test.png") + ` + + const execution = await sandbox.runCode(code) + + const image = execution.results[0].png + expect(image).toBeDefined() + }) diff --git a/python/tests/images/test_images.py b/python/tests/images/test_images.py new file mode 100644 index 00000000..d91fbe59 --- /dev/null +++ b/python/tests/images/test_images.py @@ -0,0 +1,51 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def test_show_image(async_sandbox: AsyncSandbox): + code = """ + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image.show() + """ + + execution = await async_sandbox.run_code(code) + + image = execution.results[0].png + assert image + + +async def test_image_as_last_command(async_sandbox: AsyncSandbox): + code = """ + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image + """ + execution = await async_sandbox.run_code(code) + + image = execution.results[0].png + assert image + + +async def test_get_image_on_save(async_sandbox: AsyncSandbox): + code = """ + import numpy + from PIL import Image + + imarray = numpy.random.rand(16,16,3) * 255 + im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + + image.save("test.png") + """ + + execution = await async_sandbox.run_code(code) + + image = execution.results[0].png + assert image diff --git a/template/startup_scripts/0003_images.py b/template/startup_scripts/0003_images.py new file mode 100644 index 00000000..23124b3e --- /dev/null +++ b/template/startup_scripts/0003_images.py @@ -0,0 +1,43 @@ +from typing import Any, io + +from IPython.core.display_functions import display +from PIL import ImageShow +from PIL.Image import Image + +original_show = ImageShow.show + + +def show_file(self, path: str, **options: Any) -> int: + # To prevent errors from trying to display image without any display + return 0 + + +ImageShow.show_file = show_file + +original_save = Image.save + + +# To prevent circular save and display calls +def __repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: + """Helper function for iPython display hook. + + :param image_format: Image format. + :returns: image as bytes, saved into the given format. + """ + b = io.BytesIO() + try: + original_save(self, b, image_format, **kwargs) + except Exception: + return None + return b.getvalue() + + +Image._repr_image = __repr_image + + +def save(image, fp, format=None, **options): + display(image) + original_save(image, fp, format, **options) + + +Image.save = save From 173bf9142d1f21d3ad020148dacb8ed5f5883bbe Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:24:07 -0700 Subject: [PATCH 438/722] Allow for deploying --- .github/workflows/release.yml | 7 +++++-- pnpm-workspace.yaml | 1 + template/package.json | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 template/package.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fa66afd0..c6602f33 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -210,7 +210,10 @@ jobs: name: Build E2B template runs-on: ubuntu-latest needs: [build-docker-image] - if: needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' steps: - name: Checkout repository uses: actions/checkout@v3 @@ -250,7 +253,7 @@ jobs: if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && - (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true' || needs.changes.outputs.charts == 'true') + (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true' || needs.changes.outputs.charts == 'true' || needs.changes.outputs.template == 'true') name: Release runs-on: ubuntu-latest steps: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 16b006b4..57e95728 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ packages: - js - python - chart_data_extractor + - template diff --git a/template/package.json b/template/package.json new file mode 100644 index 00000000..1e1ca9d8 --- /dev/null +++ b/template/package.json @@ -0,0 +1,5 @@ +{ + "name": "@e2b/code-interpreter-template", + "private": true, + "version": "0.0.0" +} From 3a20da1d53da5e3535b0f19a670064482132de7c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:24:58 -0700 Subject: [PATCH 439/722] Add changeset --- .changeset/poor-ghosts-cross.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/poor-ghosts-cross.md diff --git a/.changeset/poor-ghosts-cross.md b/.changeset/poor-ghosts-cross.md new file mode 100644 index 00000000..e4dccae4 --- /dev/null +++ b/.changeset/poor-ghosts-cross.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add possibility to deploy only template changes From 7bc236efa52465a450e84b9ebe6a34ed824c9a53 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:41:40 -0700 Subject: [PATCH 440/722] Rename tests --- python/tests/{graphs => charts}/test_bar.py | 0 python/tests/{graphs => charts}/test_box_and_whiskers.py | 0 python/tests/{graphs => charts}/test_line.py | 0 .../tests/{graphs/test_log_graph.py => charts/test_log_chart.py} | 0 python/tests/{graphs => charts}/test_pie.py | 0 python/tests/{graphs => charts}/test_scale.py | 0 python/tests/{graphs => charts}/test_scatter.py | 0 .../{graphs/test_supergraph.py => charts/test_superchart.py} | 0 python/tests/{graphs => charts}/test_unknown.py | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename python/tests/{graphs => charts}/test_bar.py (100%) rename python/tests/{graphs => charts}/test_box_and_whiskers.py (100%) rename python/tests/{graphs => charts}/test_line.py (100%) rename python/tests/{graphs/test_log_graph.py => charts/test_log_chart.py} (100%) rename python/tests/{graphs => charts}/test_pie.py (100%) rename python/tests/{graphs => charts}/test_scale.py (100%) rename python/tests/{graphs => charts}/test_scatter.py (100%) rename python/tests/{graphs/test_supergraph.py => charts/test_superchart.py} (100%) rename python/tests/{graphs => charts}/test_unknown.py (100%) diff --git a/python/tests/graphs/test_bar.py b/python/tests/charts/test_bar.py similarity index 100% rename from python/tests/graphs/test_bar.py rename to python/tests/charts/test_bar.py diff --git a/python/tests/graphs/test_box_and_whiskers.py b/python/tests/charts/test_box_and_whiskers.py similarity index 100% rename from python/tests/graphs/test_box_and_whiskers.py rename to python/tests/charts/test_box_and_whiskers.py diff --git a/python/tests/graphs/test_line.py b/python/tests/charts/test_line.py similarity index 100% rename from python/tests/graphs/test_line.py rename to python/tests/charts/test_line.py diff --git a/python/tests/graphs/test_log_graph.py b/python/tests/charts/test_log_chart.py similarity index 100% rename from python/tests/graphs/test_log_graph.py rename to python/tests/charts/test_log_chart.py diff --git a/python/tests/graphs/test_pie.py b/python/tests/charts/test_pie.py similarity index 100% rename from python/tests/graphs/test_pie.py rename to python/tests/charts/test_pie.py diff --git a/python/tests/graphs/test_scale.py b/python/tests/charts/test_scale.py similarity index 100% rename from python/tests/graphs/test_scale.py rename to python/tests/charts/test_scale.py diff --git a/python/tests/graphs/test_scatter.py b/python/tests/charts/test_scatter.py similarity index 100% rename from python/tests/graphs/test_scatter.py rename to python/tests/charts/test_scatter.py diff --git a/python/tests/graphs/test_supergraph.py b/python/tests/charts/test_superchart.py similarity index 100% rename from python/tests/graphs/test_supergraph.py rename to python/tests/charts/test_superchart.py diff --git a/python/tests/graphs/test_unknown.py b/python/tests/charts/test_unknown.py similarity index 100% rename from python/tests/graphs/test_unknown.py rename to python/tests/charts/test_unknown.py From 1acb39079de4553db7b83f809841732847e142fa Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:41:51 -0700 Subject: [PATCH 441/722] Print version --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6602f33..bb8c00bb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -185,6 +185,7 @@ jobs: else VERSION=${{ needs.charts-release.outputs.version }} fi + echo "Version: $VERSION" sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt From 79c832742aac2a940ee7fed5ad16c3bc3769fe91 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 11:55:49 -0700 Subject: [PATCH 442/722] Remove cache --- .github/workflows/release.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bb8c00bb..31eb530b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -189,14 +189,6 @@ jobs: sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - - name: Cache Docker layers - uses: actions/cache@v3 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - name: Build Docker image uses: docker/build-push-action@v6 with: @@ -204,8 +196,6 @@ jobs: push: true platforms: linux/amd64 tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache,mode=max build-template: name: Build E2B template From 022d7b6fddb9fe64d9186918fe6b4d022025bf5b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 13:48:43 -0700 Subject: [PATCH 443/722] Fix dates in DataFrame --- template/requirements.txt | 7 +++++-- template/startup_scripts/0002_data.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/template/requirements.txt b/template/requirements.txt index 502e79c6..aa4419c1 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,6 +3,11 @@ jupyter-server==2.13.0 ipykernel==6.29.3 ipython==8.22.2 +orjson==3.6.3 +pandas==1.5.3 +matplotlib==3.9.2 +pillow==9.5.0 + # Latest version for e2b_charts @@ -14,12 +19,10 @@ gensim==4.3.2 imageio==2.34.0 joblib==1.3.2 librosa==0.10.1 -matplotlib==3.9.2 nltk==3.8.1 numpy==1.26.4 opencv-python==4.9.0.80 openpyxl==3.1.2 -pandas==1.5.3 plotly==5.19.0 pytest==8.1.0 python-docx==1.1.0 diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index d46aeaee..68e29400 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -5,6 +5,7 @@ from traitlets.traitlets import Unicode, ObjectName from e2b_charts import chart_figure_to_dict +import orjson def _figure_repr_e2b_chart_(self: Figure): @@ -19,7 +20,7 @@ def _figure_repr_e2b_chart_(self: Figure): def _dataframe_repr_e2b_data_(self: pandas.DataFrame): - return self.to_dict(orient="list") + return orjson.loads(orjson.dumps(self.to_dict(orient="list"))) class E2BDataFormatter(BaseFormatter): From 46f1b36b38fb4ee589cefec790ef53f509e0c5b6 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 13:52:06 -0700 Subject: [PATCH 444/722] Fix image generation --- js/tests/images/bar.test.ts | 7 +++--- python/tests/images/test_images.py | 8 ++++--- template/startup_scripts/0003_images.py | 32 ++++++++++--------------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/js/tests/images/bar.test.ts b/js/tests/images/bar.test.ts index 34741550..d8903b75 100644 --- a/js/tests/images/bar.test.ts +++ b/js/tests/images/bar.test.ts @@ -9,9 +9,10 @@ sandboxTest('test show image', async ({ sandbox }) => { from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image.show() + print("done") ` const execution = await sandbox.runCode(code) @@ -26,7 +27,7 @@ sandboxTest('test image represent', async ({ sandbox }) => { from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image ` @@ -43,7 +44,7 @@ sandboxTest('test image represent', async ({ sandbox }) => { from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image.save("test.png") ` diff --git a/python/tests/images/test_images.py b/python/tests/images/test_images.py index d91fbe59..46c45f5e 100644 --- a/python/tests/images/test_images.py +++ b/python/tests/images/test_images.py @@ -7,9 +7,10 @@ async def test_show_image(async_sandbox: AsyncSandbox): from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image.show() + print("Image shown.") """ execution = await async_sandbox.run_code(code) @@ -24,7 +25,7 @@ async def test_image_as_last_command(async_sandbox: AsyncSandbox): from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image """ @@ -40,9 +41,10 @@ async def test_get_image_on_save(async_sandbox: AsyncSandbox): from PIL import Image imarray = numpy.random.rand(16,16,3) * 255 - im = Image.fromarray(imarray.astype('uint8')).convert('RGBA') + image = Image.fromarray(imarray.astype('uint8')).convert('RGBA') image.save("test.png") + print("Image saved.") """ execution = await async_sandbox.run_code(code) diff --git a/template/startup_scripts/0003_images.py b/template/startup_scripts/0003_images.py index 23124b3e..25ab9762 100644 --- a/template/startup_scripts/0003_images.py +++ b/template/startup_scripts/0003_images.py @@ -1,10 +1,8 @@ -from typing import Any, io +from typing import Any from IPython.core.display_functions import display -from PIL import ImageShow from PIL.Image import Image - -original_show = ImageShow.show +from PIL.ImageShow import UnixViewer def show_file(self, path: str, **options: Any) -> int: @@ -12,31 +10,25 @@ def show_file(self, path: str, **options: Any) -> int: return 0 -ImageShow.show_file = show_file +UnixViewer.show_file = show_file -original_save = Image.save +original_show = UnixViewer.show -# To prevent circular save and display calls -def __repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: - """Helper function for iPython display hook. +def show(self, image, **options): + display(image) + original_show(self, image, **options) - :param image_format: Image format. - :returns: image as bytes, saved into the given format. - """ - b = io.BytesIO() - try: - original_save(self, b, image_format, **kwargs) - except Exception: - return None - return b.getvalue() +UnixViewer.show = show -Image._repr_image = __repr_image +original_save = Image.save def save(image, fp, format=None, **options): - display(image) + if isinstance(fp, str): + display(image) + original_save(image, fp, format, **options) From db99426fadc9075c0223e729495fa2d3af6e146a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Oct 2024 21:11:31 +0000 Subject: [PATCH 445/722] [skip ci] Release new versions --- .changeset/poor-ghosts-cross.md | 5 ----- pnpm-lock.yaml | 2 ++ template/package.json | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 .changeset/poor-ghosts-cross.md diff --git a/.changeset/poor-ghosts-cross.md b/.changeset/poor-ghosts-cross.md deleted file mode 100644 index e4dccae4..00000000 --- a/.changeset/poor-ghosts-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add possibility to deploy only template changes diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11ff886e..c7f07d83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,8 @@ importers: python: {} + template: {} + packages: '@ampproject/remapping@2.3.0': diff --git a/template/package.json b/template/package.json index 1e1ca9d8..c8f29113 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.0" + "version": "0.0.1" } From 5ba0cc669862e8160d455de9d6dcab4c63f43b05 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Mon, 28 Oct 2024 14:14:33 -0700 Subject: [PATCH 446/722] Fix sandbox killing in all tests --- js/tests/envVars.test.ts | 56 +++++++++++++---------- js/tests/runtimes/bun/run.test.ts | 1 + js/tests/runtimes/deno/run.test.ts | 1 + python/tests/async/test_async_env_vars.py | 46 ++++++++++--------- 4 files changed, 60 insertions(+), 44 deletions(-) diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts index ad7d8fa2..a4d7f3ca 100644 --- a/js/tests/envVars.test.ts +++ b/js/tests/envVars.test.ts @@ -8,11 +8,16 @@ sandboxTest.skipIf(isDebug)('env vars', async () => { const sandbox = await Sandbox.create({ envs: { TEST_ENV_VAR: 'supertest' }, }) - const result = await sandbox.runCode( - `import os; x = os.getenv('TEST_ENV_VAR'); x` - ) - expect(result.results[0].text.trim()).toEqual('supertest') + try { + const result = await sandbox.runCode( + `import os; x = os.getenv('TEST_ENV_VAR'); x` + ) + + expect(result.results[0].text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } }) sandboxTest('env vars on sandbox', async ({ sandbox }) => { @@ -28,28 +33,33 @@ sandboxTest('env vars on sandbox override', async () => { const sandbox = await Sandbox.create({ envs: { FOO: 'bar', SBX: 'value' }, }) - await sandbox.runCode( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'js_runtime'" - ) - const result = await sandbox.runCode( - "import os; os.getenv('FOO')", - { envs: { FOO: 'baz' } } - ) - expect(result.results[0].text.trim()).toEqual('baz') + try { + await sandbox.runCode( + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'js_runtime'" + ) + const result = await sandbox.runCode( + "import os; os.getenv('FOO')", + { envs: { FOO: 'baz' } } + ) - const result2 = await sandbox.runCode( - "import os; os.getenv('RUNTIME_ENV')" - ) - expect(result2.results[0].text.trim()).toEqual('js_runtime') + expect(result.results[0].text.trim()).toEqual('baz') - if (!isDebug) { - const result3 = await sandbox.runCode( - "import os; os.getenv('SBX')" + const result2 = await sandbox.runCode( + "import os; os.getenv('RUNTIME_ENV')" ) - expect(result3.results[0].text.trim()).toEqual('value') - } + expect(result2.results[0].text.trim()).toEqual('js_runtime') + + if (!isDebug) { + const result3 = await sandbox.runCode( + "import os; os.getenv('SBX')" + ) + expect(result3.results[0].text.trim()).toEqual('value') + } - const result4 = await sandbox.runCode("import os; os.getenv('FOO')") - expect(result4.results[0].text.trim()).toEqual('bar') + const result4 = await sandbox.runCode("import os; os.getenv('FOO')") + expect(result4.results[0].text.trim()).toEqual('bar') + } finally { + await sandbox.kill() + } }) diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts index 6121b4a6..9138e022 100644 --- a/js/tests/runtimes/bun/run.test.ts +++ b/js/tests/runtimes/bun/run.test.ts @@ -4,6 +4,7 @@ import { Sandbox } from '../../../src' test('Bun test', async () => { const sbx = await Sandbox.create({ timeoutMs: 5_000 }) + try { const result = await sbx.runCode('print("Hello, World!")') expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') diff --git a/js/tests/runtimes/deno/run.test.ts b/js/tests/runtimes/deno/run.test.ts index 34343294..c84d0fa8 100644 --- a/js/tests/runtimes/deno/run.test.ts +++ b/js/tests/runtimes/deno/run.test.ts @@ -7,6 +7,7 @@ import { Sandbox } from '../../../dist/index.mjs' Deno.test('Deno test', async () => { const sbx = await Sandbox.create({ timeoutMs: 5_000 }) + try { const result = await sbx.runCode('print("Hello, World!")') assertEquals(result.logs.stdout.join(''), 'Hello, World!\n') diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index f587dcb6..84508bc9 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -6,9 +6,11 @@ @pytest.mark.skip_debug() async def test_env_vars_sandbox(): sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) - result = await sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - await sbx.kill() + try: + result = await sbx.run_code("import os; os.getenv('FOO')") + assert result.text == "bar" + finally: + await sbx.kill() async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): @@ -20,22 +22,24 @@ async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): async def test_env_vars_override(debug: bool): sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) - await sbx.run_code( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" - ) - result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) - assert result.text == "baz" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") - assert result.text == "async_python_runtime" - - if not debug: - result = await sbx.run_code("import os; os.getenv('SBX')") - assert result.text == "value" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - await sbx.kill() + try: + await sbx.run_code( + "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" + ) + result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) + assert result.text == "baz" + + # This can fail if running in debug mode (there's a race condition with the restart kernel test) + result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") + assert result.text == "async_python_runtime" + + if not debug: + result = await sbx.run_code("import os; os.getenv('SBX')") + assert result.text == "value" + + # This can fail if running in debug mode (there's a race condition with the restart kernel test) + result = await sbx.run_code("import os; os.getenv('FOO')") + assert result.text == "bar" + finally: + await sbx.kill() From 55efe54b6590d091c6da41fb056dbc2c027d60a2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 15:28:00 -0700 Subject: [PATCH 447/722] Prevent multiple image renders --- template/startup_scripts/0003_images.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/template/startup_scripts/0003_images.py b/template/startup_scripts/0003_images.py index 25ab9762..4732d77d 100644 --- a/template/startup_scripts/0003_images.py +++ b/template/startup_scripts/0003_images.py @@ -11,17 +11,6 @@ def show_file(self, path: str, **options: Any) -> int: UnixViewer.show_file = show_file - -original_show = UnixViewer.show - - -def show(self, image, **options): - display(image) - original_show(self, image, **options) - - -UnixViewer.show = show - original_save = Image.save From 142aef34a100f51cfe6e9a1eac250b39d633ca7c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 15:28:35 -0700 Subject: [PATCH 448/722] Add changeset --- .changeset/rotten-parrots-whisper.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rotten-parrots-whisper.md diff --git a/.changeset/rotten-parrots-whisper.md b/.changeset/rotten-parrots-whisper.md new file mode 100644 index 00000000..7ebd7566 --- /dev/null +++ b/.changeset/rotten-parrots-whisper.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Prevent multiple image renders From 3e1207306893b911ec9e14daee45abcd6ddec813 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Oct 2024 22:42:36 +0000 Subject: [PATCH 449/722] [skip ci] Release new versions --- .changeset/rotten-parrots-whisper.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/rotten-parrots-whisper.md diff --git a/.changeset/rotten-parrots-whisper.md b/.changeset/rotten-parrots-whisper.md deleted file mode 100644 index 7ebd7566..00000000 --- a/.changeset/rotten-parrots-whisper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Prevent multiple image renders diff --git a/template/package.json b/template/package.json index c8f29113..9223f59a 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.1" + "version": "0.0.2" } From 4e9de803f7279eb78f5287b1d0e4bb7fd531ab13 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Mon, 28 Oct 2024 16:50:11 -0700 Subject: [PATCH 450/722] Log to stdout --- template/server/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/template/server/main.py b/template/server/main.py index 96e0b856..bd27bfba 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,4 +1,5 @@ import logging +import sys import uuid import httpx @@ -17,7 +18,7 @@ from stream import StreamingListJsonResponse -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) logger = logging.Logger(__name__) http_logger = logging.getLogger("httpcore.http11") http_logger.setLevel(logging.WARNING) From d3cab538cfd1d887686b6d1f790527eaeccde980 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 16:34:46 -0700 Subject: [PATCH 451/722] Save default websocket for the language --- template/server/api/models/context.py | 3 +++ template/server/main.py | 27 ++++++++++++++---------- template/server/utils/locks.py | 30 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 template/server/utils/locks.py diff --git a/template/server/api/models/context.py b/template/server/api/models/context.py index e02484d5..5efb850e 100644 --- a/template/server/api/models/context.py +++ b/template/server/api/models/context.py @@ -6,3 +6,6 @@ class Context(BaseModel): id: StrictStr = Field(description="Context ID") language: StrictStr = Field(description="Language of the context") cwd: StrictStr = Field(description="Current working directory of the context") + + def __hash__(self): + return hash(self.id) diff --git a/template/server/main.py b/template/server/main.py index bd27bfba..ba35abfa 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -3,7 +3,7 @@ import uuid import httpx -from typing import Dict, Union, Literal, List +from typing import Dict, Union, Literal, Set from contextlib import asynccontextmanager from fastapi import FastAPI @@ -16,7 +16,7 @@ from contexts import create_context, normalize_language from messaging import ContextWebSocket from stream import StreamingListJsonResponse - +from utils.locks import LockedMap logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) logger = logging.Logger(__name__) @@ -25,7 +25,7 @@ websockets: Dict[Union[str, Literal["default"]], ContextWebSocket] = {} -default_websockets: Dict[str, str] = {} +default_websockets = LockedMap() global client @@ -84,11 +84,16 @@ async def post_execute(request: ExecutionRequest): context_id = None if request.language: language = normalize_language(request.language) - context_id = default_websockets.get(language) - if not context_id: - context = await create_context(client, websockets, language, "/home/user") - context_id = context.id + async with await default_websockets.get_lock(language): + context_id = default_websockets.get(language) + + if not context_id: + context = await create_context( + client, websockets, language, "/home/user" + ) + context_id = context.id + default_websockets[language] = context_id elif request.context_id: context_id = request.context_id @@ -120,19 +125,19 @@ async def post_contexts(request: CreateContext) -> Context: @app.get("/contexts") -async def get_contexts() -> List[Context]: +async def get_contexts() -> Set[Context]: logger.info(f"Listing contexts") - context_ids = list(websockets.keys()) + context_ids = websockets.keys() - return [ + return set( Context( id=websockets[context_id].context_id, language=websockets[context_id].language, cwd=websockets[context_id].cwd, ) for context_id in context_ids - ] + ) @app.post("/contexts/{context_id}/restart") diff --git a/template/server/utils/locks.py b/template/server/utils/locks.py new file mode 100644 index 00000000..28d7ec48 --- /dev/null +++ b/template/server/utils/locks.py @@ -0,0 +1,30 @@ +import asyncio + + +class LockedMap: + def __init__(self): + self.map_lock = asyncio.Lock() + self.map = {} + self.locks = {} + + def get(self, key): + return self.map.get(key) + + def set(self, key, value): + self.map[key] = value + + async def get_lock(self, key): + await self.map_lock.acquire() + if key not in self.locks: + self.locks[key] = asyncio.Lock() + + lock = self.locks[key] + print(f"Lock acquired for {key}") + self.map_lock.release() + return lock + + def __getitem__(self, key): + return self.get(key) + + def __setitem__(self, key, value): + self.set(key, value) From b749738e20c88b6d380547e2d482cf7e6ca5b8de Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 16:38:47 -0700 Subject: [PATCH 452/722] Simplify locked map --- template/server/utils/locks.py | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/template/server/utils/locks.py b/template/server/utils/locks.py index 28d7ec48..f4a5c6ea 100644 --- a/template/server/utils/locks.py +++ b/template/server/utils/locks.py @@ -1,30 +1,18 @@ import asyncio -class LockedMap: +class LockedMap(dict): def __init__(self): - self.map_lock = asyncio.Lock() - self.map = {} - self.locks = {} - - def get(self, key): - return self.map.get(key) - - def set(self, key, value): - self.map[key] = value + super().__init__() + self._map_lock = asyncio.Lock() + self._locks = {} async def get_lock(self, key): - await self.map_lock.acquire() - if key not in self.locks: - self.locks[key] = asyncio.Lock() + await self._map_lock.acquire() + if key not in self._locks: + self._locks[key] = asyncio.Lock() - lock = self.locks[key] + lock = self._locks[key] print(f"Lock acquired for {key}") - self.map_lock.release() + self._map_lock.release() return lock - - def __getitem__(self, key): - return self.get(key) - - def __setitem__(self, key, value): - self.set(key, value) From 6c02465ddbd4fdb95606a2b46c0e76e93dec54b4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 16:40:02 -0700 Subject: [PATCH 453/722] Add changeset --- .changeset/friendly-brooms-cry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/friendly-brooms-cry.md diff --git a/.changeset/friendly-brooms-cry.md b/.changeset/friendly-brooms-cry.md new file mode 100644 index 00000000..16ae891b --- /dev/null +++ b/.changeset/friendly-brooms-cry.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Reuse default template for each language From e444aa446419fa40e0b058a8fcb0d7256e78d4c7 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 16:57:31 -0700 Subject: [PATCH 454/722] Decrease python test concurrency to 1 --- .changeset/friendly-brooms-cry.md | 5 --- .github/workflows/pr.yml | 65 ------------------------------- python/pytest.ini | 2 +- 3 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 .changeset/friendly-brooms-cry.md delete mode 100644 .github/workflows/pr.yml diff --git a/.changeset/friendly-brooms-cry.md b/.changeset/friendly-brooms-cry.md deleted file mode 100644 index 16ae891b..00000000 --- a/.changeset/friendly-brooms-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Reuse default template for each language diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 40c3251b..00000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Test package - -on: - push: - branches-ignore: - - main - -jobs: - changes: - name: Repository changes - runs-on: ubuntu-latest - outputs: - python: ${{ steps.filter.outputs.python }} - js: ${{ steps.filter.outputs.js }} - charts: ${{ steps.filter.outputs.charts }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Get the last release - id: last_release - uses: cardinalby/git-get-release-action@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - latest: true - prerelease: false - draft: false - - - name: Find changes since the last release - uses: dorny/paths-filter@v2 - id: filter - with: - base: ${{ steps.last_release.outputs.tag_name }} - filters: | - python: - - 'python/**' - js: - - 'js/**' - charts: - - 'chart_data_extractor/**' - - python-tests: - needs: [ changes ] - name: Tests Python package - if: needs.changes.outputs.python == 'true' - uses: ./.github/workflows/python_tests.yml - secrets: inherit - - js-tests: - needs: [ changes ] - name: Tests JS package - if: needs.changes.outputs.js == 'true' - uses: ./.github/workflows/js_tests.yml - secrets: inherit - - charts-tests: - needs: [ changes ] - name: Tests Chart package - # If the PR does not have the label 'js-rc', the code is already tested in the prerelease workflow - if: needs.changes.outputs.charts == 'true' && !contains( github.event.pull_request.labels.*.name, 'charts-rc') - uses: ./.github/workflows/charts_tests.yml - secrets: inherit diff --git a/python/pytest.ini b/python/pytest.ini index 7695413b..e74467d5 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,4 +4,4 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addopts = "--import-mode=importlib" "--numprocesses=2" +addopts = "--import-mode=importlib" "--numprocesses=1" From 720b01e706388fbb55e1e1438598cd34e2906b6c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 15:56:42 -0700 Subject: [PATCH 455/722] Change javascript kernel to Deno --- js/tests/languages/js.test.ts | 62 +++++++++++++++++++++ python/tests/languages/test_js.py | 68 +++++++++++++++++++++++ python/tests/sync/test_default_kernels.py | 10 ++++ template/Dockerfile | 7 ++- template/deno.json | 14 +++++ template/server/api/models/result.py | 5 +- template/server/contexts.py | 7 ++- template/server/main.py | 5 +- template/server/messaging.py | 60 ++++++++++++++++---- template/test.Dockerfile | 7 ++- 10 files changed, 224 insertions(+), 21 deletions(-) create mode 100644 js/tests/languages/js.test.ts create mode 100644 python/tests/languages/test_js.py create mode 100644 template/deno.json diff --git a/js/tests/languages/js.test.ts b/js/tests/languages/js.test.ts new file mode 100644 index 00000000..914c175e --- /dev/null +++ b/js/tests/languages/js.test.ts @@ -0,0 +1,62 @@ +import { expect } from 'vitest' + +import { sandboxTest } from '../setup' + +sandboxTest('js simple', async ({ sandbox }) => { + const result = await sandbox.runCode('console.log("Hello, World!")', {language: "js"}) + + expect(result.logs.stdout.join().trim()).toEqual('Hello, World!') +}) + +sandboxTest('js import', async ({ sandbox }) => { + const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', {language: "js"}) + + expect(result.results[0].text).toEqual('true') +}) + +sandboxTest('js top level await', async ({ sandbox }) => { + const result = await sandbox.runCode(` + async function main() { + return 'Hello, World!' + } + + await main() + `, {language: "js"}) + expect(result.results[0].text).toEqual('Hello, World!') +}) + +sandboxTest('js es6', async ({ sandbox }) => { + const result = await sandbox.runCode(` +const add = (x, y) => x + y; +add(1, 2) +`, {language: "js"}) + expect(result.results[0].text).toEqual('3') +}) + + +sandboxTest('js context', async ({ sandbox }) => { + await sandbox.runCode('const z = 1', {language: "js"}) + const result = await sandbox.runCode('z', {language: "js"}) + expect(result.results[0].text).toEqual('1') +}) + +sandboxTest('js cwd', async ({ sandbox }) => { + const result = await sandbox.runCode('process.cwd()', {language: "js"}) + expect(result.results[0].text).toEqual('/home/user') + + const ctx = await sandbox.createCodeContext( {cwd: '/home', language: "js"}) + const result2 = await sandbox.runCode('process.cwd()', {context: ctx}) + expect(result2.results[0].text).toEqual('/home') +}) + +sandboxTest('ts simple', async ({ sandbox }) => { + const result = await sandbox.runCode(` +function subtract(x: number, y: number): number { + return x - y; +} + +subtract(1, 2) +`, {language: "ts"}) + + expect(result.results[0].text).toEqual('-1') +}) diff --git a/python/tests/languages/test_js.py b/python/tests/languages/test_js.py new file mode 100644 index 00000000..31f2657f --- /dev/null +++ b/python/tests/languages/test_js.py @@ -0,0 +1,68 @@ +from e2b_code_interpreter import AsyncSandbox + + +async def test_javascript(async_sandbox: AsyncSandbox): + code = """ + console.log('Hello, World!') + """ + execution = await async_sandbox.run_code(code, language="js") + assert execution.logs.stdout == ["Hello, World!\n"] + + +async def test_import(async_sandbox: AsyncSandbox): + code = """ + import isOdd from 'npm:is-odd' + isOdd(3) + """ + execution = await async_sandbox.run_code(code, language="js") + assert execution.results[0].text == "true" + + +async def test_toplevel_await(async_sandbox: AsyncSandbox): + code = """ + async function main() { + return 'Hello, World!' + } + + await main() + """ + execution = await async_sandbox.run_code(code, language="js") + assert execution.results[0].text == "Hello, World!" + + +async def test_es6(async_sandbox: AsyncSandbox): + code = """ +const add = (x, y) => x + y; +add(1, 2); + """ + execution = await async_sandbox.run_code(code, language="js") + assert execution.results[0].text == "3" + + +async def test_context(async_sandbox: AsyncSandbox): + await async_sandbox.run_code("const x = 1", language="js") + execution = await async_sandbox.run_code("x", language="js") + assert execution.results[0].text == "1" + + +async def test_cwd(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code("process.cwd()", language="js") + assert execution.results[0].text == "/home/user" + + ctx = await async_sandbox.create_code_context("/home", language="js") + execution = await async_sandbox.run_code("process.cwd()", context=ctx) + assert execution.results[0].text == "/home" + + +async def test_typescript(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code( + """ +function subtract(x: number, y: number): number { + return x - y; +} + +subtract(1, 2); +""", + language="ts", + ) + assert execution.results[0].text == "-1" diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index cb21cdc5..a743dc08 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -4,3 +4,13 @@ def test_js_kernel(sandbox: Sandbox): execution = sandbox.run_code("console.log('Hello, World!')", language="js") assert execution.logs.stdout == ["Hello, World!\n"] + + +def test_r_kernel(sandbox: Sandbox): + execution = sandbox.run_code('print("Hello, World!")', language="r") + assert execution.logs.stdout == ['[1] "Hello, World!"\n'] + + +def test_java_kernel(sandbox: Sandbox): + execution = sandbox.run_code('System.out.println("Hello, World!")', language="java") + assert execution.logs.stdout[0] == "Hello, World!" diff --git a/template/Dockerfile b/template/Dockerfile index 57171089..21083b01 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -23,9 +23,10 @@ RUN R -e "install.packages('IRkernel')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" # Javascript Kernel -RUN npm install -g node-gyp -RUN npm install -g --unsafe-perm ijavascript -RUN ijsinstall --install=global +COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno +RUN chmod +x /usr/bin/deno +RUN deno jupyter --unstable --install +COPY ./deno.json /root/.local/share/jupyter/kernels/deno/kernel.json # Bash Kernel RUN pip install bash_kernel diff --git a/template/deno.json b/template/deno.json new file mode 100644 index 00000000..3c491e44 --- /dev/null +++ b/template/deno.json @@ -0,0 +1,14 @@ +{ + "argv": [ + "/usr/bin/deno", + "jupyter", + "--kernel", + "--conn", + "{connection_file}" + ], + "display_name": "Deno", + "env": { + "NO_COLOR": "1" + }, + "language": "typescript" +} diff --git a/template/server/api/models/result.py b/template/server/api/models/result.py index e63cdd0e..90e24a9a 100644 --- a/template/server/api/models/result.py +++ b/template/server/api/models/result.py @@ -45,7 +45,10 @@ def __init__(self, is_main_result: bool, data: [str, str]): self.is_main_result = is_main_result self.text = data.pop("text/plain", None) - if self.text and self.text.startswith("'") and self.text.endswith("'"): + if self.text and ( + (self.text.startswith("'") and self.text.endswith("'")) + or (self.text.startswith('"') and self.text.endswith('"')) + ): self.text = self.text[1:-1] self.html = data.pop("text/html", None) diff --git a/template/server/contexts.py b/template/server/contexts.py index 87b8cad5..6f47ebd0 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -20,11 +20,16 @@ def normalize_language(language: Optional[str]) -> str: if language == "js": return "javascript" + if language == "ts": + return "typescript" return language async def create_context(client, websockets: dict, language: str, cwd: str) -> Context: + if language == "javascript" or language == "typescript": + language = "deno" + data = { "path": str(uuid.uuid4()), "kernel": {"name": language}, @@ -53,7 +58,7 @@ async def create_context(client, websockets: dict, language: str, cwd: str) -> C logger.info(f"Setting working directory to {cwd}") try: - await ws.change_current_directory(cwd) + await ws.change_current_directory(cwd, language) except ExecutionError as e: return PlainTextResponse( "Failed to set working directory", diff --git a/template/server/main.py b/template/server/main.py index ba35abfa..7ed36477 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -110,7 +110,10 @@ async def post_execute(request: ExecutionRequest): ) return StreamingListJsonResponse( - ws.execute(request.code, env_vars=request.env_vars) + ws.execute( + request.code, + env_vars=request.env_vars, + ) ) diff --git a/template/server/messaging.py b/template/server/messaging.py index 6d4635c8..91934459 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -1,3 +1,4 @@ +import datetime import json import logging import uuid @@ -95,14 +96,21 @@ def _get_execute_request( "session": self.session_id, "msg_type": "execute_request", "version": "5.3", + "date": datetime.datetime.now(datetime.timezone.utc).isoformat(), }, "parent_header": {}, - "metadata": {}, + "metadata": { + "trusted": True, + "deletedCells": [], + "recordTiming": False, + "cellId": str(uuid.uuid4()), + }, "content": { "code": code, "silent": background, "store_history": True, "user_expressions": {}, + "stop_on_error": True, "allow_stdin": False, }, } @@ -127,10 +135,25 @@ async def _wait_for_result(self, message_id: str): yield output.model_dump(exclude_none=True) - async def change_current_directory(self, path: Union[str, StrictStr]): + async def change_current_directory( + self, path: Union[str, StrictStr], language: str + ): message_id = str(uuid.uuid4()) self._executions[message_id] = Execution(in_background=True) - request = self._get_execute_request(message_id, f"%cd {path}", True) + if language == "python": + request = self._get_execute_request(message_id, f"%cd {path}", True) + elif language == "deno": + request = self._get_execute_request( + message_id, f"Deno.chdir('{path}')", True + ) + elif language == "r": + request = self._get_execute_request(message_id, f"setwd('{path}')", True) + elif language == "java": + request = self._get_execute_request( + message_id, f"System.setProperty('user.dir', '{path}')", True + ) + else: + return await self._ws.send(request) @@ -165,11 +188,12 @@ async def execute( indent = len(line) - len(line.lstrip()) break - code = ( - indent * " " - + f"os.environ.set_envs_for_execution({vars_to_set})\n" - + code - ) + if self.language == "python": + code = ( + indent * " " + + f"os.environ.set_envs_for_execution({vars_to_set})\n" + + code + ) logger.info(code) request = self._get_execute_request(message_id, code, False) @@ -192,7 +216,9 @@ async def _receive_message(self): async for message in self._ws: await self._process_message(json.loads(message)) except Exception as e: - logger.error(f"WebSocket received error while receiving messages: {e}") + logger.error( + f"WebSocket received error while receiving messages: {type(e)}: {str(e)}" + ) async def _process_message(self, data: dict): """ @@ -308,11 +334,21 @@ async def _process_message(self, data: dict): execution.errored = True await queue.put( Error( - name=data["content"]["ename"], - value=data["content"]["evalue"], - traceback="".join(data["content"]["traceback"]), + name=data["content"].get("ename", ""), + value=data["content"].get("evalue", ""), + traceback="".join(data["content"].get("traceback", [])), ) ) + elif data["content"]["status"] == "abort": + logger.debug(f"Execution {parent_msg_ig} was aborted") + await queue.put( + Error( + name="ExecutionAborted", + value="Execution was aborted", + traceback="", + ) + ) + await queue.put(EndOfExecution()) elif data["content"]["status"] == "ok": pass diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 195f3ab9..40d5f135 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -19,9 +19,10 @@ COPY ./template/requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # Javascript Kernel -RUN npm install -g node-gyp -RUN npm install -g --unsafe-perm ijavascript -RUN ijsinstall --install=global +COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno +RUN chmod +x /usr/bin/deno +RUN deno jupyter --unstable --install +COPY ./template/deno.json /root/.local/share/jupyter/kernels/deno/kernel.json # Create separate virtual environment for server RUN python -m venv $SERVER_PATH/.venv From 07cadb1bfbc53b823318176bcd19da4643bf1c3b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 17:34:45 -0700 Subject: [PATCH 456/722] Return js kernel --- .../languages/{js.test.ts => deno.test.ts} | 21 +++++++++---------- .../languages/{test_js.py => test_deno.py} | 18 ++++++++-------- template/Dockerfile | 5 +++++ template/server/contexts.py | 5 ----- template/test.Dockerfile | 5 +++++ 5 files changed, 29 insertions(+), 25 deletions(-) rename js/tests/languages/{js.test.ts => deno.test.ts} (81%) rename python/tests/languages/{test_js.py => test_deno.py} (76%) diff --git a/js/tests/languages/js.test.ts b/js/tests/languages/deno.test.ts similarity index 81% rename from js/tests/languages/js.test.ts rename to js/tests/languages/deno.test.ts index 914c175e..48cfecd7 100644 --- a/js/tests/languages/js.test.ts +++ b/js/tests/languages/deno.test.ts @@ -3,13 +3,13 @@ import { expect } from 'vitest' import { sandboxTest } from '../setup' sandboxTest('js simple', async ({ sandbox }) => { - const result = await sandbox.runCode('console.log("Hello, World!")', {language: "js"}) + const result = await sandbox.runCode('console.log("Hello, World!")', {language: "deno"}) expect(result.logs.stdout.join().trim()).toEqual('Hello, World!') }) sandboxTest('js import', async ({ sandbox }) => { - const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', {language: "js"}) + const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', {language: "deno"}) expect(result.results[0].text).toEqual('true') }) @@ -21,30 +21,29 @@ sandboxTest('js top level await', async ({ sandbox }) => { } await main() - `, {language: "js"}) + `, {language: "deno"}) expect(result.results[0].text).toEqual('Hello, World!') }) sandboxTest('js es6', async ({ sandbox }) => { const result = await sandbox.runCode(` -const add = (x, y) => x + y; -add(1, 2) -`, {language: "js"}) + const add = (x, y) => x + y; + add(1, 2)`, {language: "deno"}) expect(result.results[0].text).toEqual('3') }) sandboxTest('js context', async ({ sandbox }) => { - await sandbox.runCode('const z = 1', {language: "js"}) - const result = await sandbox.runCode('z', {language: "js"}) + await sandbox.runCode('const z = 1', {language: "deno"}) + const result = await sandbox.runCode('z', {language: "deno"}) expect(result.results[0].text).toEqual('1') }) sandboxTest('js cwd', async ({ sandbox }) => { - const result = await sandbox.runCode('process.cwd()', {language: "js"}) + const result = await sandbox.runCode('process.cwd()', {language: "deno}) expect(result.results[0].text).toEqual('/home/user') - const ctx = await sandbox.createCodeContext( {cwd: '/home', language: "js"}) + const ctx = await sandbox.createCodeContext( {cwd: '/home', language: "deno"}) const result2 = await sandbox.runCode('process.cwd()', {context: ctx}) expect(result2.results[0].text).toEqual('/home') }) @@ -56,7 +55,7 @@ function subtract(x: number, y: number): number { } subtract(1, 2) -`, {language: "ts"}) +`, {language: "deno"}) expect(result.results[0].text).toEqual('-1') }) diff --git a/python/tests/languages/test_js.py b/python/tests/languages/test_deno.py similarity index 76% rename from python/tests/languages/test_js.py rename to python/tests/languages/test_deno.py index 31f2657f..6f8e80e8 100644 --- a/python/tests/languages/test_js.py +++ b/python/tests/languages/test_deno.py @@ -5,7 +5,7 @@ async def test_javascript(async_sandbox: AsyncSandbox): code = """ console.log('Hello, World!') """ - execution = await async_sandbox.run_code(code, language="js") + execution = await async_sandbox.run_code(code, language="deno") assert execution.logs.stdout == ["Hello, World!\n"] @@ -14,7 +14,7 @@ async def test_import(async_sandbox: AsyncSandbox): import isOdd from 'npm:is-odd' isOdd(3) """ - execution = await async_sandbox.run_code(code, language="js") + execution = await async_sandbox.run_code(code, language="deno") assert execution.results[0].text == "true" @@ -26,7 +26,7 @@ async def test_toplevel_await(async_sandbox: AsyncSandbox): await main() """ - execution = await async_sandbox.run_code(code, language="js") + execution = await async_sandbox.run_code(code, language="deno") assert execution.results[0].text == "Hello, World!" @@ -35,21 +35,21 @@ async def test_es6(async_sandbox: AsyncSandbox): const add = (x, y) => x + y; add(1, 2); """ - execution = await async_sandbox.run_code(code, language="js") + execution = await async_sandbox.run_code(code, language="deno") assert execution.results[0].text == "3" async def test_context(async_sandbox: AsyncSandbox): - await async_sandbox.run_code("const x = 1", language="js") - execution = await async_sandbox.run_code("x", language="js") + await async_sandbox.run_code("const x = 1", language="deno") + execution = await async_sandbox.run_code("x", language="deno") assert execution.results[0].text == "1" async def test_cwd(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code("process.cwd()", language="js") + execution = await async_sandbox.run_code("process.cwd()", language="deno") assert execution.results[0].text == "/home/user" - ctx = await async_sandbox.create_code_context("/home", language="js") + ctx = await async_sandbox.create_code_context("/home", language="deno") execution = await async_sandbox.run_code("process.cwd()", context=ctx) assert execution.results[0].text == "/home" @@ -63,6 +63,6 @@ async def test_typescript(async_sandbox: AsyncSandbox): subtract(1, 2); """, - language="ts", + language="deno", ) assert execution.results[0].text == "-1" diff --git a/template/Dockerfile b/template/Dockerfile index 21083b01..5a2e1af3 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -23,6 +23,11 @@ RUN R -e "install.packages('IRkernel')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" # Javascript Kernel +RUN npm install -g node-gyp +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + +# Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno RUN deno jupyter --unstable --install diff --git a/template/server/contexts.py b/template/server/contexts.py index 6f47ebd0..9f3b3834 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -20,16 +20,11 @@ def normalize_language(language: Optional[str]) -> str: if language == "js": return "javascript" - if language == "ts": - return "typescript" return language async def create_context(client, websockets: dict, language: str, cwd: str) -> Context: - if language == "javascript" or language == "typescript": - language = "deno" - data = { "path": str(uuid.uuid4()), "kernel": {"name": language}, diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 40d5f135..6dea866f 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -19,6 +19,11 @@ COPY ./template/requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # Javascript Kernel +RUN npm install -g node-gyp +RUN npm install -g --unsafe-perm ijavascript +RUN ijsinstall --install=global + +# Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno RUN deno jupyter --unstable --install From 646ea1ed89da4a0f70feb1d9bb25e265ebad7dbe Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 17:38:37 -0700 Subject: [PATCH 457/722] Add changeset --- .changeset/lazy-impalas-accept.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/lazy-impalas-accept.md diff --git a/.changeset/lazy-impalas-accept.md b/.changeset/lazy-impalas-accept.md new file mode 100644 index 00000000..cf0eb9f0 --- /dev/null +++ b/.changeset/lazy-impalas-accept.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add [Deno kernel](https://docs.deno.com/runtime/reference/cli/jupyter/) From 7c42c4378ca755bdb09fa8f9042e10d529161885 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 17:59:10 -0700 Subject: [PATCH 458/722] Add display test --- js/tests/languages/deno.test.ts | 21 ++++++++++++++++++++- python/tests/languages/test_deno.py | 19 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/js/tests/languages/deno.test.ts b/js/tests/languages/deno.test.ts index 48cfecd7..91e4b3a2 100644 --- a/js/tests/languages/deno.test.ts +++ b/js/tests/languages/deno.test.ts @@ -40,7 +40,7 @@ sandboxTest('js context', async ({ sandbox }) => { }) sandboxTest('js cwd', async ({ sandbox }) => { - const result = await sandbox.runCode('process.cwd()', {language: "deno}) + const result = await sandbox.runCode('process.cwd()', {language: "deno"}) expect(result.results[0].text).toEqual('/home/user') const ctx = await sandbox.createCodeContext( {cwd: '/home', language: "deno"}) @@ -59,3 +59,22 @@ subtract(1, 2) expect(result.results[0].text).toEqual('-1') }) + +sandboxTest('test display', async ({ sandbox }) => { + const result = await sandbox.runCode(` + { + [Symbol.for("Jupyter.display")]() { + return { + // Plain text content + "text/plain": "Hello world!", + + // HTML output + "text/html": "

Hello world!

", + } + } +} +`, {language: "deno"}) + + expect(result.results[0].html).toBe('

Hello world!

') + expect(result.results[0].text).toBe('Hello world!') +}) diff --git a/python/tests/languages/test_deno.py b/python/tests/languages/test_deno.py index 6f8e80e8..0a0e58e7 100644 --- a/python/tests/languages/test_deno.py +++ b/python/tests/languages/test_deno.py @@ -66,3 +66,22 @@ async def test_typescript(async_sandbox: AsyncSandbox): language="deno", ) assert execution.results[0].text == "-1" + + +async def test_display(async_sandbox: AsyncSandbox): + code = """ +{ + [Symbol.for("Jupyter.display")]() { + return { + // Plain text content + "text/plain": "Hello world!", + + // HTML output + "text/html": "

Hello world!

", + } + } +} + """ + execution = await async_sandbox.run_code(code, language="deno") + assert execution.results[0].text == "Hello world!" + assert execution.results[0].html == "

Hello world!

" From 382153db9d4ea13e4c3ba399c7bcef68027b1e84 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 20:03:29 -0700 Subject: [PATCH 459/722] Clean up --- template/server/messaging.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/template/server/messaging.py b/template/server/messaging.py index 91934459..4f537aa8 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -146,6 +146,10 @@ async def change_current_directory( request = self._get_execute_request( message_id, f"Deno.chdir('{path}')", True ) + elif language == "js": + request = self._get_execute_request( + message_id, f"process.chdir('{path}')", True + ) elif language == "r": request = self._get_execute_request(message_id, f"setwd('{path}')", True) elif language == "java": @@ -216,9 +220,7 @@ async def _receive_message(self): async for message in self._ws: await self._process_message(json.loads(message)) except Exception as e: - logger.error( - f"WebSocket received error while receiving messages: {type(e)}: {str(e)}" - ) + logger.error(f"WebSocket received error while receiving messages: {str(e)}") async def _process_message(self, data: dict): """ From 039f34db97f423721d98fd1e90380359ed32bca2 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 30 Oct 2024 20:19:42 -0700 Subject: [PATCH 460/722] Handle wrong language --- python/tests/sync/test_default_kernels.py | 4 ++++ template/server/contexts.py | 3 +-- template/server/main.py | 15 +++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index a743dc08..d0daf820 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -1,3 +1,5 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox @@ -6,11 +8,13 @@ def test_js_kernel(sandbox: Sandbox): assert execution.logs.stdout == ["Hello, World!\n"] +@pytest.mark.skip_debug() def test_r_kernel(sandbox: Sandbox): execution = sandbox.run_code('print("Hello, World!")', language="r") assert execution.logs.stdout == ['[1] "Hello, World!"\n'] +@pytest.mark.skip_debug() def test_java_kernel(sandbox: Sandbox): execution = sandbox.run_code('System.out.println("Hello, World!")', language="java") assert execution.logs.stdout[0] == "Hello, World!" diff --git a/template/server/contexts.py b/template/server/contexts.py index 9f3b3834..3af317d3 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -36,9 +36,8 @@ async def create_context(client, websockets: dict, language: str, cwd: str) -> C response = await client.post(f"{JUPYTER_BASE_URL}/api/sessions", json=data) if not response.is_success: - return PlainTextResponse( + raise Exception( f"Failed to create context: {response.text}", - status_code=500, ) session_data = response.json() diff --git a/template/server/main.py b/template/server/main.py index 7ed36477..fa7760a9 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -89,9 +89,13 @@ async def post_execute(request: ExecutionRequest): context_id = default_websockets.get(language) if not context_id: - context = await create_context( - client, websockets, language, "/home/user" - ) + try: + context = await create_context( + client, websockets, language, "/home/user" + ) + except Exception as e: + return PlainTextResponse(str(e), status_code=500) + context_id = context.id default_websockets[language] = context_id @@ -124,7 +128,10 @@ async def post_contexts(request: CreateContext) -> Context: language = normalize_language(request.language) cwd = request.cwd or "/home/user" - return await create_context(client, websockets, language, cwd) + try: + return await create_context(client, websockets, language, cwd) + except Exception as e: + return PlainTextResponse(str(e), status_code=500) @app.get("/contexts") From c7709650403bfb909d11676532733b89f596b9b5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 13 Nov 2024 12:36:34 -0800 Subject: [PATCH 461/722] Increase data rate limit --- .changeset/large-masks-brake.md | 5 +++++ template/jupyter_server_config.py | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/large-masks-brake.md diff --git a/.changeset/large-masks-brake.md b/.changeset/large-masks-brake.md new file mode 100644 index 00000000..dcea544f --- /dev/null +++ b/.changeset/large-masks-brake.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Increase data rate limit diff --git a/template/jupyter_server_config.py b/template/jupyter_server_config.py index 97ff4f59..5400d8fe 100644 --- a/template/jupyter_server_config.py +++ b/template/jupyter_server_config.py @@ -45,3 +45,7 @@ # Whether to allow the user to run the server as root. # Default: False c.ServerApp.allow_root = True + +# (bytes/sec) Maximum rate at which messages can be sent on iopub before they are limited. +# Default: 1000000 +c.ServerApp.iopub_data_rate_limit = 1000000000 From c63f49cb23fcb0fc5f02bf3f02125f2d59e34c86 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 13 Nov 2024 14:12:35 -0800 Subject: [PATCH 462/722] Return json on dict --- .changeset/pretty-deers-bow.md | 5 +++++ template/startup_scripts/0002_data.py | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .changeset/pretty-deers-bow.md diff --git a/.changeset/pretty-deers-bow.md b/.changeset/pretty-deers-bow.md new file mode 100644 index 00000000..adce63fb --- /dev/null +++ b/.changeset/pretty-deers-bow.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Return json on dict diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 68e29400..13e916ff 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,7 +1,7 @@ import pandas from matplotlib.pyplot import Figure import IPython -from IPython.core.formatters import BaseFormatter +from IPython.core.formatters import BaseFormatter, JSONFormatter from traitlets.traitlets import Unicode, ObjectName from e2b_charts import chart_figure_to_dict @@ -48,6 +48,16 @@ def __call__(self, obj): return super().__call__(obj) +class E2BDictFormatter(JSONFormatter): + def __call__(self, obj): + # Figure object is for some reason removed on execution of the cell, + # so it can't be used in type_printers or with top-level import + + if isinstance(obj, dict): + return obj, {"expanded": True} + return super().__call__(obj) + + ip = IPython.get_ipython() ip.display_formatter.formatters["e2b/data"] = E2BDataFormatter( parent=ip.display_formatter @@ -55,3 +65,7 @@ def __call__(self, obj): ip.display_formatter.formatters["e2b/chart"] = E2BChartFormatter( parent=ip.display_formatter ) + +ip.display_formatter.formatters["application/json"] = E2BDictFormatter( + parent=ip.display_formatter +) From d20d0c547367704cb650783f7bfa05707abac76a Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 15 Nov 2024 13:30:24 -0800 Subject: [PATCH 463/722] Update Core E2B SDK in JS --- .changeset/famous-onions-repeat.md | 5 ++++ js/package.json | 2 +- pnpm-lock.yaml | 46 +++++++++++++++--------------- 3 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 .changeset/famous-onions-repeat.md diff --git a/.changeset/famous-onions-repeat.md b/.changeset/famous-onions-repeat.md new file mode 100644 index 00000000..7a7fe0f4 --- /dev/null +++ b/.changeset/famous-onions-repeat.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Update Core E2B SDK in JS diff --git a/js/package.json b/js/package.json index 8bdb3c9c..86b358ba 100644 --- a/js/package.json +++ b/js/package.json @@ -63,7 +63,7 @@ "vm" ], "dependencies": { - "e2b": "^1.0.0" + "e2b": "^1.0.5" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7f07d83..de20ded6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ importers: js: dependencies: e2b: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.0.5 + version: 1.0.5 devDependencies: '@types/node': specifier: ^18.18.6 @@ -77,8 +77,8 @@ packages: resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@1.10.0': - resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + '@bufbuild/protobuf@2.2.2': + resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==} '@changesets/apply-release-plan@7.0.0': resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} @@ -154,16 +154,16 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@connectrpc/connect-web@1.4.0': - resolution: {integrity: sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==} + '@connectrpc/connect-web@2.0.0-rc.3': + resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} peerDependencies: - '@bufbuild/protobuf': ^1.4.2 - '@connectrpc/connect': 1.4.0 + '@bufbuild/protobuf': ^2.2.0 + '@connectrpc/connect': 2.0.0-rc.3 - '@connectrpc/connect@1.4.0': - resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==} + '@connectrpc/connect@2.0.0-rc.3': + resolution: {integrity: sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==} peerDependencies: - '@bufbuild/protobuf': ^1.4.2 + '@bufbuild/protobuf': ^2.2.0 '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1115,8 +1115,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - e2b@1.0.0: - resolution: {integrity: sha512-HCxcLWrLbV+Si87QDRGPLbhS1o+Cm6voUW4mSbApAHnm4bZegIWhd3x80O4cwmYaMNWfhbJUmqasCN++iOgiew==} + e2b@1.0.5: + resolution: {integrity: sha512-0c2xqNQfVcVBmETsd1bXWCYaN3iVl7m81dJVcjB7O2/c15A7t0s/FkydcZGzVvfZchj40/1f09AdjGX6nk1eNQ==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -2994,7 +2994,7 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@bufbuild/protobuf@1.10.0': {} + '@bufbuild/protobuf@2.2.2': {} '@changesets/apply-release-plan@7.0.0': dependencies: @@ -3183,14 +3183,14 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@connectrpc/connect-web@1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2))': dependencies: - '@bufbuild/protobuf': 1.10.0 - '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) + '@bufbuild/protobuf': 2.2.2 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) - '@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)': dependencies: - '@bufbuild/protobuf': 1.10.0 + '@bufbuild/protobuf': 2.2.2 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -4049,11 +4049,11 @@ snapshots: dotenv@16.4.5: {} - e2b@1.0.0: + e2b@1.0.5: dependencies: - '@bufbuild/protobuf': 1.10.0 - '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) - '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)) + '@bufbuild/protobuf': 2.2.2 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)) compare-versions: 6.1.0 openapi-fetch: 0.9.8 platform: 1.3.6 From e42f1dc44ce30965d7578400f2dfc1c9dcb585bc Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 15 Nov 2024 13:56:20 -0800 Subject: [PATCH 464/722] Skip deno tests for now --- js/tests/languages/deno.test.ts | 40 ++++++++++++++--------------- python/tests/languages/test_deno.py | 10 ++++++++ 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/js/tests/languages/deno.test.ts b/js/tests/languages/deno.test.ts index 91e4b3a2..ee3588b6 100644 --- a/js/tests/languages/deno.test.ts +++ b/js/tests/languages/deno.test.ts @@ -2,65 +2,65 @@ import { expect } from 'vitest' import { sandboxTest } from '../setup' -sandboxTest('js simple', async ({ sandbox }) => { - const result = await sandbox.runCode('console.log("Hello, World!")', {language: "deno"}) +sandboxTest.skip('js simple', async ({ sandbox }) => { + const result = await sandbox.runCode('console.log("Hello, World!")', { language: "deno" }) expect(result.logs.stdout.join().trim()).toEqual('Hello, World!') }) -sandboxTest('js import', async ({ sandbox }) => { - const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', {language: "deno"}) +sandboxTest.skip('js import', async ({ sandbox }) => { + const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', { language: "deno" }) expect(result.results[0].text).toEqual('true') }) -sandboxTest('js top level await', async ({ sandbox }) => { +sandboxTest.skip('js top level await', async ({ sandbox }) => { const result = await sandbox.runCode(` async function main() { return 'Hello, World!' } - + await main() - `, {language: "deno"}) + `, { language: "deno" }) expect(result.results[0].text).toEqual('Hello, World!') }) -sandboxTest('js es6', async ({ sandbox }) => { +sandboxTest.skip('js es6', async ({ sandbox }) => { const result = await sandbox.runCode(` const add = (x, y) => x + y; - add(1, 2)`, {language: "deno"}) + add(1, 2)`, { language: "deno" }) expect(result.results[0].text).toEqual('3') }) -sandboxTest('js context', async ({ sandbox }) => { - await sandbox.runCode('const z = 1', {language: "deno"}) - const result = await sandbox.runCode('z', {language: "deno"}) +sandboxTest.skip('js context', async ({ sandbox }) => { + await sandbox.runCode('const z = 1', { language: "deno" }) + const result = await sandbox.runCode('z', { language: "deno" }) expect(result.results[0].text).toEqual('1') }) -sandboxTest('js cwd', async ({ sandbox }) => { - const result = await sandbox.runCode('process.cwd()', {language: "deno"}) +sandboxTest.skip('js cwd', async ({ sandbox }) => { + const result = await sandbox.runCode('process.cwd()', { language: "deno" }) expect(result.results[0].text).toEqual('/home/user') - const ctx = await sandbox.createCodeContext( {cwd: '/home', language: "deno"}) - const result2 = await sandbox.runCode('process.cwd()', {context: ctx}) + const ctx = await sandbox.createCodeContext({ cwd: '/home', language: "deno" }) + const result2 = await sandbox.runCode('process.cwd()', { context: ctx }) expect(result2.results[0].text).toEqual('/home') }) -sandboxTest('ts simple', async ({ sandbox }) => { +sandboxTest.skip('ts simple', async ({ sandbox }) => { const result = await sandbox.runCode(` function subtract(x: number, y: number): number { return x - y; } subtract(1, 2) -`, {language: "deno"}) +`, { language: "deno" }) expect(result.results[0].text).toEqual('-1') }) -sandboxTest('test display', async ({ sandbox }) => { +sandboxTest.skip('test display', async ({ sandbox }) => { const result = await sandbox.runCode(` { [Symbol.for("Jupyter.display")]() { @@ -73,7 +73,7 @@ sandboxTest('test display', async ({ sandbox }) => { } } } -`, {language: "deno"}) +`, { language: "deno" }) expect(result.results[0].html).toBe('

Hello world!

') expect(result.results[0].text).toBe('Hello world!') diff --git a/python/tests/languages/test_deno.py b/python/tests/languages/test_deno.py index 0a0e58e7..74c3e57b 100644 --- a/python/tests/languages/test_deno.py +++ b/python/tests/languages/test_deno.py @@ -1,6 +1,9 @@ +import pytest + from e2b_code_interpreter import AsyncSandbox +@pytest.mark.skip(reason="Deno is not supported yet") async def test_javascript(async_sandbox: AsyncSandbox): code = """ console.log('Hello, World!') @@ -9,6 +12,7 @@ async def test_javascript(async_sandbox: AsyncSandbox): assert execution.logs.stdout == ["Hello, World!\n"] +@pytest.mark.skip(reason="Deno is not supported yet") async def test_import(async_sandbox: AsyncSandbox): code = """ import isOdd from 'npm:is-odd' @@ -18,6 +22,7 @@ async def test_import(async_sandbox: AsyncSandbox): assert execution.results[0].text == "true" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_toplevel_await(async_sandbox: AsyncSandbox): code = """ async function main() { @@ -30,6 +35,7 @@ async def test_toplevel_await(async_sandbox: AsyncSandbox): assert execution.results[0].text == "Hello, World!" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_es6(async_sandbox: AsyncSandbox): code = """ const add = (x, y) => x + y; @@ -39,12 +45,14 @@ async def test_es6(async_sandbox: AsyncSandbox): assert execution.results[0].text == "3" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_context(async_sandbox: AsyncSandbox): await async_sandbox.run_code("const x = 1", language="deno") execution = await async_sandbox.run_code("x", language="deno") assert execution.results[0].text == "1" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_cwd(async_sandbox: AsyncSandbox): execution = await async_sandbox.run_code("process.cwd()", language="deno") assert execution.results[0].text == "/home/user" @@ -54,6 +62,7 @@ async def test_cwd(async_sandbox: AsyncSandbox): assert execution.results[0].text == "/home" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_typescript(async_sandbox: AsyncSandbox): execution = await async_sandbox.run_code( """ @@ -68,6 +77,7 @@ async def test_typescript(async_sandbox: AsyncSandbox): assert execution.results[0].text == "-1" +@pytest.mark.skip(reason="Deno is not supported yet") async def test_display(async_sandbox: AsyncSandbox): code = """ { From 27e465029201914b06dcf0ab170d03e70a76f6ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 15 Nov 2024 22:11:45 +0000 Subject: [PATCH 465/722] [skip ci] Release new versions --- .changeset/famous-onions-repeat.md | 5 ----- .changeset/large-masks-brake.md | 5 ----- .changeset/lazy-impalas-accept.md | 5 ----- .changeset/pretty-deers-bow.md | 5 ----- js/package.json | 2 +- template/package.json | 2 +- 6 files changed, 2 insertions(+), 22 deletions(-) delete mode 100644 .changeset/famous-onions-repeat.md delete mode 100644 .changeset/large-masks-brake.md delete mode 100644 .changeset/lazy-impalas-accept.md delete mode 100644 .changeset/pretty-deers-bow.md diff --git a/.changeset/famous-onions-repeat.md b/.changeset/famous-onions-repeat.md deleted file mode 100644 index 7a7fe0f4..00000000 --- a/.changeset/famous-onions-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Update Core E2B SDK in JS diff --git a/.changeset/large-masks-brake.md b/.changeset/large-masks-brake.md deleted file mode 100644 index dcea544f..00000000 --- a/.changeset/large-masks-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Increase data rate limit diff --git a/.changeset/lazy-impalas-accept.md b/.changeset/lazy-impalas-accept.md deleted file mode 100644 index cf0eb9f0..00000000 --- a/.changeset/lazy-impalas-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add [Deno kernel](https://docs.deno.com/runtime/reference/cli/jupyter/) diff --git a/.changeset/pretty-deers-bow.md b/.changeset/pretty-deers-bow.md deleted file mode 100644 index adce63fb..00000000 --- a/.changeset/pretty-deers-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Return json on dict diff --git a/js/package.json b/js/package.json index 86b358ba..c6ab594a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.3", + "version": "1.0.4", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/template/package.json b/template/package.json index 9223f59a..44b70172 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.2" + "version": "0.0.3" } From 502fd0148376d0aef71a57d8182a115e1a5ebd62 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 19 Nov 2024 19:49:13 +0100 Subject: [PATCH 466/722] Create CODEOWNERS --- CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..b6da0aa7 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,3 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence. +* @jakubno @ValentaTomas From 316ae8c77553fca659137b4f635bc58771e96eb0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 19 Nov 2024 12:51:16 -0800 Subject: [PATCH 467/722] Add json formatter for list --- template/startup_scripts/0002_data.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 13e916ff..eab542b6 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -48,13 +48,15 @@ def __call__(self, obj): return super().__call__(obj) -class E2BDictFormatter(JSONFormatter): +class E2BJSONFormatter(JSONFormatter): def __call__(self, obj): # Figure object is for some reason removed on execution of the cell, # so it can't be used in type_printers or with top-level import if isinstance(obj, dict): return obj, {"expanded": True} + if isinstance(obj, list): + return obj, {"expanded": True} return super().__call__(obj) @@ -66,6 +68,6 @@ def __call__(self, obj): parent=ip.display_formatter ) -ip.display_formatter.formatters["application/json"] = E2BDictFormatter( +ip.display_formatter.formatters["application/json"] = E2BJSONFormatter( parent=ip.display_formatter ) From 077ecb15e13763466406e242d47ca665f462ee0e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 19 Nov 2024 12:52:48 -0800 Subject: [PATCH 468/722] Add changeset --- .changeset/rare-moose-work.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rare-moose-work.md diff --git a/.changeset/rare-moose-work.md b/.changeset/rare-moose-work.md new file mode 100644 index 00000000..43993506 --- /dev/null +++ b/.changeset/rare-moose-work.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add json formatter for list From b22a75fe4ca64624ee2f071f5d0ee0711c9c900f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 19 Nov 2024 18:51:15 -0800 Subject: [PATCH 469/722] Parse numpy types --- template/startup_scripts/0002_data.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index eab542b6..5b435442 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -54,9 +54,15 @@ def __call__(self, obj): # so it can't be used in type_printers or with top-level import if isinstance(obj, dict): - return obj, {"expanded": True} + return orjson.loads(orjson.dumps(obj, option=orjson.OPT_SERIALIZE_NUMPY)), { + "expanded": True + } + if isinstance(obj, list): - return obj, {"expanded": True} + return orjson.loads(orjson.dumps(obj, option=orjson.OPT_SERIALIZE_NUMPY)), { + "expanded": True + } + return super().__call__(obj) From 083b11ddd9274b5e853b1c047c5d24ee0a1d65a0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 19 Nov 2024 18:52:38 -0800 Subject: [PATCH 470/722] Add changeset --- .changeset/itchy-sheep-tie.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/itchy-sheep-tie.md diff --git a/.changeset/itchy-sheep-tie.md b/.changeset/itchy-sheep-tie.md new file mode 100644 index 00000000..264252ad --- /dev/null +++ b/.changeset/itchy-sheep-tie.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Serialize numpy types in dicts/lists From 6059827cf2fca989a6ad6c6f251fbddca332879c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 19 Nov 2024 21:19:43 -0800 Subject: [PATCH 471/722] Parse non string keys in json --- template/startup_scripts/0002_data.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 5b435442..23feff90 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -50,18 +50,12 @@ def __call__(self, obj): class E2BJSONFormatter(JSONFormatter): def __call__(self, obj): - # Figure object is for some reason removed on execution of the cell, - # so it can't be used in type_printers or with top-level import - - if isinstance(obj, dict): - return orjson.loads(orjson.dumps(obj, option=orjson.OPT_SERIALIZE_NUMPY)), { - "expanded": True - } - - if isinstance(obj, list): - return orjson.loads(orjson.dumps(obj, option=orjson.OPT_SERIALIZE_NUMPY)), { - "expanded": True - } + if isinstance(obj, (list, dict)): + return orjson.loads( + orjson.dumps( + obj, option=orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS + ) + ), {"expanded": True} return super().__call__(obj) From 4645bd03b217623b16fd7a29cf64bb9942296302 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 21 Nov 2024 14:33:22 -0800 Subject: [PATCH 472/722] Fail softly when can't parse json --- template/startup_scripts/0002_data.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 23feff90..a8383c7d 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -51,11 +51,14 @@ def __call__(self, obj): class E2BJSONFormatter(JSONFormatter): def __call__(self, obj): if isinstance(obj, (list, dict)): - return orjson.loads( - orjson.dumps( - obj, option=orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS - ) - ), {"expanded": True} + try: + return orjson.loads( + orjson.dumps( + obj, option=orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS + ) + ), {"expanded": True} + except TypeError: + pass return super().__call__(obj) From 910e9cd8f0b3634fdec461fafac7ee8a34ca073a Mon Sep 17 00:00:00 2001 From: 0div Date: Mon, 25 Nov 2024 15:44:37 -0800 Subject: [PATCH 473/722] boilerplate to generate api ref for js code interpreter --- .../v1.0.4/charts/page.mdx | 240 +++++++++++ .../v1.0.4/consts/page.mdx | 13 + .../v1.0.4/index/page.mdx | 103 +++++ .../v1.0.4/messaging/page.mdx | 328 +++++++++++++++ .../v1.0.4/sandbox/page.mdx | 312 ++++++++++++++ js/package.json | 2 + js/scripts/CustomMarkdownTheme.js | 64 +++ js/scripts/generate_api_ref.sh | 36 ++ js/typedoc.json | 31 ++ pnpm-lock.yaml | 396 ++++++++++++++++++ 10 files changed, 1525 insertions(+) create mode 100644 api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx create mode 100644 api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx create mode 100644 api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx create mode 100644 api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx create mode 100644 api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx create mode 100644 js/scripts/CustomMarkdownTheme.js create mode 100755 js/scripts/generate_api_ref.sh create mode 100644 js/typedoc.json diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx b/api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx b/api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx b/api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx b/api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx new file mode 100644 index 00000000..e816e6d3 --- /dev/null +++ b/api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx @@ -0,0 +1,328 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +###### Get Signature + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx b/api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/js/package.json b/js/package.json index c6ab594a..025fbe60 100644 --- a/js/package.json +++ b/js/package.json @@ -41,6 +41,8 @@ "knip": "^5.25.1", "npm-check-updates": "^16.14.20", "tsup": "^8.1.0", + "typedoc": "^0.26.8", + "typedoc-plugin-markdown": "^4.2.7", "typescript": "^5.5.3", "vitest": "^2.0.1" }, diff --git a/js/scripts/CustomMarkdownTheme.js b/js/scripts/CustomMarkdownTheme.js new file mode 100644 index 00000000..db55c01d --- /dev/null +++ b/js/scripts/CustomMarkdownTheme.js @@ -0,0 +1,64 @@ +const { MarkdownTheme, MarkdownPageEvent } = require('typedoc-plugin-markdown') + +function load(app) { + // Listen to the render event + app.renderer.on(MarkdownPageEvent.END, (page) => { + // Remove Markdown links from the document contents + page.contents = removeMarkdownLinks( + removeFirstNLines( + convertH5toH3(removeLinesWithConditions(page.contents)), + 6 + ) + ) + }) +} + +// this is a hacky way to make methods in the js-sdk api reference look more prominent +function convertH5toH3(text) { + return text.replace(/^##### (.*)$/gm, '### $1') +} + +// Function to remove Markdown-style links +function removeMarkdownLinks(text) { + // Regular expression to match Markdown links [text](url) + return text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1') // Replace with just the link text +} + +function removeFirstNLines(text, n, condition) { + // Split the text into lines, then join back excluding the first four lines + return text.split('\n').slice(n).join('\n') +} + +// Function to remove lines based on conditions +function removeLinesWithConditions(text) { + const lines = text.split('\n') + const filteredLines = [] + + for (let i = 0; i < lines.length; i++) { + // Check if the current line starts with "#### Extends" or "###### Overrides" + if ( + lines[i].startsWith('#### Extends') || + lines[i].startsWith('###### Overrides') || + lines[i].startsWith('###### Inherited from') + ) { + // If it does, skip this line and the next three lines + i += 3 // Skip this line and the next three + continue + } + + if (lines[i].startsWith('##### new')) { + // avoid promoting constructors + i += 1 + continue + } + + // If not removed, add the line to filteredLines + filteredLines.push(convertH5toH3(lines[i])) + } + + // Join the filtered lines back into a single string + return filteredLines.join('\n') +} + +// Export the load function +module.exports = { load } diff --git a/js/scripts/generate_api_ref.sh b/js/scripts/generate_api_ref.sh new file mode 100755 index 00000000..fe589b48 --- /dev/null +++ b/js/scripts/generate_api_ref.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This script generates the Code Interpreter JS SDK API reference markdown files +# Run it in the `js/` directory + +# generate raw api reference markdown files +npx typedoc + +PKG_VERSION="v$(node -p "require('./package.json').version")" +ROUTES_DIR="../api-reference/code-interpreter-js-sdk/${PKG_VERSION}" +# move to docs web app +mkdir -p "${ROUTES_DIR}" + +rm -rf api_ref/README.md + +# Flatten the api_ref directory by moving all nested files to the root level and remove empty subdirectories +find api_ref -mindepth 2 -type f | while read -r file; do + mv "$file" api_ref/ +done +find api_ref -type d -empty -delete + +# Transfrom top level MD files into folders of the same name with page.mdx inside +find api_ref -maxdepth 1 -type f -name "*.md" | while read -r file; do + # Extract the filename without extension + filename=$(basename "$file" .md) + # Create the directory of the same name in api_ref + mkdir -p "api_ref/${filename}" + # Move the file inside the newly created directory + mv "$file" "api_ref/${filename}/page.mdx" +done + +cp -r api_ref/* "${ROUTES_DIR}" + +rm -rf api_ref diff --git a/js/typedoc.json b/js/typedoc.json new file mode 100644 index 00000000..c5324596 --- /dev/null +++ b/js/typedoc.json @@ -0,0 +1,31 @@ +{ + "out": "api_ref", + "plugin": ["typedoc-plugin-markdown", "./scripts/CustomMarkdownTheme.js"], + "exclude": ["**/*.spec.ts"], + "entryPoints": [ + "src/index.ts", + "src/charts.ts", + "src/consts.ts", + "src/messaging.ts", + "src/sandbox.ts" + ], + "excludeExternals": true, + "excludePrivate": true, + "excludeProtected": true, + "navigation": { + "includeGroups": false, + "includeCategories": false + }, + "outputFileStrategy": "modules", + "readme": "none", + "disableSources": true, + // typedoc-plugin-markdown options + "classPropertiesFormat": "table", + "typeDeclarationFormat": "table", + "enumMembersFormat": "table", + "parametersFormat": "table", + "expandParameters": true, + "useCodeBlocks": true, + "hidePageTitle": true, + "hideBreadcrumbs": true +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de20ded6..ae164df6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,12 @@ importers: tsup: specifier: ^8.1.0 version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3) + typedoc: + specifier: ^0.26.8 + version: 0.26.11(typescript@5.5.3) + typedoc-plugin-markdown: + specifier: ^4.2.7 + version: 4.2.10(typedoc@0.26.11(typescript@5.5.3)) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -610,6 +616,21 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@1.23.1': + resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} + + '@shikijs/engine-javascript@1.23.1': + resolution: {integrity: sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==} + + '@shikijs/engine-oniguruma@1.23.1': + resolution: {integrity: sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==} + + '@shikijs/types@1.23.1': + resolution: {integrity: sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==} + + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@sigstore/bundle@1.1.0': resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -669,9 +690,15 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -693,9 +720,15 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vitest/expect@2.0.1': resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} @@ -894,6 +927,9 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -913,6 +949,12 @@ packages: changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -972,6 +1014,9 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -1091,10 +1136,17 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1125,6 +1177,9 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1138,6 +1193,10 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1416,6 +1475,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1427,6 +1492,9 @@ packages: resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -1736,6 +1804,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1783,6 +1854,9 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} @@ -1805,6 +1879,16 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -1816,6 +1900,21 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -1851,6 +1950,10 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -2025,6 +2128,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-to-es@0.4.1: + resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} + openapi-fetch@0.9.8: resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} @@ -2220,12 +2326,19 @@ packages: resolution: {integrity: sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==} engines: {node: '>= 14'} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2291,6 +2404,15 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regex-recursion@4.2.1: + resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -2416,6 +2538,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@1.23.1: + resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -2478,6 +2603,9 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-please@2.0.2: resolution: {integrity: sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==} engines: {node: '>=14'} @@ -2542,6 +2670,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2635,6 +2766,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -2727,11 +2861,27 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedoc-plugin-markdown@4.2.10: + resolution: {integrity: sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.26.x + + typedoc@0.26.11: + resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + typescript@5.5.3: resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + udc@1.0.1: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} @@ -2764,6 +2914,21 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2789,6 +2954,12 @@ packages: resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@2.0.1: resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2936,6 +3107,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -2969,6 +3145,9 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@ampproject/remapping@2.3.0': @@ -3504,6 +3683,33 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.13.0': optional: true + '@shikijs/core@1.23.1': + dependencies: + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-es: 0.4.1 + + '@shikijs/engine-oniguruma@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/types@1.23.1': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + '@sigstore/bundle@1.1.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 @@ -3562,8 +3768,16 @@ snapshots: '@types/estree@1.0.5': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.0.4': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/minimist@1.2.5': {} '@types/node@12.20.55': {} @@ -3580,10 +3794,14 @@ snapshots: '@types/semver@7.5.8': {} + '@types/unist@3.0.3': {} + '@types/ws@8.5.10': dependencies: '@types/node': 20.14.10 + '@ungap/structured-clone@1.2.0': {} + '@vitest/expect@2.0.1': dependencies: '@vitest/spy': 2.0.1 @@ -3832,6 +4050,8 @@ snapshots: camelcase@7.0.1: {} + ccount@2.0.1: {} + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -3858,6 +4078,10 @@ snapshots: udc: 1.0.1 underscore: 1.13.6 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -3916,6 +4140,8 @@ snapshots: color-support@1.1.3: {} + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} commander@4.1.1: {} @@ -4032,8 +4258,14 @@ snapshots: delegates@1.0.0: {} + dequal@2.0.3: {} + detect-indent@6.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-sequences@29.6.3: {} diff@4.0.2: @@ -4066,6 +4298,8 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -4080,6 +4314,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@4.5.0: {} + env-paths@2.2.1: {} err-code@2.0.3: {} @@ -4476,6 +4712,24 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hosted-git-info@2.8.9: {} hosted-git-info@5.2.1: @@ -4486,6 +4740,8 @@ snapshots: dependencies: lru-cache: 7.18.3 + html-void-elements@3.0.0: {} + http-cache-semantics@4.1.1: {} http-proxy-agent@5.0.0: @@ -4760,6 +5016,10 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + load-tsconfig@0.2.5: {} load-yaml-file@0.2.0: @@ -4802,6 +5062,8 @@ snapshots: lru-cache@7.18.3: {} + lunr@2.3.9: {} + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -4855,6 +5117,29 @@ snapshots: map-obj@4.3.0: {} + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdurl@2.0.0: {} + meow@6.1.1: dependencies: '@types/minimist': 1.2.5 @@ -4873,6 +5158,23 @@ snapshots: merge2@1.4.1: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + micromatch@4.0.5: dependencies: braces: 3.0.2 @@ -4900,6 +5202,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist-options@4.1.0: dependencies: arrify: 1.0.1 @@ -5134,6 +5440,12 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-to-es@0.4.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 4.2.1 + openapi-fetch@0.9.8: dependencies: openapi-typescript-helpers: 0.0.8 @@ -5306,10 +5618,14 @@ snapshots: kleur: 4.1.5 sisteransi: 1.0.5 + property-information@6.5.0: {} + proto-list@1.2.4: {} pseudomap@1.0.2: {} + punycode.js@2.3.1: {} + punycode@2.3.1: {} pupa@3.1.0: @@ -5389,6 +5705,16 @@ snapshots: regenerator-runtime@0.14.1: {} + regex-recursion@4.2.1: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -5520,6 +5846,15 @@ snapshots: shebang-regex@3.0.0: {} + shiki@1.23.1: + dependencies: + '@shikijs/core': 1.23.1 + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -5586,6 +5921,8 @@ snapshots: dependencies: whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} + spawn-please@2.0.2: dependencies: cross-spawn: 7.0.3 @@ -5664,6 +6001,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5747,6 +6089,8 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + trim-newlines@3.0.1: {} ts-interface-checker@0.1.13: {} @@ -5863,8 +6207,23 @@ snapshots: dependencies: is-typedarray: 1.0.0 + typedoc-plugin-markdown@4.2.10(typedoc@0.26.11(typescript@5.5.3)): + dependencies: + typedoc: 0.26.11(typescript@5.5.3) + + typedoc@0.26.11(typescript@5.5.3): + dependencies: + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + shiki: 1.23.1 + typescript: 5.5.3 + yaml: 2.6.1 + typescript@5.5.3: {} + uc.micro@2.1.0: {} + udc@1.0.1: {} unbox-primitive@1.0.2: @@ -5898,6 +6257,29 @@ snapshots: dependencies: crypto-random-string: 4.0.0 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@0.1.2: {} untildify@4.0.0: {} @@ -5933,6 +6315,16 @@ snapshots: dependencies: builtins: 5.0.1 + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-node@2.0.1(@types/node@18.18.6): dependencies: cac: 6.7.14 @@ -6089,6 +6481,8 @@ snapshots: yaml@2.4.5: {} + yaml@2.6.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -6130,3 +6524,5 @@ snapshots: zod: 3.22.4 zod@3.22.4: {} + + zwitch@2.0.4: {} From b7cb65130f982d33847cb7f4cc4063a849beb5a9 Mon Sep 17 00:00:00 2001 From: 0div Date: Mon, 25 Nov 2024 18:32:44 -0800 Subject: [PATCH 474/722] change python deps to allow pydoc-markdown to work --- python/poetry.lock | 716 ++++++++++++++++++++++++++++++++++++++++-- python/pyproject.toml | 3 +- 2 files changed, 687 insertions(+), 32 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 45de49fe..79d78c51 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "anyio" @@ -43,33 +43,33 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "black" -version = "24.8.0" +version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, ] [package.dependencies] @@ -98,6 +98,120 @@ files = [ {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + [[package]] name = "click" version = "8.1.7" @@ -123,6 +237,115 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "databind" +version = "4.5.2" +description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.8 and newer." +optional = false +python-versions = "<4.0.0,>=3.8.0" +files = [ + {file = "databind-4.5.2-py3-none-any.whl", hash = "sha256:b9c3a03c0414aa4567f095d7218ac904bd2b267b58e3763dac28e83d64b69770"}, + {file = "databind-4.5.2.tar.gz", hash = "sha256:0a8aa0ff130a0306581c559388f5ef65e0fae7ef4b86412eacb1f4a0420006c4"}, +] + +[package.dependencies] +Deprecated = ">=1.2.12,<2.0.0" +nr-date = ">=2.0.0,<3.0.0" +nr-stream = ">=1.0.0,<2.0.0" +setuptools = {version = ">=40.8.0", markers = "python_version < \"3.10\""} +typeapi = ">=2.0.1,<3" +typing-extensions = ">=3.10.0,<5" + +[[package]] +name = "databind-core" +version = "4.5.2" +description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.8 and newer. Deprecated, use `databind` package." +optional = false +python-versions = "<4.0.0,>=3.8.0" +files = [ + {file = "databind.core-4.5.2-py3-none-any.whl", hash = "sha256:a1dd1c6bd8ca9907d1292d8df9ec763ce91543e27f7eda4268e4a1a84fcd1c42"}, + {file = "databind.core-4.5.2.tar.gz", hash = "sha256:b8ac8127bc5d6b239a2a81aeddb268b0c4cadd53fbce7e8b2c7a9ef6413bccb3"}, +] + +[package.dependencies] +databind = ">=4.5.2,<5.0.0" + +[[package]] +name = "databind-json" +version = "4.5.2" +description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.8 and newer. Deprecated, use `databind` module instead." +optional = false +python-versions = "<4.0.0,>=3.8.0" +files = [ + {file = "databind.json-4.5.2-py3-none-any.whl", hash = "sha256:a803bf440634685984361cb2a5a975887e487c854ed48d81ff7aaf3a1ed1e94c"}, + {file = "databind.json-4.5.2.tar.gz", hash = "sha256:6cc9b5c6fddaebd49b2433932948eb3be8a41633b90aa37998d7922504b8f165"}, +] + +[package.dependencies] +databind = ">=4.5.2,<5.0.0" + +[[package]] +name = "deprecated" +version = "1.2.15" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, + {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] + +[[package]] +name = "docspec" +version = "2.2.1" +description = "Docspec is a JSON object specification for representing API documentation of programming languages." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "docspec-2.2.1-py3-none-any.whl", hash = "sha256:7538f750095a9688c6980ff9a4e029a823a500f64bd00b6b4bdb27951feb31cb"}, + {file = "docspec-2.2.1.tar.gz", hash = "sha256:4854e77edc0e2de40e785e57e95880f7095a05fe978f8b54cef7a269586e15ff"}, +] + +[package.dependencies] +"databind.core" = ">=4.2.6,<5.0.0" +"databind.json" = ">=4.2.6,<5.0.0" +Deprecated = ">=1.2.12,<2.0.0" + +[[package]] +name = "docspec-python" +version = "2.2.1" +description = "A parser based on lib2to3 producing docspec data from Python source code." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54"}, + {file = "docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559"}, +] + +[package.dependencies] +black = ">=23.1.0,<24.0.0" +docspec = ">=2.2.1,<3.0.0" +"nr.util" = ">=0.7.0" + +[[package]] +name = "docstring-parser" +version = "0.11" +description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" +optional = false +python-versions = ">=3.6" +files = [ + {file = "docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb"}, +] + +[package.extras] +test = ["black", "pytest"] + [[package]] name = "e2b" version = "1.0.0" @@ -249,6 +472,92 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -260,6 +569,43 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nr-date" +version = "2.1.0" +description = "" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568"}, + {file = "nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6"}, +] + +[[package]] +name = "nr-stream" +version = "1.1.5" +description = "" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4"}, + {file = "nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65"}, +] + +[[package]] +name = "nr-util" +version = "0.8.12" +description = "General purpose Python utility library." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb"}, + {file = "nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4"}, +] + +[package.dependencies] +deprecated = ">=1.2.0,<2.0.0" +typing-extensions = ">=3.0.0" + [[package]] name = "packaging" version = "24.1" @@ -284,19 +630,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -333,6 +679,33 @@ files = [ {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, ] +[[package]] +name = "pydoc-markdown" +version = "4.8.2" +description = "Create Python API documentation in Markdown format." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f"}, + {file = "pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b"}, +] + +[package.dependencies] +click = ">=7.1,<9.0" +"databind.core" = ">=4.4.0,<5.0.0" +"databind.json" = ">=4.4.0,<5.0.0" +docspec = ">=2.2.1,<3.0.0" +docspec-python = ">=2.2.1,<3.0.0" +docstring-parser = ">=0.11,<0.12" +jinja2 = ">=3.0.0,<4.0.0" +"nr.util" = ">=0.7.5,<1.0.0" +PyYAML = ">=5.0,<7.0" +requests = ">=2.23.0,<3.0.0" +tomli = ">=2.0.0,<3.0.0" +tomli_w = ">=1.0.0,<2.0.0" +watchdog = "*" +yapf = ">=0.30.0" + [[package]] name = "pytest" version = "7.4.4" @@ -436,6 +809,109 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "75.3.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, + {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] + [[package]] name = "six" version = "1.16.0" @@ -469,6 +945,31 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomli-w" +version = "1.0.0" +description = "A lil' TOML writer" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli_w-1.0.0-py3-none-any.whl", hash = "sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463"}, + {file = "tomli_w-1.0.0.tar.gz", hash = "sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9"}, +] + +[[package]] +name = "typeapi" +version = "2.2.3" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "typeapi-2.2.3-py3-none-any.whl", hash = "sha256:038062b473dd9bc182966469d7a37d81ba7fa5bb0c01f30b0604b5667b13a47b"}, + {file = "typeapi-2.2.3.tar.gz", hash = "sha256:61cf8c852c05471522fcf55ec37d0c37f0de6943cc8e4d58529f796881e32c08"}, +] + +[package.dependencies] +typing-extensions = ">=3.0.0" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -480,7 +981,160 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "watchdog" +version = "4.0.2" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, + {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, + {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, + {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, + {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wrapt" +version = "1.17.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, +] + +[[package]] +name = "yapf" +version = "0.43.0" +description = "A formatter for Python code" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca"}, + {file = "yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e"}, +] + +[package.dependencies] +platformdirs = ">=3.5.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "73cfafb6bfa149e04ecef81d45f5e944b0dce0ba826d44c36956d91aa2b0258d" +content-hash = "4153cb42716828cb9b2f447c7710126ba2046435e17648c56e54d9610356b83b" diff --git a/python/pyproject.toml b/python/pyproject.toml index 0e5e91e7..f9e49096 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,9 +15,10 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" e2b = "^1.0.0" +black = "23.12.1" +pydoc-markdown = "^4.8.2" [tool.poetry.group.dev.dependencies] -black = "^24.3.0" pytest = "^7.4.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" From ff36efea619bf557909b332e43c6f2d10254821c Mon Sep 17 00:00:00 2001 From: 0div Date: Mon, 25 Nov 2024 18:34:30 -0800 Subject: [PATCH 475/722] boilerplate to generate api ref for python code interpreter --- .../v1.0.1/e2b_code_interpreter/page.mdx | 722 ++++++++++++++++++ js/scripts/generate_api_ref.sh | 1 - python/scripts/generate_api_ref.sh | 32 + 3 files changed, 754 insertions(+), 1 deletion(-) create mode 100644 api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx create mode 100755 python/scripts/generate_api_ref.sh diff --git a/api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx b/api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx new file mode 100644 index 00000000..325b8e18 --- /dev/null +++ b/api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx @@ -0,0 +1,722 @@ + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + diff --git a/js/scripts/generate_api_ref.sh b/js/scripts/generate_api_ref.sh index fe589b48..e3b8336a 100755 --- a/js/scripts/generate_api_ref.sh +++ b/js/scripts/generate_api_ref.sh @@ -10,7 +10,6 @@ npx typedoc PKG_VERSION="v$(node -p "require('./package.json').version")" ROUTES_DIR="../api-reference/code-interpreter-js-sdk/${PKG_VERSION}" -# move to docs web app mkdir -p "${ROUTES_DIR}" rm -rf api_ref/README.md diff --git a/python/scripts/generate_api_ref.sh b/python/scripts/generate_api_ref.sh new file mode 100755 index 00000000..e3ea6294 --- /dev/null +++ b/python/scripts/generate_api_ref.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This script generates the python sdk api reference markdown files +# Run it in the `python-sdk/` directory + +PKG_VERSION="v$(node -p "require('./package.json').version")" +ROUTES_DIR="../api-reference/code-interpreter-python-sdk/${PKG_VERSION}" +mkdir -p "${ROUTES_DIR}" + +packages=("e2b_code_interpreter") + +mkdir -p api_ref + +for package in "${packages[@]}"; do + # generate raw api reference markdown file + poetry run pydoc-markdown -p "${package}" >api_ref/"${package}".mdx + # remove package path display + sed -i'' -e '/]*>.*<\/a>/d' "api_ref/${package}.mdx" + # remove empty hyperlinks + sed -i'' -e '/^# /d' "api_ref/${package}.mdx" + # remove " Objects" from lines starting with "##" + sed -i'' -e '/^## / s/ Objects$//' "api_ref/${package}.mdx" + # replace lines starting with "####" with "###" + sed -i'' -e 's/^####/###/' "api_ref/${package}.mdx" + # move to docs + mkdir -p "${ROUTES_DIR}/${package}" + mv "api_ref/${package}.mdx" "${ROUTES_DIR}/${package}/page.mdx" +done + +rm -rf api_ref From 9a7cecc09768d200b502dbe6f8f21943403d6f31 Mon Sep 17 00:00:00 2001 From: 0div Date: Tue, 26 Nov 2024 10:33:20 -0800 Subject: [PATCH 476/722] rebrand to SDK Reference --- js/api_ref/README.md | 5 + .../charts/page.mdx => js/api_ref/charts.md | 0 .../consts/page.mdx => js/api_ref/consts.md | 0 .../index/page.mdx => js/api_ref/index.md | 0 .../page.mdx => js/api_ref/messaging.md | 0 .../sandbox/page.mdx => js/api_ref/sandbox.md | 0 js/scripts/CustomMarkdownTheme.js | 2 +- js/scripts/generate_api_ref.sh | 35 -- js/scripts/generate_sdk_ref.sh | 35 ++ python/scripts/generate_api_ref.sh | 32 -- python/scripts/generate_sdk_ref.sh | 32 ++ .../v1.0.4/charts/page.mdx | 240 +++++++++++++ .../v1.0.4/consts/page.mdx | 13 + .../v1.0.4/index/page.mdx | 103 ++++++ .../v1.0.4/messaging/page.mdx | 328 ++++++++++++++++++ .../v1.0.4/sandbox/page.mdx | 312 +++++++++++++++++ .../v1.0.1/e2b_code_interpreter/page.mdx | 0 17 files changed, 1069 insertions(+), 68 deletions(-) create mode 100644 js/api_ref/README.md rename api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx => js/api_ref/charts.md (100%) rename api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx => js/api_ref/consts.md (100%) rename api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx => js/api_ref/index.md (100%) rename api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx => js/api_ref/messaging.md (100%) rename api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx => js/api_ref/sandbox.md (100%) delete mode 100755 js/scripts/generate_api_ref.sh create mode 100755 js/scripts/generate_sdk_ref.sh delete mode 100755 python/scripts/generate_api_ref.sh create mode 100755 python/scripts/generate_sdk_ref.sh create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx rename {api-reference => sdk-reference}/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx (100%) diff --git a/js/api_ref/README.md b/js/api_ref/README.md new file mode 100644 index 00000000..3be08c7e --- /dev/null +++ b/js/api_ref/README.md @@ -0,0 +1,5 @@ +- charts +- consts +- index +- messaging +- sandbox diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx b/js/api_ref/charts.md similarity index 100% rename from api-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx rename to js/api_ref/charts.md diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx b/js/api_ref/consts.md similarity index 100% rename from api-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx rename to js/api_ref/consts.md diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx b/js/api_ref/index.md similarity index 100% rename from api-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx rename to js/api_ref/index.md diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx b/js/api_ref/messaging.md similarity index 100% rename from api-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx rename to js/api_ref/messaging.md diff --git a/api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx b/js/api_ref/sandbox.md similarity index 100% rename from api-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx rename to js/api_ref/sandbox.md diff --git a/js/scripts/CustomMarkdownTheme.js b/js/scripts/CustomMarkdownTheme.js index db55c01d..6046d845 100644 --- a/js/scripts/CustomMarkdownTheme.js +++ b/js/scripts/CustomMarkdownTheme.js @@ -13,7 +13,7 @@ function load(app) { }) } -// this is a hacky way to make methods in the js-sdk api reference look more prominent +// this is a hacky way to make methods in the js-sdk sdk reference look more prominent function convertH5toH3(text) { return text.replace(/^##### (.*)$/gm, '### $1') } diff --git a/js/scripts/generate_api_ref.sh b/js/scripts/generate_api_ref.sh deleted file mode 100755 index e3b8336a..00000000 --- a/js/scripts/generate_api_ref.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the Code Interpreter JS SDK API reference markdown files -# Run it in the `js/` directory - -# generate raw api reference markdown files -npx typedoc - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../api-reference/code-interpreter-js-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -rm -rf api_ref/README.md - -# Flatten the api_ref directory by moving all nested files to the root level and remove empty subdirectories -find api_ref -mindepth 2 -type f | while read -r file; do - mv "$file" api_ref/ -done -find api_ref -type d -empty -delete - -# Transfrom top level MD files into folders of the same name with page.mdx inside -find api_ref -maxdepth 1 -type f -name "*.md" | while read -r file; do - # Extract the filename without extension - filename=$(basename "$file" .md) - # Create the directory of the same name in api_ref - mkdir -p "api_ref/${filename}" - # Move the file inside the newly created directory - mv "$file" "api_ref/${filename}/page.mdx" -done - -cp -r api_ref/* "${ROUTES_DIR}" - -rm -rf api_ref diff --git a/js/scripts/generate_sdk_ref.sh b/js/scripts/generate_sdk_ref.sh new file mode 100755 index 00000000..7a71ce9f --- /dev/null +++ b/js/scripts/generate_sdk_ref.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This script generates the Code Interpreter JS SDK reference markdown files +# Run it in the `js/` directory + +# generate raw sdk reference markdown files +npx typedoc + +PKG_VERSION="v$(node -p "require('./package.json').version")" +ROUTES_DIR="../sdk-reference/code-interpreter-js-sdk/${PKG_VERSION}" +mkdir -p "${ROUTES_DIR}" + +rm -rf sdk_ref/README.md + +# Flatten the sdk_ref directory by moving all nested files to the root level and remove empty subdirectories +find sdk_ref -mindepth 2 -type f | while read -r file; do + mv "$file" sdk_ref/ +done +find sdk_ref -type d -empty -delete + +# Transfrom top level MD files into folders of the same name with page.mdx inside +find sdk_ref -maxdepth 1 -type f -name "*.md" | while read -r file; do + # Extract the filename without extension + filename=$(basename "$file" .md) + # Create the directory of the same name in sdk_ref + mkdir -p "sdk_ref/${filename}" + # Move the file inside the newly created directory + mv "$file" "sdk_ref/${filename}/page.mdx" +done + +cp -r sdk_ref/* "${ROUTES_DIR}" + +rm -rf sdk_ref diff --git a/python/scripts/generate_api_ref.sh b/python/scripts/generate_api_ref.sh deleted file mode 100755 index e3ea6294..00000000 --- a/python/scripts/generate_api_ref.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the python sdk api reference markdown files -# Run it in the `python-sdk/` directory - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../api-reference/code-interpreter-python-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -packages=("e2b_code_interpreter") - -mkdir -p api_ref - -for package in "${packages[@]}"; do - # generate raw api reference markdown file - poetry run pydoc-markdown -p "${package}" >api_ref/"${package}".mdx - # remove package path display - sed -i'' -e '/]*>.*<\/a>/d' "api_ref/${package}.mdx" - # remove empty hyperlinks - sed -i'' -e '/^# /d' "api_ref/${package}.mdx" - # remove " Objects" from lines starting with "##" - sed -i'' -e '/^## / s/ Objects$//' "api_ref/${package}.mdx" - # replace lines starting with "####" with "###" - sed -i'' -e 's/^####/###/' "api_ref/${package}.mdx" - # move to docs - mkdir -p "${ROUTES_DIR}/${package}" - mv "api_ref/${package}.mdx" "${ROUTES_DIR}/${package}/page.mdx" -done - -rm -rf api_ref diff --git a/python/scripts/generate_sdk_ref.sh b/python/scripts/generate_sdk_ref.sh new file mode 100755 index 00000000..0339f215 --- /dev/null +++ b/python/scripts/generate_sdk_ref.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This script generates the python SDK reference markdown files +# Run it in the `python-sdk/` directory + +PKG_VERSION="v$(node -p "require('./package.json').version")" +ROUTES_DIR="../sdk-reference/code-interpreter-python-sdk/${PKG_VERSION}" +mkdir -p "${ROUTES_DIR}" + +packages=("e2b_code_interpreter") + +mkdir -p sdk_ref + +for package in "${packages[@]}"; do + # generate raw SDK reference markdown file + poetry run pydoc-markdown -p "${package}" >sdk_ref/"${package}".mdx + # remove package path display + sed -i'' -e '/]*>.*<\/a>/d' "sdk_ref/${package}.mdx" + # remove empty hyperlinks + sed -i'' -e '/^# /d' "sdk_ref/${package}.mdx" + # remove " Objects" from lines starting with "##" + sed -i'' -e '/^## / s/ Objects$//' "sdk_ref/${package}.mdx" + # replace lines starting with "####" with "###" + sed -i'' -e 's/^####/###/' "sdk_ref/${package}.mdx" + # move to docs + mkdir -p "${ROUTES_DIR}/${package}" + mv "sdk_ref/${package}.mdx" "${ROUTES_DIR}/${package}/page.mdx" +done + +rm -rf sdk_ref diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx new file mode 100644 index 00000000..e816e6d3 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx @@ -0,0 +1,328 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +###### Get Signature + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx similarity index 100% rename from api-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx rename to sdk-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx From c46eba2bb3ef349732b2cfcbb226681e15d731c2 Mon Sep 17 00:00:00 2001 From: 0div Date: Tue, 26 Nov 2024 10:43:37 -0800 Subject: [PATCH 477/722] fix typefoc config out folder --- js/api_ref/README.md | 5 - js/api_ref/charts.md | 240 ----------------------------- js/api_ref/consts.md | 13 -- js/api_ref/index.md | 103 ------------- js/api_ref/messaging.md | 328 ---------------------------------------- js/api_ref/sandbox.md | 312 -------------------------------------- js/typedoc.json | 2 +- 7 files changed, 1 insertion(+), 1002 deletions(-) delete mode 100644 js/api_ref/README.md delete mode 100644 js/api_ref/charts.md delete mode 100644 js/api_ref/consts.md delete mode 100644 js/api_ref/index.md delete mode 100644 js/api_ref/messaging.md delete mode 100644 js/api_ref/sandbox.md diff --git a/js/api_ref/README.md b/js/api_ref/README.md deleted file mode 100644 index 3be08c7e..00000000 --- a/js/api_ref/README.md +++ /dev/null @@ -1,5 +0,0 @@ -- charts -- consts -- index -- messaging -- sandbox diff --git a/js/api_ref/charts.md b/js/api_ref/charts.md deleted file mode 100644 index f3176d3b..00000000 --- a/js/api_ref/charts.md +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/js/api_ref/consts.md b/js/api_ref/consts.md deleted file mode 100644 index d1ee2e76..00000000 --- a/js/api_ref/consts.md +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/js/api_ref/index.md b/js/api_ref/index.md deleted file mode 100644 index dc55fcc7..00000000 --- a/js/api_ref/index.md +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/js/api_ref/messaging.md b/js/api_ref/messaging.md deleted file mode 100644 index e816e6d3..00000000 --- a/js/api_ref/messaging.md +++ /dev/null @@ -1,328 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -###### Get Signature - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/js/api_ref/sandbox.md b/js/api_ref/sandbox.md deleted file mode 100644 index 96eafec5..00000000 --- a/js/api_ref/sandbox.md +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/js/typedoc.json b/js/typedoc.json index c5324596..09eb343a 100644 --- a/js/typedoc.json +++ b/js/typedoc.json @@ -1,5 +1,5 @@ { - "out": "api_ref", + "out": "sdk_ref", "plugin": ["typedoc-plugin-markdown", "./scripts/CustomMarkdownTheme.js"], "exclude": ["**/*.spec.ts"], "entryPoints": [ From 8ea80034814804196878a3bf4573c5c7ff8f137e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 26 Nov 2024 10:59:27 -0800 Subject: [PATCH 478/722] Fix release pipeline --- .changeset/itchy-sheep-tie.md | 5 ----- .changeset/rare-moose-work.md | 5 ----- .github/workflows/release.yml | 10 ++++++++++ 3 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 .changeset/itchy-sheep-tie.md delete mode 100644 .changeset/rare-moose-work.md diff --git a/.changeset/itchy-sheep-tie.md b/.changeset/itchy-sheep-tie.md deleted file mode 100644 index 264252ad..00000000 --- a/.changeset/itchy-sheep-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Serialize numpy types in dicts/lists diff --git a/.changeset/rare-moose-work.md b/.changeset/rare-moose-work.md deleted file mode 100644 index 43993506..00000000 --- a/.changeset/rare-moose-work.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add json formatter for list diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31eb530b..237ebc66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -248,8 +248,18 @@ jobs: name: Release runs-on: ubuntu-latest steps: + - uses: actions/create-github-app-token@v1 + id: app-token + with: + app-id: ${{ vars.VERSION_BUMPER_APPID }} + private-key: ${{ secrets.VERSION_BUMPER_SECRET }} + - name: Checkout Repo uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ steps.app-token.outputs.token }} + - name: Set up Python uses: actions/setup-python@v4 From 43fdc0d924eecaefa5e2f7ddce30f236ca95b206 Mon Sep 17 00:00:00 2001 From: 0div Date: Tue, 26 Nov 2024 16:27:49 -0800 Subject: [PATCH 479/722] fix typos and better naming for python api ref --- js/scripts/generate_sdk_ref.sh | 2 +- python/scripts/generate_sdk_ref.sh | 30 +++++++++---------- .../page.mdx | 0 3 files changed, 15 insertions(+), 17 deletions(-) rename sdk-reference/code-interpreter-python-sdk/v1.0.1/{e2b_code_interpreter => sandbox}/page.mdx (100%) diff --git a/js/scripts/generate_sdk_ref.sh b/js/scripts/generate_sdk_ref.sh index 7a71ce9f..b2bb4c34 100755 --- a/js/scripts/generate_sdk_ref.sh +++ b/js/scripts/generate_sdk_ref.sh @@ -5,7 +5,7 @@ set -euo pipefail # This script generates the Code Interpreter JS SDK reference markdown files # Run it in the `js/` directory -# generate raw sdk reference markdown files +# generate raw SDK reference markdown files npx typedoc PKG_VERSION="v$(node -p "require('./package.json').version")" diff --git a/python/scripts/generate_sdk_ref.sh b/python/scripts/generate_sdk_ref.sh index 0339f215..0b13951a 100755 --- a/python/scripts/generate_sdk_ref.sh +++ b/python/scripts/generate_sdk_ref.sh @@ -9,24 +9,22 @@ PKG_VERSION="v$(node -p "require('./package.json').version")" ROUTES_DIR="../sdk-reference/code-interpreter-python-sdk/${PKG_VERSION}" mkdir -p "${ROUTES_DIR}" -packages=("e2b_code_interpreter") +package="e2b_code_interpreter" mkdir -p sdk_ref -for package in "${packages[@]}"; do - # generate raw SDK reference markdown file - poetry run pydoc-markdown -p "${package}" >sdk_ref/"${package}".mdx - # remove package path display - sed -i'' -e '/]*>.*<\/a>/d' "sdk_ref/${package}.mdx" - # remove empty hyperlinks - sed -i'' -e '/^# /d' "sdk_ref/${package}.mdx" - # remove " Objects" from lines starting with "##" - sed -i'' -e '/^## / s/ Objects$//' "sdk_ref/${package}.mdx" - # replace lines starting with "####" with "###" - sed -i'' -e 's/^####/###/' "sdk_ref/${package}.mdx" - # move to docs - mkdir -p "${ROUTES_DIR}/${package}" - mv "sdk_ref/${package}.mdx" "${ROUTES_DIR}/${package}/page.mdx" -done +# generate raw SDK reference markdown file +poetry run pydoc-markdown -p "${package}" >sdk_ref/"${package}".mdx +# remove package path display +sed -i'' -e '/]*>.*<\/a>/d' "sdk_ref/${package}.mdx" +# remove empty hyperlinks +sed -i'' -e '/^# /d' "sdk_ref/${package}.mdx" +# remove " Objects" from lines starting with "##" +sed -i'' -e '/^## / s/ Objects$//' "sdk_ref/${package}.mdx" +# replace lines starting with "####" with "###" +sed -i'' -e 's/^####/###/' "sdk_ref/${package}.mdx" +# move to docs +mkdir -p "${ROUTES_DIR}/sandbox" +mv "sdk_ref/${package}.mdx" "${ROUTES_DIR}/sandbox/page.mdx" rm -rf sdk_ref diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx similarity index 100% rename from sdk-reference/code-interpreter-python-sdk/v1.0.1/e2b_code_interpreter/page.mdx rename to sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx From b1c2c3a67d729a3af8fd5c780027196a10a3376b Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 11:32:15 -0800 Subject: [PATCH 480/722] add sdk autogen workflow and make it a part of the release workflow --- .github/scripts/is_new_sdk_ref.sh | 11 +++ .github/workflows/generate_sdk_ref.yml | 106 +++++++++++++++++++++++++ .github/workflows/release.yml | 24 ++++++ 3 files changed, 141 insertions(+) create mode 100755 .github/scripts/is_new_sdk_ref.sh create mode 100644 .github/workflows/generate_sdk_ref.yml diff --git a/.github/scripts/is_new_sdk_ref.sh b/.github/scripts/is_new_sdk_ref.sh new file mode 100755 index 00000000..70685851 --- /dev/null +++ b/.github/scripts/is_new_sdk_ref.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This script checks for diffs in the js/ and python/ directory. +# If there are diffs, it means we need to generate new SDK references. +if git diff --name-only HEAD^ | grep -q '^js/\|^python/'; then + echo "true" +else + echo "false" +fi diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml new file mode 100644 index 00000000..3173faf8 --- /dev/null +++ b/.github/workflows/generate_sdk_ref.yml @@ -0,0 +1,106 @@ +name: Generate SDK references + +on: + workflow_dispatch: + workflow_call: + # Remove after testing + push: + branches: + - improved-api-refs + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +permissions: + contents: write + +jobs: + is_new_sdk_ref: + name: Is new SDK reference? + runs-on: ubuntu-latest + outputs: + new_sdk_ref: ${{ steps.sdk-changes.outputs.new_sdk_ref }} + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Check if SDK changes + id: sdk-changes + run: | + IS_NEW_sdk_REF=$(./.github/scripts/is_new_sdk_ref.sh) + echo "new_sdk_ref=$IS_NEW_sdk_REF" >> "$GITHUB_OUTPUT" + + sdk-changes: + name: SDK changes + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install + with: + version: 9.5 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "20.x" + registry-url: "https://registry.npmjs.org" + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Set up Python + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: "3.8" + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install dependencies + working-directory: ./packages/python-sdk + run: poetry install --no-interaction --no-root + + - name: Generate Python SDK reference + id: python-sdk-ref + working-directory: ./python + run: | + source .venv/bin/activate + ./scripts/generate_sdk_ref.sh + + - name: Generate JS SDK reference + id: js-sdk-ref + working-directory: ./js + run: ./scripts/generate_sdk_ref.sh + + - name: Show docs file structure + run: tree apps/web/src/app/\(docs\)/docs/sdk-reference + + - name: Commit new SDK reference versions + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add ./sdk-reference + git commit -m "[skip ci] Release new SDK reference doc versions" || exit 0 + git push \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 237ebc66..2c228527 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -319,6 +319,30 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + is_new_sdk_ref: + name: Is new SDK reference? + runs-on: ubuntu-latest + outputs: + new_sdk_ref: ${{ steps.sdk-changes.outputs.new_sdk_ref }} + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Check if SDK changes + id: sdk-changes + run: | + IS_NEW_SDK_REF=$(./.github/scripts/is_new_sdk_ref.sh) + echo "new_sdk_ref=$IS_NEW_SDK_REF" >> "$GITHUB_OUTPUT" + + generate_sdk_ref: + name: Generate SDK reference + needs: [is_release, python-tests, js-tests, is_new_sdk_ref] + if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' && needs.is_new_sdk_ref.outputs.new_sdk_ref == 'true' + uses: ./.github/workflows/generate_sdk_ref.yml + secrets: inherit + report-failure: needs: [python-tests, js-tests, release] if: failure() From f3b08b6039e1adba1d827927e95afaea008ed356 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 11:33:27 -0800 Subject: [PATCH 481/722] trigger workflow on feature branch push --- .github/workflows/generate_sdk_ref.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml index 3173faf8..381d4b83 100644 --- a/.github/workflows/generate_sdk_ref.yml +++ b/.github/workflows/generate_sdk_ref.yml @@ -6,7 +6,7 @@ on: # Remove after testing push: branches: - - improved-api-refs + - generate-api-reference-for-code-interpreter-sdk-e2b-1235 concurrency: ${{ github.workflow }}-${{ github.ref }} From 7177fc4821db5a40a5b3df40b7fc20ef9bde8169 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 12:27:56 -0800 Subject: [PATCH 482/722] fix python path in install step --- .github/workflows/generate_sdk_ref.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml index 381d4b83..5d053ba5 100644 --- a/.github/workflows/generate_sdk_ref.yml +++ b/.github/workflows/generate_sdk_ref.yml @@ -77,7 +77,7 @@ jobs: installer-parallel: true - name: Install dependencies - working-directory: ./packages/python-sdk + working-directory: ./python run: poetry install --no-interaction --no-root - name: Generate Python SDK reference From 30a03358eab29aad0d234bf03f4759ed225a27ab Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 12:29:34 -0800 Subject: [PATCH 483/722] fix path in show docs step --- .github/workflows/generate_sdk_ref.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml index 5d053ba5..afc38eb8 100644 --- a/.github/workflows/generate_sdk_ref.yml +++ b/.github/workflows/generate_sdk_ref.yml @@ -93,7 +93,7 @@ jobs: run: ./scripts/generate_sdk_ref.sh - name: Show docs file structure - run: tree apps/web/src/app/\(docs\)/docs/sdk-reference + run: tree ./sdk-reference - name: Commit new SDK reference versions env: From 9c6f448ddc89c717f4c3bb1e7f19afa2bf81f4f6 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 12:29:56 -0800 Subject: [PATCH 484/722] fix path in show docs step --- .github/workflows/generate_sdk_ref.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml index afc38eb8..9b83e9aa 100644 --- a/.github/workflows/generate_sdk_ref.yml +++ b/.github/workflows/generate_sdk_ref.yml @@ -102,5 +102,5 @@ jobs: git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add ./sdk-reference - git commit -m "[skip ci] Release new SDK reference doc versions" || exit 0 + git commit -m "[skip ci] Release new Code Interpreter Python and JS SDK references doc versions" || exit 0 git push \ No newline at end of file From 1cc5b853c392d531547d71cc4d26ebb288ca59f4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 27 Nov 2024 20:30:39 +0000 Subject: [PATCH 485/722] [skip ci] Release new Code Interpreter Python and JS SDK references doc versions --- .../v1.0.1/sandbox/page.mdx | 398 +++++++++--------- 1 file changed, 199 insertions(+), 199 deletions(-) diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx index 325b8e18..724afcfc 100644 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx @@ -3,6 +3,35 @@ +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + ## AsyncSandbox ```python @@ -169,6 +198,176 @@ Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + ## OutputMessage ```python @@ -521,202 +720,3 @@ The language of the context. The working directory of the context. - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - From 4f8bb9e35d54f9d3797acd6cf9e11643852ebb95 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 12:51:41 -0800 Subject: [PATCH 486/722] remove dredundant pkg diff step --- .github/workflows/release.yml | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c228527..d33f4d2b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -319,27 +319,10 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - is_new_sdk_ref: - name: Is new SDK reference? - runs-on: ubuntu-latest - outputs: - new_sdk_ref: ${{ steps.sdk-changes.outputs.new_sdk_ref }} - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - - name: Check if SDK changes - id: sdk-changes - run: | - IS_NEW_SDK_REF=$(./.github/scripts/is_new_sdk_ref.sh) - echo "new_sdk_ref=$IS_NEW_SDK_REF" >> "$GITHUB_OUTPUT" - generate_sdk_ref: name: Generate SDK reference - needs: [is_release, python-tests, js-tests, is_new_sdk_ref] - if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' && needs.is_new_sdk_ref.outputs.new_sdk_ref == 'true' + needs: [is_release, python-tests, js-tests] + if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' uses: ./.github/workflows/generate_sdk_ref.yml secrets: inherit From ccfcd33588f2b0bf001cb2bee4072ade47fc031b Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 14:45:33 -0800 Subject: [PATCH 487/722] make black and pydoc-markdown dev-deps --- python/poetry.lock | 2 +- python/pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 79d78c51..5664bbae 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1137,4 +1137,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "4153cb42716828cb9b2f447c7710126ba2046435e17648c56e54d9610356b83b" +content-hash = "e2f03261602ed622d815addae04e5b506463051720f6ca682834a624f577d705" diff --git a/python/pyproject.toml b/python/pyproject.toml index f9e49096..e0378f08 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -15,8 +15,6 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" e2b = "^1.0.0" -black = "23.12.1" -pydoc-markdown = "^4.8.2" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" @@ -24,6 +22,8 @@ python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pytest-asyncio = "^0.23.7" pytest-xdist = "^3.6.1" +black = "23.12.1" +pydoc-markdown = "^4.8.2" [build-system] requires = ["poetry-core"] From 6022f33d774ea1299432b1f604ad9e0ff73d7b14 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 15:10:47 -0800 Subject: [PATCH 488/722] include generate sdk workflow inside release workflow, make pnpm recursive work and change version --- .changeset/stale-turtles-repeat.md | 5 + .github/workflows/generate_sdk_ref.yml | 106 ----- .github/workflows/release.yml | 12 +- js/package.json | 4 +- package.json | 2 +- python/package.json | 6 +- python/poetry.lock | 14 +- python/pyproject.toml | 2 +- .../v1.0.1/sandbox/page.mdx | 398 +++++++++--------- 9 files changed, 231 insertions(+), 318 deletions(-) create mode 100644 .changeset/stale-turtles-repeat.md delete mode 100644 .github/workflows/generate_sdk_ref.yml diff --git a/.changeset/stale-turtles-repeat.md b/.changeset/stale-turtles-repeat.md new file mode 100644 index 00000000..52a93381 --- /dev/null +++ b/.changeset/stale-turtles-repeat.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +bump e2b package diff --git a/.github/workflows/generate_sdk_ref.yml b/.github/workflows/generate_sdk_ref.yml deleted file mode 100644 index 9b83e9aa..00000000 --- a/.github/workflows/generate_sdk_ref.yml +++ /dev/null @@ -1,106 +0,0 @@ -name: Generate SDK references - -on: - workflow_dispatch: - workflow_call: - # Remove after testing - push: - branches: - - generate-api-reference-for-code-interpreter-sdk-e2b-1235 - -concurrency: ${{ github.workflow }}-${{ github.ref }} - -permissions: - contents: write - -jobs: - is_new_sdk_ref: - name: Is new SDK reference? - runs-on: ubuntu-latest - outputs: - new_sdk_ref: ${{ steps.sdk-changes.outputs.new_sdk_ref }} - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - - name: Check if SDK changes - id: sdk-changes - run: | - IS_NEW_sdk_REF=$(./.github/scripts/is_new_sdk_ref.sh) - echo "new_sdk_ref=$IS_NEW_sdk_REF" >> "$GITHUB_OUTPUT" - - sdk-changes: - name: SDK changes - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Install pnpm - uses: pnpm/action-setup@v3 - id: pnpm-install - with: - version: 9.5 - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: "20.x" - registry-url: "https://registry.npmjs.org" - cache: pnpm - cache-dependency-path: pnpm-lock.yaml - - - name: Configure pnpm - run: | - pnpm config set auto-install-peers true - pnpm config set exclude-links-from-lockfile true - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Set up Python - id: setup-python - uses: actions/setup-python@v5 - with: - python-version: "3.8" - - - name: Install and configure Poetry - uses: snok/install-poetry@v1 - with: - version: 1.5.1 - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - - - name: Install dependencies - working-directory: ./python - run: poetry install --no-interaction --no-root - - - name: Generate Python SDK reference - id: python-sdk-ref - working-directory: ./python - run: | - source .venv/bin/activate - ./scripts/generate_sdk_ref.sh - - - name: Generate JS SDK reference - id: js-sdk-ref - working-directory: ./js - run: ./scripts/generate_sdk_ref.sh - - - name: Show docs file structure - run: tree ./sdk-reference - - - name: Commit new SDK reference versions - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add ./sdk-reference - git commit -m "[skip ci] Release new Code Interpreter Python and JS SDK references doc versions" || exit 0 - git push \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d33f4d2b..b79d61ec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,8 @@ on: push: branches: - main + # Remove after testing + - generate-api-reference-for-code-interpreter-sdk-e2b-1235 concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -296,6 +298,13 @@ jobs: run: pnpm run version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate SDK reference + id: sdk-ref + run: pnpm run --recursive generate-ref + + - name: Show docs file structure + run: tree ./sdk-reference - name: Release new versions uses: changesets/action@v1 @@ -313,7 +322,8 @@ jobs: - name: Commit new versions run: | git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add ./sdk-reference git commit -am "[skip ci] Release new versions" || exit 0 git push env: diff --git a/js/package.json b/js/package.json index 025fbe60..1cfed68a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,7 @@ { "name": "@e2b/code-interpreter", "version": "1.0.4", + "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -32,7 +33,8 @@ "update-deps": "ncu -u && pnpm i", "example": "npx tsx example.mts", "test:bun": "bun test tests/runtimes/bun --env-file=.env", - "test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks" + "test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks", + "generate-ref": "./scripts/generate_sdk_ref.sh" }, "devDependencies": { "@types/node": "^18.18.6", diff --git a/package.json b/package.json index 8a5108bd..5011dd37 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,6 @@ "changeset": "^0.2.6" }, "engines": { - "pnpm": ">=9.0.0 <10" + "pnpm": ">=9.0.0 <10" } } diff --git a/python/package.json b/python/package.json index eefb7dc7..0747565d 100644 --- a/python/package.json +++ b/python/package.json @@ -2,12 +2,14 @@ "name": "@e2b/code-interpreter-python", "private": true, "version": "1.0.1", + "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", "async-example": "poetry run python3 async_example.py", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", - "pretest": "poetry install" + "pretest": "poetry install", + "generate-ref": "poetry install && ./scripts/generate_api_ref.sh" } -} \ No newline at end of file +} diff --git a/python/poetry.lock b/python/poetry.lock index 5664bbae..ec70635a 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -348,23 +348,23 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.0.0" +version = "1.0.4" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-1.0.0-py3-none-any.whl", hash = "sha256:25815ce38781a5e3a0fb8d7249dfd3de2c8542434bf4e6b0b963cbd79bb46546"}, - {file = "e2b-1.0.0.tar.gz", hash = "sha256:c60af575d96ab0fef463f8ba59f721589857bbeadf856c9cc4359d1047d305d8"}, + {file = "e2b-1.0.4-py3-none-any.whl", hash = "sha256:1a9c765eb1b2cc291c5ebd3f2e268f8fba9471a12f470f4651395b5753730170"}, + {file = "e2b-1.0.4.tar.gz", hash = "sha256:5ed3db4f984e52cf3aabb717725493ff060a8374b7c878b31bceeff46a0b5648"}, ] [package.dependencies] -attrs = ">=23.2.0,<24.0.0" +attrs = ">=23.2.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<0.28.0" -packaging = ">=24.1,<25.0" +packaging = ">=24.1" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" -typing-extensions = ">=4.12.2,<5.0.0" +typing-extensions = ">=4.1.0" [[package]] name = "exceptiongroup" @@ -1137,4 +1137,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e2f03261602ed622d815addae04e5b506463051720f6ca682834a624f577d705" +content-hash = "c5bd69ecb54e2f92533254d100ad6e739fd8ced2be876a2fc510e5dd44e8a150" diff --git a/python/pyproject.toml b/python/pyproject.toml index e0378f08..cc713d8b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.8" httpx = ">=0.20.0,<0.28.0" attrs = ">=21.3.0" -e2b = "^1.0.0" +e2b = "^1.0.4" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx index 724afcfc..325b8e18 100644 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx @@ -3,35 +3,6 @@ -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - ## AsyncSandbox ```python @@ -198,176 +169,6 @@ Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - ## OutputMessage ```python @@ -720,3 +521,202 @@ The language of the context. The working directory of the context. + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + From cdb01f265f384e3de4a12780b32a126320710cdf Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 15:12:50 -0800 Subject: [PATCH 489/722] remove sdk gen workflow call from release --- .github/workflows/release.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b79d61ec..98680b11 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -329,13 +329,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - generate_sdk_ref: - name: Generate SDK reference - needs: [is_release, python-tests, js-tests] - if: (!cancelled()) && !contains(needs.*.result, 'failure') && needs.is_release.outputs.release == 'true' - uses: ./.github/workflows/generate_sdk_ref.yml - secrets: inherit - report-failure: needs: [python-tests, js-tests, release] if: failure() From 1fcacd9fd776c7d2663c4a3418857e29aa9316c7 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 15:36:06 -0800 Subject: [PATCH 490/722] fix python package.json generate ref command --- python/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/package.json b/python/package.json index 0747565d..c4643e2e 100644 --- a/python/package.json +++ b/python/package.json @@ -10,6 +10,6 @@ "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install", - "generate-ref": "poetry install && ./scripts/generate_api_ref.sh" + "generate-ref": "poetry install && ./scripts/generate_sdk_ref.sh" } } From 7b172d85dbee8736c93ee4aafc08ea758c5fac1b Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 15:37:44 -0800 Subject: [PATCH 491/722] temporarily disable docker and template build for workflow testing purposes --- .github/workflows/release.yml | 132 +++++++++++++++++----------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 98680b11..d8e83d7d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -156,74 +156,74 @@ jobs: run: | echo "::set-output name=version::$(pnpm pkg get version --workspaces=false | tr -d \\\")" - build-docker-image: - name: Build Docker Image - runs-on: ubuntu-latest - needs: [changes, charts-release] - if: always() && - !contains(needs.*.result, 'failure') && - !contains(needs.*.result, 'cancelled') && - (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set package version - working-directory: ./template - run: | - if [ -z "${{ needs.charts-release.outputs.version }}" ]; then - VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) - else - VERSION=${{ needs.charts-release.outputs.version }} - fi - echo "Version: $VERSION" - - sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - - - name: Build Docker image - uses: docker/build-push-action@v6 - with: - context: ./template - push: true - platforms: linux/amd64 - tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest - - build-template: - name: Build E2B template - runs-on: ubuntu-latest - needs: [build-docker-image] - if: always() && - !contains(needs.*.result, 'failure') && - !contains(needs.*.result, 'cancelled') && - needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Install E2B CLI - run: npm install -g @e2b/cli - - - name: Build e2b - run: e2b template build - working-directory: ./template - env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} + #build-docker-image: + # name: Build Docker Image + # runs-on: ubuntu-latest + # needs: [changes, charts-release] + # if: always() && + # !contains(needs.*.result, 'failure') && + # !contains(needs.*.result, 'cancelled') && + # (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') + # steps: + # - name: Checkout repository + # uses: actions/checkout@v3 + # with: + # fetch-depth: 0 + + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@v3 + + # - name: Log in to DockerHub + # uses: docker/login-action@v3 + # with: + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_TOKEN }} + + # - name: Set package version + # working-directory: ./template + # run: | + # if [ -z "${{ needs.charts-release.outputs.version }}" ]; then + # VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) + # else + # VERSION=${{ needs.charts-release.outputs.version }} + # fi + # echo "Version: $VERSION" + + # sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt + + # - name: Build Docker image + # uses: docker/build-push-action@v6 + # with: + # context: ./template + # push: true + # platforms: linux/amd64 + # tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest + + #build-template: + # name: Build E2B template + # runs-on: ubuntu-latest + # needs: [build-docker-image] + # if: always() && + # !contains(needs.*.result, 'failure') && + # !contains(needs.*.result, 'cancelled') && + # needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + # steps: + # - name: Checkout repository + # uses: actions/checkout@v3 + # with: + # fetch-depth: 0 + # - name: Install E2B CLI + # run: npm install -g @e2b/cli + + # - name: Build e2b + # run: e2b template build + # working-directory: ./template + # env: + # E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} python-tests: name: Python Tests - needs: [changes, build-template] + needs: [changes] #, build-template] if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && @@ -233,7 +233,7 @@ jobs: js-tests: name: JS Tests - needs: [changes, build-template] + needs: [changes] #, build-template] if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && From 494c5b49f1d787fe3405aa824a42afb62049f9a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 27 Nov 2024 23:40:54 +0000 Subject: [PATCH 492/722] [skip ci] Release new versions --- .changeset/stale-turtles-repeat.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.0.2/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/stale-turtles-repeat.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx diff --git a/.changeset/stale-turtles-repeat.md b/.changeset/stale-turtles-repeat.md deleted file mode 100644 index 52a93381..00000000 --- a/.changeset/stale-turtles-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -bump e2b package diff --git a/python/package.json b/python/package.json index c4643e2e..f7fd8101 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.1", + "version": "1.0.2", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index cc713d8b..fbbc769b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.1" +version = "1.0.2" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx new file mode 100644 index 00000000..724afcfc --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 41b157d23de7b282b56214a882949842b29c9abb Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 27 Nov 2024 15:47:33 -0800 Subject: [PATCH 493/722] remove temp changes to test release workflow --- .github/workflows/release.yml | 134 +++++++++++++++++----------------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d8e83d7d..a02a93d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,8 +4,6 @@ on: push: branches: - main - # Remove after testing - - generate-api-reference-for-code-interpreter-sdk-e2b-1235 concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -156,74 +154,74 @@ jobs: run: | echo "::set-output name=version::$(pnpm pkg get version --workspaces=false | tr -d \\\")" - #build-docker-image: - # name: Build Docker Image - # runs-on: ubuntu-latest - # needs: [changes, charts-release] - # if: always() && - # !contains(needs.*.result, 'failure') && - # !contains(needs.*.result, 'cancelled') && - # (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') - # steps: - # - name: Checkout repository - # uses: actions/checkout@v3 - # with: - # fetch-depth: 0 - - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v3 - - # - name: Log in to DockerHub - # uses: docker/login-action@v3 - # with: - # username: ${{ secrets.DOCKERHUB_USERNAME }} - # password: ${{ secrets.DOCKERHUB_TOKEN }} - - # - name: Set package version - # working-directory: ./template - # run: | - # if [ -z "${{ needs.charts-release.outputs.version }}" ]; then - # VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) - # else - # VERSION=${{ needs.charts-release.outputs.version }} - # fi - # echo "Version: $VERSION" - - # sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - - # - name: Build Docker image - # uses: docker/build-push-action@v6 - # with: - # context: ./template - # push: true - # platforms: linux/amd64 - # tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest - - #build-template: - # name: Build E2B template - # runs-on: ubuntu-latest - # needs: [build-docker-image] - # if: always() && - # !contains(needs.*.result, 'failure') && - # !contains(needs.*.result, 'cancelled') && - # needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' - # steps: - # - name: Checkout repository - # uses: actions/checkout@v3 - # with: - # fetch-depth: 0 - # - name: Install E2B CLI - # run: npm install -g @e2b/cli - - # - name: Build e2b - # run: e2b template build - # working-directory: ./template - # env: - # E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} + build-docker-image: + name: Build Docker Image + runs-on: ubuntu-latest + needs: [changes, charts-release] + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set package version + working-directory: ./template + run: | + if [ -z "${{ needs.charts-release.outputs.version }}" ]; then + VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) + else + VERSION=${{ needs.charts-release.outputs.version }} + fi + echo "Version: $VERSION" + + sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt + + - name: Build Docker image + uses: docker/build-push-action@v6 + with: + context: ./template + push: true + platforms: linux/amd64 + tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest + + build-template: + name: Build E2B template + runs-on: ubuntu-latest + needs: [build-docker-image] + if: always() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Install E2B CLI + run: npm install -g @e2b/cli + + - name: Build e2b + run: e2b template build + working-directory: ./template + env: + E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} python-tests: name: Python Tests - needs: [changes] #, build-template] + needs: [changes, build-template] if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && @@ -233,7 +231,7 @@ jobs: js-tests: name: JS Tests - needs: [changes] #, build-template] + needs: [changes, build-template] if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && From a154d0a2cab1bfb353e6f953986dc77a7f625eca Mon Sep 17 00:00:00 2001 From: 0div <98087403+0div@users.noreply.github.com> Date: Thu, 28 Nov 2024 00:49:37 +0100 Subject: [PATCH 494/722] Update .github/workflows/release.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Novák --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a02a93d3..2a08d84a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -320,7 +320,7 @@ jobs: - name: Commit new versions run: | git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" + git config user.email "github-actions[bot]@users.noreply.github.com" git add ./sdk-reference git commit -am "[skip ci] Release new versions" || exit 0 git push From 9604b9077a390720ae552cc53e2a6c736c16d1d3 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Dec 2024 20:23:14 -0800 Subject: [PATCH 495/722] Update httpx package --- .changeset/pretty-rats-peel.md | 5 +++++ python/poetry.lock | 4 ++-- python/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/pretty-rats-peel.md diff --git a/.changeset/pretty-rats-peel.md b/.changeset/pretty-rats-peel.md new file mode 100644 index 00000000..92bed55d --- /dev/null +++ b/.changeset/pretty-rats-peel.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Update httpx version diff --git a/python/poetry.lock b/python/poetry.lock index ec70635a..a51d38e7 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "anyio" @@ -1137,4 +1137,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "c5bd69ecb54e2f92533254d100ad6e739fd8ced2be876a2fc510e5dd44e8a150" +content-hash = "955ef39aa20e83c5efc82825bf120fbb1fbf87b8db4645cabb8f6241b37d862b" diff --git a/python/pyproject.toml b/python/pyproject.toml index fbbc769b..10c4ddb7 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,7 @@ packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] python = "^3.8" -httpx = ">=0.20.0,<0.28.0" +httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" e2b = "^1.0.4" From ad5a204a9f558227c32f5824cc042d127abaeb2d Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Dec 2024 20:54:17 -0800 Subject: [PATCH 496/722] Trigger release --- python/e2b_code_interpreter/charts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/e2b_code_interpreter/charts.py b/python/e2b_code_interpreter/charts.py index 0fe32efb..d20878fa 100644 --- a/python/e2b_code_interpreter/charts.py +++ b/python/e2b_code_interpreter/charts.py @@ -1,5 +1,5 @@ import enum -from typing import List, Tuple, Any, Optional, Union +from typing import Any, List, Tuple, Optional, Union class ChartType(str, enum.Enum): From b82de3e90720c9838eb2bf827369f07421a2b32a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 5 Dec 2024 23:54:11 -0800 Subject: [PATCH 497/722] Skip env vars test for now --- python/tests/async/test_async_env_vars.py | 63 ++++++++++++----------- python/tests/sync/test_env_vars.py | 55 ++++++++++---------- 2 files changed, 60 insertions(+), 58 deletions(-) diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py index 84508bc9..e9ed59c8 100644 --- a/python/tests/async/test_async_env_vars.py +++ b/python/tests/async/test_async_env_vars.py @@ -3,14 +3,14 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -@pytest.mark.skip_debug() -async def test_env_vars_sandbox(): - sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) - try: - result = await sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - finally: - await sbx.kill() +# @pytest.mark.skip_debug() +# async def test_env_vars_sandbox(): +# sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) +# try: +# result = await sbx.run_code("import os; os.getenv('FOO')") +# assert result.text == "bar" +# finally: +# await sbx.kill() async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): @@ -20,26 +20,27 @@ async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): assert result.text == "bar" -async def test_env_vars_override(debug: bool): - sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) - - try: - await sbx.run_code( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" - ) - result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) - assert result.text == "baz" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") - assert result.text == "async_python_runtime" - - if not debug: - result = await sbx.run_code("import os; os.getenv('SBX')") - assert result.text == "value" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = await sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - finally: - await sbx.kill() +# +# async def test_env_vars_override(debug: bool): +# sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) +# +# try: +# await sbx.run_code( +# "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" +# ) +# result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) +# assert result.text == "baz" +# +# # This can fail if running in debug mode (there's a race condition with the restart kernel test) +# result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") +# assert result.text == "async_python_runtime" +# +# if not debug: +# result = await sbx.run_code("import os; os.getenv('SBX')") +# assert result.text == "value" +# +# # This can fail if running in debug mode (there's a race condition with the restart kernel test) +# result = await sbx.run_code("import os; os.getenv('FOO')") +# assert result.text == "bar" +# finally: +# await sbx.kill() diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py index 4d56b681..13f87a7b 100644 --- a/python/tests/sync/test_env_vars.py +++ b/python/tests/sync/test_env_vars.py @@ -3,12 +3,12 @@ from e2b_code_interpreter.code_interpreter_sync import Sandbox -@pytest.mark.skip_debug() -async def test_env_vars_sandbox(): - sbx = Sandbox(envs={"FOO": "bar"}) - result = sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - sbx.kill() +# @pytest.mark.skip_debug() +# async def test_env_vars_sandbox(): +# sbx = Sandbox(envs={"FOO": "bar"}) +# result = sbx.run_code("import os; os.getenv('FOO')") +# assert result.text == "bar" +# sbx.kill() async def test_env_vars_in_run_code(sandbox: Sandbox): @@ -16,24 +16,25 @@ async def test_env_vars_in_run_code(sandbox: Sandbox): assert result.text == "bar" -async def test_env_vars_override(debug: bool): - sbx = Sandbox(envs={"FOO": "bar", "SBX": "value"}) - sbx.run_code( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" - ) - result = sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) - assert result.text == "baz" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = sbx.run_code("import os; os.getenv('RUNTIME_ENV')") - assert result.text == "python_runtime" - - if not debug: - result = sbx.run_code("import os; os.getenv('SBX')") - assert result.text == "value" - - # This can fail if running in debug mode (there's a race condition with the restart kernel test) - result = sbx.run_code("import os; os.getenv('FOO')") - assert result.text == "bar" - - sbx.kill() +# +# async def test_env_vars_override(debug: bool): +# sbx = Sandbox(envs={"FOO": "bar", "SBX": "value"}) +# sbx.run_code( +# "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" +# ) +# result = sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) +# assert result.text == "baz" +# +# # This can fail if running in debug mode (there's a race condition with the restart kernel test) +# result = sbx.run_code("import os; os.getenv('RUNTIME_ENV')") +# assert result.text == "python_runtime" +# +# if not debug: +# result = sbx.run_code("import os; os.getenv('SBX')") +# assert result.text == "value" +# +# # This can fail if running in debug mode (there's a race condition with the restart kernel test) +# result = sbx.run_code("import os; os.getenv('FOO')") +# assert result.text == "bar" +# +# sbx.kill() From 8ced45b0243e9ba4666a47c107f5c4a7199b605c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 6 Dec 2024 18:25:31 +0000 Subject: [PATCH 498/722] [skip ci] Release new versions --- .changeset/pretty-rats-peel.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.0.3/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/pretty-rats-peel.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx diff --git a/.changeset/pretty-rats-peel.md b/.changeset/pretty-rats-peel.md deleted file mode 100644 index 92bed55d..00000000 --- a/.changeset/pretty-rats-peel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Update httpx version diff --git a/python/package.json b/python/package.json index f7fd8101..6dc096b9 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.2", + "version": "1.0.3", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 10c4ddb7..edc7ed57 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.2" +version = "1.0.3" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx new file mode 100644 index 00000000..724afcfc --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 664223105d7d0c37eafa57d128ab24e385f4dd7f Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 Jan 2025 16:21:27 +0100 Subject: [PATCH 499/722] Fix issue with parsing pandas.Timestamp --- .changeset/itchy-ducks-breathe.md | 5 +++++ template/startup_scripts/0002_data.py | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/itchy-ducks-breathe.md diff --git a/.changeset/itchy-ducks-breathe.md b/.changeset/itchy-ducks-breathe.md new file mode 100644 index 00000000..8820cbd4 --- /dev/null +++ b/.changeset/itchy-ducks-breathe.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Fix timestamp issue diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index a8383c7d..52168f95 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -20,7 +20,13 @@ def _figure_repr_e2b_chart_(self: Figure): def _dataframe_repr_e2b_data_(self: pandas.DataFrame): - return orjson.loads(orjson.dumps(self.to_dict(orient="list"))) + result = self.to_dict(orient="list") + for key, value in result.items(): + # Check each column's values + result[key] = [ + v.isoformat() if isinstance(v, pandas.Timestamp) else v for v in value + ] + return result class E2BDataFormatter(BaseFormatter): From 7fc0b8fd134f3131757b1d180b3e2adbd43892a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 9 Jan 2025 15:44:47 +0000 Subject: [PATCH 500/722] [skip ci] Release new versions --- .changeset/itchy-ducks-breathe.md | 5 -- .../v1.0.3/sandbox/page.mdx | 62 +++++++++---------- template/package.json | 2 +- 3 files changed, 32 insertions(+), 37 deletions(-) delete mode 100644 .changeset/itchy-ducks-breathe.md diff --git a/.changeset/itchy-ducks-breathe.md b/.changeset/itchy-ducks-breathe.md deleted file mode 100644 index 8820cbd4..00000000 --- a/.changeset/itchy-ducks-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Fix timestamp issue diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx index 724afcfc..b7323614 100644 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx @@ -3,33 +3,6 @@ -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - ## AsyncSandbox @@ -198,10 +171,6 @@ Context object - - - - ## Sandbox ```python @@ -368,6 +337,37 @@ Context object + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + ## OutputMessage ```python diff --git a/template/package.json b/template/package.json index 44b70172..cf714cf2 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.3" + "version": "0.0.4" } From 5217ee548cea9f997d8301726fa326d8d4a7c146 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 9 Jan 2025 18:52:15 +0100 Subject: [PATCH 501/722] Add support for Chinese and configure font settings --- .changeset/afraid-wolves-return.md | 5 +++++ .changeset/pretty-rats-peel.md | 5 ----- template/Dockerfile | 5 ++++- template/matplotlibrc | 1 + template/test.Dockerfile | 5 ++++- 5 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 .changeset/afraid-wolves-return.md delete mode 100644 .changeset/pretty-rats-peel.md create mode 100644 template/matplotlibrc diff --git a/.changeset/afraid-wolves-return.md b/.changeset/afraid-wolves-return.md new file mode 100644 index 00000000..14b6fb0d --- /dev/null +++ b/.changeset/afraid-wolves-return.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add support for Chinese diff --git a/.changeset/pretty-rats-peel.md b/.changeset/pretty-rats-peel.md deleted file mode 100644 index 92bed55d..00000000 --- a/.changeset/pretty-rats-peel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Update httpx version diff --git a/template/Dockerfile b/template/Dockerfile index 5a2e1af3..37841db2 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -4,7 +4,7 @@ ENV JAVA_HOME=/opt/java/openjdk ENV PATH="${JAVA_HOME}/bin:${PATH}" RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo nodejs npm + build-essential curl git util-linux jq sudo nodejs npm fonts-noto-cjk ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -46,6 +46,9 @@ COPY ./server/requirements.txt $SERVER_PATH RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt COPY ./server $SERVER_PATH +# Copy matplotlibrc +COPY matplotlibrc /root/.config/matplotlib/.matplotlibrc + # Copy Jupyter configuration COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/matplotlibrc b/template/matplotlibrc new file mode 100644 index 00000000..b71d01f3 --- /dev/null +++ b/template/matplotlibrc @@ -0,0 +1 @@ +font.family: sans-serif, Noto Sans CJK JP diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 6dea866f..f3647911 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -5,7 +5,7 @@ COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo nodejs npm + build-essential curl git util-linux jq sudo nodejs npm fonts-noto-cjk ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -38,6 +38,9 @@ COPY ./template/server/requirements.txt $SERVER_PATH RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt COPY ./template/server $SERVER_PATH +# Copy matplotlibrc +COPY ./template/matplotlibrc /root/.config/matplotlib/matplotlibrc + # Copy Jupyter configuration COPY ./template/start-up.sh $JUPYTER_CONFIG_PATH/ RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh From 9aa64299777b52189b601a41a9cd6c4230ace550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 9 Jan 2025 10:24:46 -0800 Subject: [PATCH 502/722] [skip ci] Delete .changeset/afraid-wolves-return.md --- .changeset/afraid-wolves-return.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/afraid-wolves-return.md diff --git a/.changeset/afraid-wolves-return.md b/.changeset/afraid-wolves-return.md deleted file mode 100644 index 14b6fb0d..00000000 --- a/.changeset/afraid-wolves-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add support for Chinese From 881d245183b662e2baff4b9f8969c91f4459393c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 12 Jan 2025 19:28:42 -0800 Subject: [PATCH 503/722] Set env variable for matplotlibrc --- template/start-up.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/start-up.sh b/template/start-up.sh index 5e149d00..b872d508 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -33,4 +33,4 @@ export PATH="/opt/java/openjdk/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin echo "Starting Code Interpreter server..." start_jupyter_server & -jupyter server --IdentityProvider.token="" >/dev/null 2>&1 +MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 From 62d217ff89fb68d33b39da34e79c990a838e611c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Sun, 12 Jan 2025 19:29:50 -0800 Subject: [PATCH 504/722] Add changeset --- .changeset/tricky-bikes-own.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tricky-bikes-own.md diff --git a/.changeset/tricky-bikes-own.md b/.changeset/tricky-bikes-own.md new file mode 100644 index 00000000..6694180a --- /dev/null +++ b/.changeset/tricky-bikes-own.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add matplotlibrc env variable to register mapltolibrc properly From 8b397430357f5735526ce6b4f3435c2abe8f85a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 13 Jan 2025 03:46:02 +0000 Subject: [PATCH 505/722] [skip ci] Release new versions --- .changeset/tricky-bikes-own.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/tricky-bikes-own.md diff --git a/.changeset/tricky-bikes-own.md b/.changeset/tricky-bikes-own.md deleted file mode 100644 index 6694180a..00000000 --- a/.changeset/tricky-bikes-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add matplotlibrc env variable to register mapltolibrc properly diff --git a/template/package.json b/template/package.json index cf714cf2..36d8936e 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.4" + "version": "0.0.5" } From 4dcdcd4caf4497a5c844977d0b8f1188f7ef2cae Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 16 Jan 2025 14:52:24 -0800 Subject: [PATCH 506/722] Remove unnecessary path --- template/start-up.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/template/start-up.sh b/template/start-up.sh index b872d508..fb45f470 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -29,8 +29,6 @@ function start_jupyter_server() { /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors } -export PATH="/opt/java/openjdk/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - echo "Starting Code Interpreter server..." start_jupyter_server & MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 From 33ff495b17b430f84fd47be4bba5868bef60a2fe Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 16 Jan 2025 14:52:39 -0800 Subject: [PATCH 507/722] Add changeset --- .changeset/angry-paws-battle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/angry-paws-battle.md diff --git a/.changeset/angry-paws-battle.md b/.changeset/angry-paws-battle.md new file mode 100644 index 00000000..69110e67 --- /dev/null +++ b/.changeset/angry-paws-battle.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Update R to 4.4 From 31aabd355a23c35727a0510423e4759345c7ce8c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Thu, 16 Jan 2025 14:53:31 -0800 Subject: [PATCH 508/722] Update Dockerfile --- template/Dockerfile | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/template/Dockerfile b/template/Dockerfile index 37841db2..b023150d 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -1,8 +1,5 @@ FROM python:3.10.14 -ENV JAVA_HOME=/opt/java/openjdk -ENV PATH="${JAVA_HOME}/bin:${PATH}" - RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ build-essential curl git util-linux jq sudo nodejs npm fonts-noto-cjk @@ -11,15 +8,19 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_NO_CACHE_DIR=1 \ JUPYTER_CONFIG_PATH="/root/.jupyter" \ IPYTHON_CONFIG_PATH="/root/.ipython" \ - SERVER_PATH="/root/.server" + SERVER_PATH="/root/.server" \ + R_VERSION=4.4.2 + +ENV R_HOME=/opt/R/${R_VERSION} \ + JAVA_HOME=/opt/java/openjdk # Install Jupyter COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # R Kernel -RUN apt-get update && apt-get install -y r-base -RUN R -e "install.packages('IRkernel')" +RUN curl -O https://cdn.rstudio.com/r/debian-12/pkgs/r-${R_VERSION}_1_amd64.deb && sudo apt-get update && sudo apt-get install -y ./r-${R_VERSION}_1_amd64.deb && ln -s ${R_HOME}/bin/R /usr/bin/R +RUN R -e "install.packages('IRkernel', repos='https://cloud.r-project.org')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" # Javascript Kernel @@ -63,6 +64,8 @@ COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME +RUN ln -s ${JAVA_HOME}/bin/java /usr/bin/java + # Java Kernel RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ unzip ijava-1.3.0.zip && \ From daba22b9c7143880b2e88c94a5c4bc5a52fc07f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Jan 2025 23:11:26 +0000 Subject: [PATCH 509/722] [skip ci] Release new versions --- .changeset/angry-paws-battle.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/angry-paws-battle.md diff --git a/.changeset/angry-paws-battle.md b/.changeset/angry-paws-battle.md deleted file mode 100644 index 69110e67..00000000 --- a/.changeset/angry-paws-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Update R to 4.4 diff --git a/template/package.json b/template/package.json index 36d8936e..8c91626e 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.5" + "version": "0.0.6" } From f14a2a5f6fe7ad17a253059704a9ac3894506f65 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 21 Jan 2025 14:05:38 -0800 Subject: [PATCH 510/722] Add to_dict() method in python SDK --- .changeset/hot-dots-help.md | 5 +++++ python/e2b_code_interpreter/charts.py | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/hot-dots-help.md diff --git a/.changeset/hot-dots-help.md b/.changeset/hot-dots-help.md new file mode 100644 index 00000000..611737b0 --- /dev/null +++ b/.changeset/hot-dots-help.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Add to_dict() method diff --git a/python/e2b_code_interpreter/charts.py b/python/e2b_code_interpreter/charts.py index d20878fa..8ccb798d 100644 --- a/python/e2b_code_interpreter/charts.py +++ b/python/e2b_code_interpreter/charts.py @@ -44,10 +44,14 @@ class Chart: elements: List[Any] def __init__(self, **kwargs): + self._raw_data = kwargs self.type = ChartType(kwargs["type"] or ChartType.UNKNOWN) self.title = kwargs["title"] self.elements = kwargs["elements"] + def to_dict(self) -> dict: + return self._raw_data + class Chart2D(Chart): x_label: Optional[str] From 83f08213fbd09f55707dde7c241d6b31670a8c4a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 21 Jan 2025 14:10:38 -0800 Subject: [PATCH 511/722] Skip on package.json change - it's just version bump --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a08d84a..2d6eb7b3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,6 +88,7 @@ jobs: - 'chart_data_extractor/e2b_charts/**' template: - 'template/**' + - '!template/package.json' charts-tests: name: Charts tests From bfa11701e7df5a9d28aa3f66563fb6f93a8e2e19 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Tue, 21 Jan 2025 14:23:38 -0800 Subject: [PATCH 512/722] [skip ci]Bump package manually --- .changeset/hot-dots-help.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.0.4/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/hot-dots-help.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx diff --git a/.changeset/hot-dots-help.md b/.changeset/hot-dots-help.md deleted file mode 100644 index 611737b0..00000000 --- a/.changeset/hot-dots-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Add to_dict() method diff --git a/python/package.json b/python/package.json index 6dc096b9..98d6d1c0 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.3", + "version": "1.0.4", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index edc7ed57..8fbe582b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.3" +version = "1.0.4" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx new file mode 100644 index 00000000..325b8e18 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + From 1b76bbe0593c55af1e8c86a04dcff9b75080e682 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 Jan 2025 19:02:45 -0800 Subject: [PATCH 513/722] Remove init method --- python/e2b_code_interpreter/code_interpreter_async.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 9b835ca3..c521af83 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -57,9 +57,6 @@ class AsyncSandbox(BaseAsyncSandbox): default_template = DEFAULT_TEMPLATE - def __init__(self, sandbox_id: str, connection_config: ConnectionConfig): - super().__init__(sandbox_id=sandbox_id, connection_config=connection_config) - @property def _jupyter_url(self) -> str: return f"{'http' if self.connection_config.debug else 'https'}://{self.get_host(JUPYTER_PORT)}" From 54935958aabcf613fecf110d0fff5ed3e6f71c2e Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 Jan 2025 19:02:57 -0800 Subject: [PATCH 514/722] Add changeset --- .changeset/silver-years-bake.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silver-years-bake.md diff --git a/.changeset/silver-years-bake.md b/.changeset/silver-years-bake.md new file mode 100644 index 00000000..33127be3 --- /dev/null +++ b/.changeset/silver-years-bake.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Remove bug in init method From 4e58b0df792709be19925437486c9df01ede0c56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 1 Feb 2025 03:24:20 +0000 Subject: [PATCH 515/722] [skip ci] Release new versions --- .changeset/silver-years-bake.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.0.5/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/silver-years-bake.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx diff --git a/.changeset/silver-years-bake.md b/.changeset/silver-years-bake.md deleted file mode 100644 index 33127be3..00000000 --- a/.changeset/silver-years-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Remove bug in init method diff --git a/python/package.json b/python/package.json index 98d6d1c0..4eb2aa20 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.4", + "version": "1.0.5", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 8fbe582b..dc118b04 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.4" +version = "1.0.5" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx new file mode 100644 index 00000000..b59dc8e0 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + From cfd5f878236b2919f2dde75f73294cf1cd706826 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 31 Jan 2025 19:17:34 -0800 Subject: [PATCH 516/722] Fix condition in changes and build condition --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d6eb7b3..692b3794 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,10 +75,11 @@ jobs: draft: false - name: Find changes since the last release - uses: dorny/paths-filter@v2 + uses: dorny/paths-filter@v3.0.2 id: filter with: base: ${{ steps.last_release.outputs.tag_name }} + predicate-quantifier: 'every' filters: | js: - 'js/src/**' @@ -205,7 +206,7 @@ jobs: if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && - needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true' + (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') steps: - name: Checkout repository uses: actions/checkout@v3 From 4bf7f921c8186787eefd110c87c885d947d80f86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 03:26:31 +0000 Subject: [PATCH 517/722] Bump the pip group across 2 directories with 9 updates --- updated-dependencies: - dependency-name: jinja2 dependency-type: indirect dependency-group: pip - dependency-name: requests dependency-type: direct:production dependency-group: pip - dependency-name: urllib3 dependency-type: direct:production dependency-group: pip - dependency-name: orjson dependency-type: direct:production dependency-group: pip - dependency-name: pillow dependency-type: direct:production dependency-group: pip - dependency-name: aiohttp dependency-type: direct:production dependency-group: pip - dependency-name: nltk dependency-type: direct:production dependency-group: pip - dependency-name: scikit-learn dependency-type: direct:production dependency-group: pip - dependency-name: tornado dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] --- python/poetry.lock | 8 ++++---- template/requirements.txt | 16 ++++++++-------- template/server/requirements.txt | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index a51d38e7..c2fc636e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "anyio" @@ -474,13 +474,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] diff --git a/template/requirements.txt b/template/requirements.txt index aa4419c1..ca87be9a 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,23 +3,23 @@ jupyter-server==2.13.0 ipykernel==6.29.3 ipython==8.22.2 -orjson==3.6.3 +orjson==3.9.15 pandas==1.5.3 matplotlib==3.9.2 -pillow==9.5.0 +pillow==10.3.0 # Latest version for e2b_charts # Other packages -aiohttp==3.9.3 +aiohttp==3.10.11 beautifulsoup4==4.12.3 bokeh==3.3.4 gensim==4.3.2 imageio==2.34.0 joblib==1.3.2 librosa==0.10.1 -nltk==3.8.1 +nltk==3.9 numpy==1.26.4 opencv-python==4.9.0.80 openpyxl==3.1.2 @@ -27,16 +27,16 @@ plotly==5.19.0 pytest==8.1.0 python-docx==1.1.0 pytz==2024.1 -requests==2.26.0 +requests==2.32.2 scikit-image==0.22.0 -scikit-learn==1.4.1.post1 +scikit-learn==1.5.0 scipy==1.12.0 seaborn==0.13.2 soundfile==0.12.1 spacy==3.7.4 textblob==0.18.0 -tornado==6.4 -urllib3==1.26.7 +tornado==6.4.2 +urllib3==1.26.19 xarray==2024.2.0 xlrd==2.0.1 sympy==1.12 diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 0d327bad..38aa52e3 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -2,5 +2,5 @@ fastapi==0.111.0 httpx==0.27.0 websockets==12.0 uvicorn[standard]==0.30.1 -requests==2.32.3 +requests==2.32.2 pydantic==2.9.1 From 2aa2e24ca9a3086a1084a31e9051d07b4d841dc4 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 09:09:10 -0800 Subject: [PATCH 518/722] Bump viitest --- js/package.json | 2 +- pnpm-lock.yaml | 359 +++++++++++++++++++++--------------------------- 2 files changed, 154 insertions(+), 207 deletions(-) diff --git a/js/package.json b/js/package.json index 1cfed68a..ee4dad3b 100644 --- a/js/package.json +++ b/js/package.json @@ -46,7 +46,7 @@ "typedoc": "^0.26.8", "typedoc-plugin-markdown": "^4.2.7", "typescript": "^5.5.3", - "vitest": "^2.0.1" + "vitest": "^3.0.5" }, "files": [ "dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae164df6..bf06edb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,8 +54,8 @@ importers: specifier: ^5.5.3 version: 5.5.3 vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.18.6) + specifier: ^3.0.5 + version: 3.0.5(@types/node@18.18.6) python: {} @@ -63,10 +63,6 @@ importers: packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -458,10 +454,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -477,6 +469,9 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -647,9 +642,6 @@ packages: resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -729,20 +721,34 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/expect@2.0.1': - resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} + '@vitest/expect@3.0.5': + resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + + '@vitest/mocker@3.0.5': + resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.5': + resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} - '@vitest/runner@2.0.1': - resolution: {integrity: sha512-XfcSXOGGxgR2dQ466ZYqf0ZtDLLDx9mZeQcKjQDLQ9y6Cmk2Wl7wxMuhiYK4Fo1VxCtLcFEGW2XpcfMuiD1Maw==} + '@vitest/runner@3.0.5': + resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} - '@vitest/snapshot@2.0.1': - resolution: {integrity: sha512-rst79a4Q+J5vrvHRapdfK4BdqpMH0eF58jVY1vYeBo/1be+nkyenGI5SCSohmjf6MkCkI20/yo5oG+0R8qrAnA==} + '@vitest/snapshot@3.0.5': + resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} - '@vitest/spy@2.0.1': - resolution: {integrity: sha512-NLkdxbSefAtJN56GtCNcB4GiHFb5i9q1uh4V229lrlTZt2fnwsTyjLuWIli1xwK2fQspJJmHXHyWx0Of3KTXWA==} + '@vitest/spy@3.0.5': + resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} - '@vitest/utils@2.0.1': - resolution: {integrity: sha512-STH+2fHZxlveh1mpU4tKzNgRk7RZJyr6kFGJYCI5vocdfqfPsQrgVC6k7dBWHfin5QNB4TLvRS0Ckly3Dt1uWw==} + '@vitest/utils@3.0.5': + resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -791,10 +797,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -930,8 +932,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} chalk@2.4.2: @@ -1089,8 +1091,8 @@ packages: supports-color: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1147,10 +1149,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -1219,6 +1217,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -1268,9 +1269,9 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -1380,10 +1381,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -1517,10 +1514,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -1677,10 +1670,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -1835,6 +1824,9 @@ packages: loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1857,8 +1849,8 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -1923,10 +1915,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -2093,10 +2081,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2124,10 +2108,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - oniguruma-to-es@0.4.1: resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} @@ -2214,10 +2194,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2229,8 +2205,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -2294,10 +2270,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.0.0: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} @@ -2365,9 +2337,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2642,8 +2611,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} @@ -2689,10 +2658,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -2740,15 +2705,22 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -2960,9 +2932,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.0.1: - resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.0.5: + resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@5.2.6: @@ -2993,20 +2965,23 @@ packages: terser: optional: true - vitest@2.0.1: - resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.0.5: + resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.1 - '@vitest/ui': 2.0.1 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.5 + '@vitest/ui': 3.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -3055,8 +3030,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -3150,11 +3125,6 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 @@ -3525,10 +3495,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -3541,6 +3507,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -3731,8 +3699,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@5.6.0': {} '@snyk/github-codeowners@1.1.0': @@ -3802,33 +3768,45 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/expect@2.0.1': + '@vitest/expect@3.0.5': dependencies: - '@vitest/spy': 2.0.1 - '@vitest/utils': 2.0.1 - chai: 5.1.1 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + tinyrainbow: 2.0.0 - '@vitest/runner@2.0.1': + '@vitest/mocker@3.0.5(vite@5.2.6(@types/node@18.18.6))': dependencies: - '@vitest/utils': 2.0.1 - pathe: 1.1.2 + '@vitest/spy': 3.0.5 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.2.6(@types/node@18.18.6) - '@vitest/snapshot@2.0.1': + '@vitest/pretty-format@3.0.5': dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 + tinyrainbow: 2.0.0 - '@vitest/spy@2.0.1': + '@vitest/runner@3.0.5': dependencies: - tinyspy: 3.0.0 + '@vitest/utils': 3.0.5 + pathe: 2.0.2 - '@vitest/utils@2.0.1': + '@vitest/snapshot@3.0.5': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 3.1.1 - pretty-format: 29.7.0 + '@vitest/pretty-format': 3.0.5 + magic-string: 0.30.17 + pathe: 2.0.2 + + '@vitest/spy@3.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.0.5': + dependencies: + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 + tinyrainbow: 2.0.0 abbrev@1.1.1: {} @@ -3873,8 +3851,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -4052,7 +4028,7 @@ snapshots: ccount@2.0.1: {} - chai@5.1.1: + chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 @@ -4219,9 +4195,9 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.5: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 decamelize-keys@1.1.1: dependencies: @@ -4266,8 +4242,6 @@ snapshots: dependencies: dequal: 2.0.3 - diff-sequences@29.6.3: {} - diff@4.0.2: optional: true @@ -4379,6 +4353,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.6.0: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -4475,17 +4451,7 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + expect-type@1.1.0: {} exponential-backoff@3.1.1: {} @@ -4606,8 +4572,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@8.0.1: {} - get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 @@ -4768,8 +4732,6 @@ snapshots: human-signals@2.1.0: {} - human-signals@5.0.0: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -4901,8 +4863,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@3.0.0: {} - is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -5047,6 +5007,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.3: {} + lowercase-keys@3.0.0: {} lru-cache@10.2.0: {} @@ -5064,9 +5026,9 @@ snapshots: lunr@2.3.9: {} - magic-string@0.30.10: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: optional: true @@ -5182,8 +5144,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} - mimic-response@3.1.0: {} mimic-response@4.0.0: {} @@ -5404,10 +5364,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 @@ -5436,10 +5392,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - oniguruma-to-es@0.4.1: dependencies: emoji-regex-xs: 1.0.0 @@ -5534,8 +5486,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.10.1: @@ -5545,7 +5495,7 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} + pathe@2.0.2: {} pathval@2.0.0: {} @@ -5592,12 +5542,6 @@ snapshots: prettier@2.8.8: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - pretty-ms@9.0.0: dependencies: parse-ms: 4.0.0 @@ -5654,8 +5598,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-is@18.2.0: {} - read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.1 @@ -5960,7 +5902,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.7.0: {} + std-env@3.8.0: {} stream-transform@2.1.3: dependencies: @@ -6018,8 +5960,6 @@ snapshots: strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -6069,11 +6009,15 @@ snapshots: dependencies: any-promise: 1.3.0 - tinybench@2.8.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinypool@1.0.2: {} - tinypool@1.0.0: {} + tinyrainbow@2.0.0: {} - tinyspy@3.0.0: {} + tinyspy@3.0.2: {} tmp@0.0.33: dependencies: @@ -6325,12 +6269,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.0.1(@types/node@18.18.6): + vite-node@3.0.5(@types/node@18.18.6): dependencies: cac: 6.7.14 - debug: 4.3.5 - pathe: 1.1.2 - picocolors: 1.0.1 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.2 vite: 5.2.6(@types/node@18.18.6) transitivePeerDependencies: - '@types/node' @@ -6351,31 +6295,34 @@ snapshots: '@types/node': 18.18.6 fsevents: 2.3.3 - vitest@2.0.1(@types/node@18.18.6): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.1 - '@vitest/runner': 2.0.1 - '@vitest/snapshot': 2.0.1 - '@vitest/spy': 2.0.1 - '@vitest/utils': 2.0.1 - chai: 5.1.1 - debug: 4.3.5 - execa: 8.0.1 - magic-string: 0.30.10 - pathe: 1.1.2 - picocolors: 1.0.1 - std-env: 3.7.0 - tinybench: 2.8.0 - tinypool: 1.0.0 + vitest@3.0.5(@types/node@18.18.6): + dependencies: + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(vite@5.2.6(@types/node@18.18.6)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 vite: 5.2.6(@types/node@18.18.6) - vite-node: 2.0.1(@types/node@18.18.6) - why-is-node-running: 2.2.2 + vite-node: 3.0.5(@types/node@18.18.6) + why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.18.6 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -6429,7 +6376,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 From e819c7941b35b6e392918bde64c9f4fb6dd362ae Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 09:11:34 -0800 Subject: [PATCH 519/722] Bump changesets --- package.json | 4 +- pnpm-lock.yaml | 1532 +++++------------------------------------------- 2 files changed, 138 insertions(+), 1398 deletions(-) diff --git a/package.json b/package.json index 5011dd37..42c7b0d6 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ }, "packageManager": "pnpm@8.7.6", "devDependencies": { - "@changesets/cli": "^2.26.2", - "@changesets/read": "^0.5.9", + "@changesets/cli": "^2.27.12", + "@changesets/read": "^0.6.2", "changeset": "^0.2.6" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf06edb2..8e9cbadf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: devDependencies: '@changesets/cli': - specifier: ^2.26.2 - version: 2.27.1 + specifier: ^2.27.12 + version: 2.27.12 '@changesets/read': - specifier: ^0.5.9 - version: 0.5.9 + specifier: ^0.6.2 + version: 0.6.2 changeset: specifier: ^0.2.6 version: 0.2.6 @@ -63,18 +63,6 @@ importers: packages: - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.4': resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} @@ -82,75 +70,60 @@ packages: '@bufbuild/protobuf@2.2.2': resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==} - '@changesets/apply-release-plan@7.0.0': - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + '@changesets/apply-release-plan@7.0.8': + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.1': - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + '@changesets/cli@2.27.12': + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} hasBin: true - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - - '@changesets/errors@0.1.4': - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@2.0.0': - resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} - - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} - '@changesets/logger@0.0.5': - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} - - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - - '@changesets/parse@0.3.16': - resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - '@changesets/read@0.5.9': - resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@5.2.1': - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - '@changesets/write@0.3.0': - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -691,9 +664,6 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -703,15 +673,9 @@ packages: '@types/node@20.14.10': resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/semver-utils@1.1.3': resolution: {integrity: sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -789,10 +753,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -825,34 +785,14 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -878,8 +818,9 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -913,18 +854,6 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -936,14 +865,6 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -988,27 +909,14 @@ packages: resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} engines: {node: 10.* || >= 12.*} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1046,42 +954,18 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1100,14 +984,6 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -1127,14 +1003,6 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -1202,39 +1070,9 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -1245,18 +1083,10 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -1297,6 +1127,10 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1305,12 +1139,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -1350,29 +1178,14 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-stdin@8.0.0: resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} engines: {node: '>=10'} @@ -1381,10 +1194,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1407,17 +1216,10 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -1428,39 +1230,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} @@ -1478,9 +1247,6 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@5.2.1: resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -1566,36 +1332,14 @@ packages: resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -1603,14 +1347,6 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1630,18 +1366,10 @@ packages: is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1654,44 +1382,17 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -1700,9 +1401,6 @@ packages: resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1721,9 +1419,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1738,9 +1433,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-parse-even-better-errors@3.0.1: resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1766,10 +1458,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1800,10 +1488,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1835,9 +1519,6 @@ packages: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1863,14 +1544,6 @@ packages: resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -1881,10 +1554,6 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1911,6 +1580,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -1923,10 +1596,6 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1942,10 +1611,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1992,15 +1657,15 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2029,9 +1694,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-package-data@5.0.0: resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2090,17 +1752,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2164,6 +1815,9 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + pacote@15.2.0: resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2174,10 +1828,6 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -2218,6 +1868,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2234,17 +1887,9 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-load-config@4.0.2: resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -2261,10 +1906,6 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -2304,9 +1945,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -2322,10 +1960,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -2346,14 +1980,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} deprecated: This package is no longer supported. Please use @npmcli/package-json instead. - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -2366,10 +1992,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -2382,10 +2004,6 @@ packages: regex@5.0.2: resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} @@ -2398,17 +2016,10 @@ packages: resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} engines: {node: '>=8'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -2450,17 +2061,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2471,10 +2074,6 @@ packages: semver-utils@1.1.4: resolution: {integrity: sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -2483,26 +2082,10 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -2510,10 +2093,6 @@ packages: shiki@1.23.1: resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2540,11 +2119,6 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - smol-toml@1.2.2: resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} engines: {node: '>= 18'} @@ -2579,8 +2153,8 @@ packages: resolution: {integrity: sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==} engines: {node: '>=14'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -2614,9 +2188,6 @@ packages: std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2625,17 +2196,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2658,10 +2218,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -2678,14 +2234,6 @@ packages: summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2741,10 +2289,6 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -2785,27 +2329,10 @@ packages: typescript: optional: true - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -2814,22 +2341,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -2857,9 +2368,6 @@ packages: udc@1.0.1: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -3002,24 +2510,6 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3042,10 +2532,6 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3064,18 +2550,8 @@ packages: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@2.4.5: resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} @@ -3087,22 +2563,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -3125,32 +2585,18 @@ packages: snapshots: - '@babel/code-frame@7.24.2': - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/highlight@7.24.2': - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - '@babel/runtime@7.24.4': dependencies: regenerator-runtime: 0.14.1 '@bufbuild/protobuf@2.2.2': {} - '@changesets/apply-release-plan@7.0.0': + '@changesets/apply-release-plan@7.0.8': dependencies: - '@babel/runtime': 7.24.4 - '@changesets/config': 3.0.0 + '@changesets/config': 3.0.5 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 @@ -3161,11 +2607,11 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.0 - '@changesets/assemble-release-plan@6.0.0': + '@changesets/assemble-release-plan@6.0.5': dependencies: - '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.0 @@ -3174,156 +2620,114 @@ snapshots: dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.1': + '@changesets/cli@2.27.12': dependencies: - '@babel/runtime': 7.24.4 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 + '@changesets/apply-release-plan': 7.0.8 + '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 + '@changesets/config': 3.0.5 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 + '@changesets/write': 0.3.2 '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 ansi-colors: 4.1.3 - chalk: 2.4.2 ci-info: 3.9.0 enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 + mri: 1.2.0 p-limit: 2.3.0 - preferred-pm: 3.1.3 + package-manager-detector: 0.2.9 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.0 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 term-size: 2.2.1 - tty-table: 4.2.3 - '@changesets/config@3.0.0': + '@changesets/config@3.0.5': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 - - '@changesets/errors@0.1.4': - dependencies: - extendable-error: 0.1.7 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.0.0': + '@changesets/get-dependents-graph@2.1.2': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 + picocolors: 1.1.1 semver: 7.6.0 - '@changesets/get-release-plan@4.0.0': + '@changesets/get-release-plan@4.0.6': dependencies: - '@babel/runtime': 7.24.4 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@2.0.0': - dependencies: - '@babel/runtime': 7.24.4 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 - - '@changesets/git@3.0.0': + '@changesets/git@3.0.2': dependencies: - '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - '@changesets/logger@0.0.5': + '@changesets/logger@0.1.1': dependencies: - chalk: 2.4.2 - - '@changesets/logger@0.1.0': - dependencies: - chalk: 2.4.2 - - '@changesets/parse@0.3.16': - dependencies: - '@changesets/types': 5.2.1 - js-yaml: 3.14.1 + picocolors: 1.1.1 '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.0': + '@changesets/pre@2.0.1': dependencies: - '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.5.9': + '@changesets/read@0.6.2': dependencies: - '@babel/runtime': 7.24.4 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/parse': 0.3.16 - '@changesets/types': 5.2.1 - chalk: 2.4.2 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.1 - '@changesets/read@0.6.0': + '@changesets/should-skip-package@0.1.1': dependencies: - '@babel/runtime': 7.24.4 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 + '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@5.2.1': {} - '@changesets/types@6.0.0': {} - '@changesets/write@0.3.0': + '@changesets/write@0.3.2': dependencies: - '@babel/runtime': 7.24.4 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -3517,7 +2921,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 optional: true '@manypkg/find-root@1.1.0': @@ -3744,8 +3148,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/minimist@1.2.5': {} - '@types/node@12.20.55': {} '@types/node@18.18.6': {} @@ -3754,12 +3156,8 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/semver-utils@1.1.3': {} - '@types/semver@7.5.8': {} - '@types/unist@3.0.3': {} '@types/ws@8.5.10': @@ -3843,10 +3241,6 @@ snapshots: ansi-regex@6.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3876,39 +3270,10 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-union@2.1.0: {} - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - assertion-error@2.0.1: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - balanced-match@1.0.2: {} better-path-resolve@1.0.0: @@ -3941,9 +3306,9 @@ snapshots: dependencies: fill-range: 7.0.1 - breakword@1.0.6: + braces@3.0.3: dependencies: - wcwidth: 1.0.1 + fill-range: 7.1.1 buffer-from@1.1.2: {} @@ -4008,22 +3373,6 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - camelcase@7.0.1: {} ccount@2.0.1: {} @@ -4036,17 +3385,6 @@ snapshots: loupe: 3.1.1 pathval: 2.0.0 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.3.0: {} changeset@0.2.6: @@ -4088,30 +3426,13 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + clone@1.0.4: + optional: true color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-support@1.1.3: {} @@ -4144,13 +3465,13 @@ snapshots: create-require@1.1.1: optional: true - cross-spawn@5.1.0: + cross-spawn@7.0.3: dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -4160,37 +3481,6 @@ snapshots: dependencies: type-fest: 1.4.0 - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - csv@5.5.3: - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -4199,13 +3489,6 @@ snapshots: dependencies: ms: 2.1.3 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -4217,21 +3500,10 @@ snapshots: defaults@1.0.4: dependencies: clone: 1.0.4 + optional: true defer-to-connect@2.0.1: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delegates@1.0.0: {} dequal@2.0.3: {} @@ -4294,87 +3566,8 @@ snapshots: err-code@2.0.3: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - es-module-lexer@1.6.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -4427,12 +3620,8 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.2: {} - escape-goat@4.0.0: {} - escape-string-regexp@1.0.5: {} - esprima@4.0.1: {} estree-walker@3.0.3: @@ -4481,6 +3670,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -4491,15 +3684,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -4536,15 +3720,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gauge@4.0.4: dependencies: aproba: 2.0.0 @@ -4556,28 +3731,12 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-stdin@8.0.0: {} get-stream@6.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4611,10 +3770,6 @@ snapshots: dependencies: ini: 2.0.0 - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -4624,10 +3779,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -4646,28 +3797,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - - hard-rejection@2.1.0: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - has-unicode@2.0.1: {} has-yarn@3.0.0: {} @@ -4694,8 +3823,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hosted-git-info@2.8.9: {} - hosted-git-info@5.2.1: dependencies: lru-cache: 7.18.3 @@ -4772,39 +3899,15 @@ snapshots: ini@4.1.2: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - is-ci@3.0.1: dependencies: ci-info: 3.9.0 @@ -4813,14 +3916,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4836,61 +3931,26 @@ snapshots: is-lambda@1.0.1: {} - is-negative-zero@2.0.3: {} - is-npm@6.0.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-obj@2.0.0: {} is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-stream@2.0.1: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-typedarray@1.0.0: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-windows@1.0.2: {} is-yarn-global@0.4.1: {} - isarray@2.0.5: {} - isexe@2.0.0: {} jackspeak@2.3.6: @@ -4905,8 +3965,6 @@ snapshots: joycon@3.1.1: {} - js-tokens@4.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4920,8 +3978,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.1: {} json-parse-helpfulerror@1.0.3: @@ -4942,8 +3998,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - kleur@4.1.5: {} knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): @@ -4982,13 +4036,6 @@ snapshots: load-tsconfig@0.2.5: {} - load-yaml-file@0.2.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5013,11 +4060,6 @@ snapshots: lru-cache@10.2.0: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -5075,10 +4117,6 @@ snapshots: transitivePeerDependencies: - supports-color - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -5102,20 +4140,6 @@ snapshots: mdurl@2.0.0: {} - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -5142,14 +4166,17 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mimic-fn@2.1.0: {} mimic-response@3.1.0: {} mimic-response@4.0.0: {} - min-indent@1.0.1: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5166,12 +4193,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass-collect@1.0.2: @@ -5224,10 +4245,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mixme@0.5.10: {} - mkdirp@1.0.4: {} + mri@1.2.0: {} + ms@2.1.2: {} ms@2.1.3: {} @@ -5263,13 +4284,6 @@ snapshots: dependencies: abbrev: 1.1.1 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 @@ -5373,17 +4387,6 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -5445,6 +4448,8 @@ snapshots: registry-url: 6.0.1 semver: 7.6.0 + package-manager-detector@0.2.9: {} + pacote@15.2.0: dependencies: '@npmcli/git': 4.1.0 @@ -5471,13 +4476,6 @@ snapshots: parse-github-url@1.0.2: {} - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse-ms@4.0.0: {} path-exists@4.0.0: {} @@ -5503,6 +4501,8 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} @@ -5511,14 +4511,8 @@ snapshots: pirates@4.0.6: {} - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - platform@1.3.6: {} - possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3)): dependencies: lilconfig: 3.1.2 @@ -5533,13 +4527,6 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 - preferred-pm@3.1.3: - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - prettier@2.8.8: {} pretty-ms@9.0.0: @@ -5566,8 +4553,6 @@ snapshots: proto-list@1.2.4: {} - pseudomap@1.0.2: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -5578,8 +4563,6 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@4.0.1: {} - quick-lru@5.1.1: {} rc-config-loader@4.1.3: @@ -5610,19 +4593,6 @@ snapshots: normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -5640,11 +4610,6 @@ snapshots: dependencies: picomatch: 2.3.1 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - regenerator-runtime@0.14.1: {} regex-recursion@4.2.1: @@ -5657,13 +4622,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.2.2 @@ -5674,12 +4632,8 @@ snapshots: remote-git-tags@3.0.0: {} - require-directory@2.1.1: {} - require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} - resolve-alpn@1.2.1: {} resolve-from@5.0.0: {} @@ -5729,21 +4683,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safer-buffer@2.1.2: {} semver-diff@4.0.0: @@ -5752,40 +4693,16 @@ snapshots: semver-utils@1.1.4: {} - semver@5.7.2: {} - semver@7.6.0: dependencies: lru-cache: 6.0.0 set-blocking@2.0.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shiki@1.23.1: @@ -5797,13 +4714,6 @@ snapshots: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -5826,15 +4736,6 @@ snapshots: smart-buffer@4.2.0: {} - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - smol-toml@1.2.2: {} socks-proxy-agent@7.0.0: @@ -5869,10 +4770,10 @@ snapshots: dependencies: cross-spawn: 7.0.3 - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 spdx-correct@3.2.0: dependencies: @@ -5904,10 +4805,6 @@ snapshots: std-env@3.8.0: {} - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -5920,25 +4817,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5960,10 +4838,6 @@ snapshots: strip-final-newline@2.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@5.0.1: {} @@ -5980,14 +4854,6 @@ snapshots: summary@2.1.0: {} - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} tar@6.2.1: @@ -6035,8 +4901,6 @@ snapshots: trim-lines@3.0.1: {} - trim-newlines@3.0.1: {} - ts-interface-checker@0.1.13: {} ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3): @@ -6087,16 +4951,6 @@ snapshots: - supports-color - ts-node - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 @@ -6105,48 +4959,10 @@ snapshots: transitivePeerDependencies: - supports-color - type-fest@0.13.1: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - type-fest@1.4.0: {} type-fest@2.19.0: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -6170,13 +4986,6 @@ snapshots: udc@1.0.1: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - underscore@1.13.6: {} undici-types@5.26.5: {} @@ -6332,6 +5141,7 @@ snapshots: wcwidth@1.0.1: dependencies: defaults: 1.0.4 + optional: true webidl-conversions@4.0.2: {} @@ -6341,33 +5151,6 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-module@2.0.1: {} - - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -6389,12 +5172,6 @@ snapshots: dependencies: string-width: 5.1.2 - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -6418,49 +5195,12 @@ snapshots: xdg-basedir@5.1.0: {} - y18n@4.0.3: {} - - y18n@5.0.8: {} - - yallist@2.1.2: {} - yallist@4.0.0: {} yaml@2.4.5: {} yaml@2.6.1: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-parser@21.1.1: {} - - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yn@3.1.1: optional: true From 289c42bd1c833667e1c25d65e8a631a582d7964c Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 09:13:43 -0800 Subject: [PATCH 520/722] Bump npm check updates --- js/package.json | 3 +- pnpm-lock.yaml | 1872 +---------------------------------------------- 2 files changed, 7 insertions(+), 1868 deletions(-) diff --git a/js/package.json b/js/package.json index ee4dad3b..481ec535 100644 --- a/js/package.json +++ b/js/package.json @@ -38,10 +38,9 @@ }, "devDependencies": { "@types/node": "^18.18.6", - "@types/ws": "^8.5.10", "dotenv": "^16.4.5", "knip": "^5.25.1", - "npm-check-updates": "^16.14.20", + "npm-check-updates": "^17.1.14", "tsup": "^8.1.0", "typedoc": "^0.26.8", "typedoc-plugin-markdown": "^4.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e9cbadf..7157c642 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,9 +29,6 @@ importers: '@types/node': specifier: ^18.18.6 version: 18.18.6 - '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -39,8 +36,8 @@ importers: specifier: ^5.25.1 version: 5.25.1(@types/node@18.18.6)(typescript@5.5.3) npm-check-updates: - specifier: ^16.14.20 - version: 16.14.20 + specifier: ^17.1.14 + version: 17.1.14 tsup: specifier: ^8.1.0 version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3) @@ -125,10 +122,6 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@connectrpc/connect-web@2.0.0-rc.3': resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} peerDependencies: @@ -420,9 +413,6 @@ packages: cpu: [x64] os: [win32] - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -469,56 +459,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/fs@3.1.0': - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/git@4.1.0': - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/installed-package-contents@2.0.2': - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/promise-spawn@6.0.2': - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/run-script@6.0.2': - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pnpm/config.env-replace@1.1.0': - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} - - '@pnpm/network.ca-file@1.0.2': - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} - - '@pnpm/npm-conf@2.2.2': - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.13.0': resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] @@ -599,39 +543,11 @@ packages: '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} - '@sigstore/bundle@1.1.0': - resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@sigstore/protobuf-specs@0.2.1': - resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@sigstore/sign@1.0.0': - resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@sigstore/tuf@1.0.3': - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} hasBin: true - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -644,23 +560,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tufjs/canonical-json@1.0.0': - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@tufjs/models@1.0.4': - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -670,18 +575,9 @@ packages: '@types/node@18.18.6': resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} - '@types/node@20.14.10': - resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} - - '@types/semver-utils@1.1.3': - resolution: {integrity: sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -714,9 +610,6 @@ packages: '@vitest/utils@3.0.5': resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} @@ -726,21 +619,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -768,14 +650,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -804,13 +678,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -822,12 +689,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - bundle-require@4.0.2: resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -838,26 +699,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - cacache@17.1.4: - resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -865,10 +706,6 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} @@ -889,10 +726,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -901,14 +734,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - - cli-table3@0.6.4: - resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} - engines: {node: 10.* || >= 12.*} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -920,17 +745,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -938,19 +755,6 @@ packages: compare-versions@6.1.0: resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - - configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -962,10 +766,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -984,28 +784,13 @@ packages: supports-color: optional: true - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1025,10 +810,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -1052,9 +833,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1063,13 +841,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} @@ -1083,10 +854,6 @@ packages: engines: {node: '>=12'} hasBin: true - escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -1103,9 +870,6 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1117,9 +881,6 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} - fast-memoize@2.5.2: - resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -1135,22 +896,10 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - - fp-and-or@0.1.4: - resolution: {integrity: sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==} - engines: {node: '>=10'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1159,17 +908,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1178,18 +916,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stdin@8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1203,40 +932,13 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} - - graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - has-yarn@3.0.0: - resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1247,32 +949,9 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hosted-git-info@5.2.1: - resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -1280,70 +959,22 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - - ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -1359,29 +990,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -1390,17 +1002,10 @@ packages: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-yarn-global@0.4.1: - resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} - engines: {node: '>=12'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1412,9 +1017,6 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -1427,19 +1029,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-parse-helpfulerror@1.0.3: - resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1448,20 +1037,6 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonlines@0.1.1: - resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - knip@5.25.1: resolution: {integrity: sha512-vUopqkh/gOovZ05qYgTghZpmkM3b2eKYdLTsu11ZTYnYEcsdfQeZs6l4U7Rap4b+1KEDd/yydJsuWl+4NyEA9g==} engines: {node: '>=18.6.0'} @@ -1470,10 +1045,6 @@ packages: '@types/node': '>=18' typescript: '>=5.0.4' - latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -1492,29 +1063,18 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} @@ -1523,10 +1083,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -1536,14 +1092,6 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -1588,21 +1136,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -1614,54 +1147,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-fetch@3.0.4: - resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1680,81 +1169,23 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - - npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-check-updates@16.14.20: - resolution: {integrity: sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==} - engines: {node: '>=14.14'} + npm-check-updates@17.1.14: + resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} + engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} hasBin: true - npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-pick-manifest@8.0.2: - resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -1775,10 +1206,6 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -1787,18 +1214,10 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -1811,23 +1230,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json@8.1.1: - resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} - engines: {node: '>=14.16'} - package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} - pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true - parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -1836,10 +1241,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1915,36 +1316,9 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prompts-ncu@3.0.0: - resolution: {integrity: sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==} - engines: {node: '>= 14'} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1953,41 +1327,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} - engines: {node: '>=12.20'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - rc-config-loader@4.1.3: - resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. Please use @npmcli/package-json instead. - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2004,25 +1350,6 @@ packages: regex@5.0.2: resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} - registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} - engines: {node: '>=14'} - - registry-url@6.0.1: - resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} - engines: {node: '>=12'} - - remote-git-tags@3.0.0: - resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} - engines: {node: '>=8'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2031,28 +1358,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true - rollup@4.13.0: resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2061,27 +1370,14 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver-diff@4.0.0: - resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} - engines: {node: '>=12'} - - semver-utils@1.1.4: - resolution: {integrity: sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==} - semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2103,45 +1399,18 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@1.9.0: - resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smol-toml@1.2.2: resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} engines: {node: '>= 18'} - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -2149,39 +1418,12 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawn-please@2.0.2: - resolution: {integrity: sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==} - engines: {node: '>=14'} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - ssri@10.0.5: - resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2196,9 +1438,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -2218,10 +1457,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@5.0.1: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} @@ -2238,10 +1473,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -2329,21 +1560,6 @@ packages: typescript: optional: true - tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typedoc-plugin-markdown@4.2.10: resolution: {integrity: sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ==} engines: {node: '>= 18'} @@ -2371,29 +1587,6 @@ packages: underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -2413,27 +1606,9 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - update-notifier@6.0.2: - resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} - engines: {node: '>=14.16'} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -2515,23 +1690,11 @@ packages: engines: {node: '>= 8'} hasBin: true - which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2540,16 +1703,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -2567,10 +1720,6 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - zod-validation-error@3.3.0: resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} engines: {node: '>=18.0.0'} @@ -2733,9 +1882,6 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@colors/colors@1.5.0': - optional: true - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2))': dependencies: '@bufbuild/protobuf': 2.2.2 @@ -2888,8 +2034,6 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@gar/promisify@1.1.3': {} - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2952,70 +2096,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.0 - - '@npmcli/fs@3.1.0': - dependencies: - semver: 7.6.0 - - '@npmcli/git@4.1.0': - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.2 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.6.0 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - - '@npmcli/installed-package-contents@2.0.2': - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@npmcli/node-gyp@3.0.0': {} - - '@npmcli/promise-spawn@6.0.2': - dependencies: - which: 3.0.1 - - '@npmcli/run-script@6.0.2': - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.1 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - '@pkgjs/parseargs@0.11.0': optional: true - '@pnpm/config.env-replace@1.1.0': {} - - '@pnpm/network.ca-file@1.0.2': - dependencies: - graceful-fs: 4.2.10 - - '@pnpm/npm-conf@2.2.2': - dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.13.0': optional: true @@ -3082,41 +2165,12 @@ snapshots: '@shikijs/vscode-textmate@9.3.0': {} - '@sigstore/bundle@1.1.0': - dependencies: - '@sigstore/protobuf-specs': 0.2.1 - - '@sigstore/protobuf-specs@0.2.1': {} - - '@sigstore/sign@1.0.0': - dependencies: - '@sigstore/bundle': 1.1.0 - '@sigstore/protobuf-specs': 0.2.1 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - - '@sigstore/tuf@1.0.3': - dependencies: - '@sigstore/protobuf-specs': 0.2.1 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - - '@sindresorhus/is@5.6.0': {} - '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 ignore: 5.3.1 p-map: 4.0.0 - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@tootallnate/once@2.0.0': {} - '@tsconfig/node10@1.0.11': optional: true @@ -3129,21 +2183,12 @@ snapshots: '@tsconfig/node16@1.0.4': optional: true - '@tufjs/canonical-json@1.0.0': {} - - '@tufjs/models@1.0.4': - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.3 - '@types/estree@1.0.5': {} '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 - '@types/http-cache-semantics@4.0.4': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -3152,18 +2197,8 @@ snapshots: '@types/node@18.18.6': {} - '@types/node@20.14.10': - dependencies: - undici-types: 5.26.5 - - '@types/semver-utils@1.1.3': {} - '@types/unist@3.0.3': {} - '@types/ws@8.5.10': - dependencies: - '@types/node': 20.14.10 - '@ungap/structured-clone@1.2.0': {} '@vitest/expect@3.0.5': @@ -3206,8 +2241,6 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - abbrev@1.1.1: {} - acorn-walk@8.3.3: dependencies: acorn: 8.12.1 @@ -3216,25 +2249,11 @@ snapshots: acorn@8.12.1: optional: true - agent-base@6.0.2: - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -3254,13 +2273,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - arg@4.1.3: optional: true @@ -3282,22 +2294,6 @@ snapshots: binary-extensions@2.3.0: {} - boxen@7.1.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3310,12 +2306,6 @@ snapshots: dependencies: fill-range: 7.1.1 - buffer-from@1.1.2: {} - - builtins@5.0.1: - dependencies: - semver: 7.6.0 - bundle-require@4.0.2(esbuild@0.21.5): dependencies: esbuild: 0.21.5 @@ -3323,58 +2313,6 @@ snapshots: cac@6.7.14: {} - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - - cacache@17.1.4: - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.3 - glob: 10.3.10 - lru-cache: 7.18.3 - minipass: 7.0.4 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.5 - tar: 6.2.1 - unique-filename: 3.0.0 - - cacheable-lookup@7.0.0: {} - - cacheable-request@10.2.14: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.1 - responselike: 3.0.0 - - camelcase@7.0.1: {} - ccount@2.0.1: {} chai@5.1.2: @@ -3385,8 +2323,6 @@ snapshots: loupe: 3.1.1 pathval: 2.0.0 - chalk@5.3.0: {} - changeset@0.2.6: dependencies: udc: 1.0.1 @@ -3412,20 +2348,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@2.0.0: {} - ci-info@3.9.0: {} clean-stack@2.2.0: {} - cli-boxes@3.0.0: {} - - cli-table3@0.6.4: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - clone@1.0.4: optional: true @@ -3435,33 +2361,12 @@ snapshots: color-name@1.1.4: {} - color-support@1.1.3: {} - comma-separated-tokens@2.0.3: {} - commander@10.0.1: {} - commander@4.1.1: {} compare-versions@6.1.0: {} - concat-map@0.0.1: {} - - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - - configstore@6.0.0: - dependencies: - dot-prop: 6.0.1 - graceful-fs: 4.2.11 - unique-string: 3.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 5.1.0 - - console-control-strings@1.1.0: {} - create-require@1.1.1: optional: true @@ -3477,10 +2382,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypto-random-string@4.0.0: - dependencies: - type-fest: 1.4.0 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -3489,23 +2390,13 @@ snapshots: dependencies: ms: 2.1.3 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} - defaults@1.0.4: dependencies: clone: 1.0.4 optional: true - defer-to-connect@2.0.1: {} - - delegates@1.0.0: {} - dequal@2.0.3: {} detect-indent@6.1.0: {} @@ -3521,10 +2412,6 @@ snapshots: dependencies: path-type: 4.0.0 - dot-prop@6.0.1: - dependencies: - is-obj: 2.0.0 - dotenv@16.4.5: {} e2b@1.0.5: @@ -3550,11 +2437,6 @@ snapshots: emoji-regex@9.2.2: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -3562,10 +2444,6 @@ snapshots: entities@4.5.0: {} - env-paths@2.2.1: {} - - err-code@2.0.3: {} - es-module-lexer@1.6.0: {} esbuild@0.20.2: @@ -3620,8 +2498,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escape-goat@4.0.0: {} - esprima@4.0.1: {} estree-walker@3.0.3: @@ -3642,8 +2518,6 @@ snapshots: expect-type@1.1.0: {} - exponential-backoff@3.1.1: {} - extendable-error@0.1.7: {} external-editor@3.1.0: @@ -3660,8 +2534,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 - fast-memoize@2.5.2: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -3679,20 +2551,11 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data-encoder@2.1.4: {} - - fp-and-or@0.1.4: {} - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3705,36 +2568,13 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-minipass@3.0.3: - dependencies: - minipass: 7.0.4 - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - gauge@4.0.4: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - get-func-name@2.0.2: {} - get-stdin@8.0.0: {} - get-stream@6.0.1: {} glob-parent@5.1.2: @@ -3749,27 +2589,6 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3779,28 +2598,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - got@12.6.1: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - - graceful-fs@4.2.10: {} - graceful-fs@4.2.11: {} - has-unicode@2.0.1: {} - - has-yarn@3.0.0: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -3823,95 +2622,24 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hosted-git-info@5.2.1: - dependencies: - lru-cache: 7.18.3 - - hosted-git-info@6.1.1: - dependencies: - lru-cache: 7.18.3 - html-void-elements@3.0.0: {} - http-cache-semantics@4.1.1: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - human-id@1.0.2: {} human-signals@2.1.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - - ignore-walk@6.0.4: - dependencies: - minimatch: 9.0.3 - ignore@5.3.1: {} - import-lazy@4.0.0: {} - - imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - infer-owner@1.0.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@2.0.0: {} - - ini@4.1.2: {} - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -3924,33 +2652,16 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - - is-lambda@1.0.1: {} - - is-npm@6.0.0: {} - is-number@7.0.0: {} - is-obj@2.0.0: {} - - is-path-inside@3.0.3: {} - is-stream@2.0.1: {} is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-typedarray@1.0.0: {} - is-windows@1.0.2: {} - is-yarn-global@0.4.1: {} - isexe@2.0.0: {} jackspeak@2.3.6: @@ -3961,8 +2672,6 @@ snapshots: jiti@1.21.6: {} - jju@1.4.0: {} - joycon@3.1.1: {} js-yaml@3.14.1: @@ -3974,32 +2683,12 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@3.0.1: {} - - json-parse-helpfulerror@1.0.3: - dependencies: - jju: 1.4.0 - json5@2.2.3: {} jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - jsonlines@0.1.1: {} - - jsonparse@1.3.1: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kleur@4.1.5: {} - knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): dependencies: '@nodelib/fs.walk': 1.2.8 @@ -4022,10 +2711,6 @@ snapshots: zod: 3.22.4 zod-validation-error: 3.3.0(zod@3.22.4) - latest-version@7.0.0: - dependencies: - package-json: 8.1.1 - lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -4040,32 +2725,22 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash.sortby@4.7.0: {} lodash.startcase@4.4.0: {} - lodash@4.17.21: {} - loupe@3.1.1: dependencies: get-func-name: 2.0.2 loupe@3.1.3: {} - lowercase-keys@3.0.0: {} - lru-cache@10.2.0: {} lru-cache@6.0.0: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - lunr@2.3.9: {} magic-string@0.30.17: @@ -4075,48 +2750,6 @@ snapshots: make-error@1.3.6: optional: true - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.5.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - - make-fetch-happen@11.1.1: - dependencies: - agentkeepalive: 4.5.0 - cacache: 17.1.4 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.4 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.5 - transitivePeerDependencies: - - supports-color - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -4173,18 +2806,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -4195,58 +2816,8 @@ snapshots: minimist@1.2.8: {} - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-fetch@3.0.4: - dependencies: - minipass: 7.0.4 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-json-stream@1.0.1: - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.0.4: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - mri@1.2.0: {} ms@2.1.2: {} @@ -4261,136 +2832,16 @@ snapshots: nanoid@3.3.7: {} - negotiator@0.6.3: {} - - node-gyp@9.4.1: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.6.0 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - nopt@6.0.0: - dependencies: - abbrev: 1.1.1 - - normalize-package-data@5.0.0: - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.13.1 - semver: 7.6.0 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - normalize-url@8.0.1: {} - - npm-bundled@3.0.0: - dependencies: - npm-normalize-package-bin: 3.0.1 - - npm-check-updates@16.14.20: - dependencies: - '@types/semver-utils': 1.1.3 - chalk: 5.3.0 - cli-table3: 0.6.4 - commander: 10.0.1 - fast-memoize: 2.5.2 - find-up: 5.0.0 - fp-and-or: 0.1.4 - get-stdin: 8.0.0 - globby: 11.1.0 - hosted-git-info: 5.2.1 - ini: 4.1.2 - js-yaml: 4.1.0 - json-parse-helpfulerror: 1.0.3 - jsonlines: 0.1.1 - lodash: 4.17.21 - make-fetch-happen: 11.1.1 - minimatch: 9.0.3 - p-map: 4.0.0 - pacote: 15.2.0 - parse-github-url: 1.0.2 - progress: 2.0.3 - prompts-ncu: 3.0.0 - rc-config-loader: 4.1.3 - remote-git-tags: 3.0.0 - rimraf: 5.0.5 - semver: 7.6.0 - semver-utils: 1.1.4 - source-map-support: 0.5.21 - spawn-please: 2.0.2 - strip-ansi: 7.1.0 - strip-json-comments: 5.0.1 - untildify: 4.0.0 - update-notifier: 6.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - npm-install-checks@6.3.0: - dependencies: - semver: 7.6.0 - - npm-normalize-package-bin@3.0.1: {} - - npm-package-arg@10.1.0: - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.6.0 - validate-npm-package-name: 5.0.0 - - npm-packlist@7.0.4: - dependencies: - ignore-walk: 6.0.4 - - npm-pick-manifest@8.0.2: - dependencies: - npm-install-checks: 6.3.0 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.6.0 - - npm-registry-fetch@14.0.5: - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.4 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color + npm-check-updates@17.1.14: {} npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - object-assign@4.1.1: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -4411,8 +2862,6 @@ snapshots: outdent@0.5.0: {} - p-cancelable@3.0.0: {} - p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -4421,18 +2870,10 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@2.1.0: {} p-map@4.0.0: @@ -4441,47 +2882,12 @@ snapshots: p-try@2.2.0: {} - package-json@8.1.1: - dependencies: - got: 12.6.1 - registry-auth-token: 5.0.2 - registry-url: 6.0.1 - semver: 7.6.0 - package-manager-detector@0.2.9: {} - pacote@15.2.0: - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.4 - fs-minipass: 3.0.3 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.2 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.9.0 - ssri: 10.0.5 - tar: 6.2.1 - transitivePeerDependencies: - - bluebird - - supports-color - - parse-github-url@1.0.2: {} - parse-ms@4.0.0: {} path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -4533,66 +2939,14 @@ snapshots: dependencies: parse-ms: 4.0.0 - proc-log@3.0.0: {} - - progress@2.0.3: {} - - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - prompts-ncu@3.0.0: - dependencies: - kleur: 4.1.5 - sisteransi: 1.0.5 - property-information@6.5.0: {} - proto-list@1.2.4: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} - pupa@3.1.0: - dependencies: - escape-goat: 4.0.0 - queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - - rc-config-loader@4.1.3: - dependencies: - debug: 4.3.4 - js-yaml: 4.1.0 - json5: 2.2.3 - require-from-string: 2.0.2 - transitivePeerDependencies: - - supports-color - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - read-package-json-fast@3.0.2: - dependencies: - json-parse-even-better-errors: 3.0.1 - npm-normalize-package-bin: 3.0.1 - - read-package-json@6.0.4: - dependencies: - glob: 10.3.10 - json-parse-even-better-errors: 3.0.1 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -4600,12 +2954,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -4622,20 +2970,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - registry-auth-token@5.0.2: - dependencies: - '@pnpm/npm-conf': 2.2.2 - - registry-url@6.0.1: - dependencies: - rc: 1.2.8 - - remote-git-tags@3.0.0: {} - - require-from-string@2.0.2: {} - - resolve-alpn@1.2.1: {} - resolve-from@5.0.0: {} resolve@1.22.8: @@ -4644,22 +2978,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - - retry@0.12.0: {} - reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@5.0.5: - dependencies: - glob: 10.3.10 - rollup@4.13.0: dependencies: '@types/estree': 1.0.5 @@ -4683,22 +3003,12 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} - semver-diff@4.0.0: - dependencies: - semver: 7.6.0 - - semver-utils@1.1.4: {} - semver@7.6.0: dependencies: lru-cache: 6.0.0 - set-blocking@2.0.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4720,87 +3030,25 @@ snapshots: signal-exit@4.1.0: {} - sigstore@1.9.0: - dependencies: - '@sigstore/bundle': 1.1.0 - '@sigstore/protobuf-specs': 0.2.1 - '@sigstore/sign': 1.0.0 - '@sigstore/tuf': 1.0.3 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - - sisteransi@1.0.5: {} - slash@3.0.0: {} - smart-buffer@4.2.0: {} - smol-toml@1.2.2: {} - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.8.1 - transitivePeerDependencies: - - supports-color - - socks@2.8.1: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - source-map-js@1.2.0: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 space-separated-tokens@2.0.2: {} - spawn-please@2.0.2: - dependencies: - cross-spawn: 7.0.3 - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} - sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - - ssri@10.0.5: - dependencies: - minipass: 7.0.4 - - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - stackback@0.0.2: {} std-env@3.8.0: {} @@ -4817,10 +3065,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -4838,8 +3082,6 @@ snapshots: strip-final-newline@2.0.0: {} - strip-json-comments@2.0.1: {} - strip-json-comments@5.0.1: {} sucrase@3.35.0: @@ -4856,15 +3098,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - term-size@2.2.1: {} thenify-all@1.6.0: @@ -4951,22 +3184,6 @@ snapshots: - supports-color - ts-node - tuf-js@1.1.7: - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - - type-fest@1.4.0: {} - - type-fest@2.19.0: {} - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - typedoc-plugin-markdown@4.2.10(typedoc@0.26.11(typescript@5.5.3)): dependencies: typedoc: 0.26.11(typescript@5.5.3) @@ -4988,28 +3205,6 @@ snapshots: underscore@1.13.6: {} - undici-types@5.26.5: {} - - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - - unique-filename@3.0.0: - dependencies: - unique-slug: 4.0.0 - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 - - unique-slug@4.0.0: - dependencies: - imurmurhash: 0.1.4 - - unique-string@3.0.0: - dependencies: - crypto-random-string: 4.0.0 - unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -5035,39 +3230,9 @@ snapshots: universalify@0.1.2: {} - untildify@4.0.0: {} - - update-notifier@6.0.2: - dependencies: - boxen: 7.1.1 - chalk: 5.3.0 - configstore: 6.0.0 - has-yarn: 3.0.0 - import-lazy: 4.0.0 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - is-npm: 6.0.0 - is-yarn-global: 0.4.1 - latest-version: 7.0.0 - pupa: 3.1.0 - semver: 7.6.0 - semver-diff: 4.0.0 - xdg-basedir: 5.1.0 - - util-deprecate@1.0.2: {} - v8-compile-cache-lib@3.0.1: optional: true - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - validate-npm-package-name@5.0.0: - dependencies: - builtins: 5.0.1 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -5155,23 +3320,11 @@ snapshots: dependencies: isexe: 2.0.0 - which@3.0.1: - dependencies: - isexe: 2.0.0 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5184,17 +3337,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - xdg-basedir@5.1.0: {} - yallist@4.0.0: {} yaml@2.4.5: {} @@ -5204,8 +3346,6 @@ snapshots: yn@3.1.1: optional: true - yocto-queue@0.1.0: {} - zod-validation-error@3.3.0(zod@3.22.4): dependencies: zod: 3.22.4 From 145707cb0cbf4910f9afdeff92fa4fa838bd6465 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 09:15:12 -0800 Subject: [PATCH 521/722] Bump tsup --- js/package.json | 2 +- pnpm-lock.yaml | 845 +++++++++++++++++++++++------------------------- 2 files changed, 401 insertions(+), 446 deletions(-) diff --git a/js/package.json b/js/package.json index 481ec535..3bd4b5ba 100644 --- a/js/package.json +++ b/js/package.json @@ -41,7 +41,7 @@ "dotenv": "^16.4.5", "knip": "^5.25.1", "npm-check-updates": "^17.1.14", - "tsup": "^8.1.0", + "tsup": "^8.3.6", "typedoc": "^0.26.8", "typedoc-plugin-markdown": "^4.2.7", "typescript": "^5.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7157c642..aab882ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^17.1.14 version: 17.1.14 tsup: - specifier: ^8.1.0 - version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3) + specifier: ^8.3.6 + version: 8.3.6(jiti@1.21.6)(postcss@8.4.38)(typescript@5.5.3)(yaml@2.6.1) typedoc: specifier: ^0.26.8 version: 0.26.11(typescript@5.5.3) @@ -133,19 +133,15 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -155,9 +151,9 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -167,9 +163,9 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -179,9 +175,9 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -191,9 +187,9 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -203,9 +199,9 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -215,9 +211,9 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -227,9 +223,9 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -239,9 +235,9 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -251,9 +247,9 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -263,9 +259,9 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -275,9 +271,9 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -287,9 +283,9 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -299,9 +295,9 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -311,9 +307,9 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -323,9 +319,9 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -335,33 +331,45 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -371,9 +379,9 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -383,9 +391,9 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -395,9 +403,9 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -407,9 +415,9 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -429,18 +437,12 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -468,66 +470,161 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.34.3': + resolution: {integrity: sha512-8kq/NjMKkMTGKMPldWihncOl62kgnLYk7cW+/4NCUWfS70/wz4+gQ7rMxMMpZ3dIOP/xw7wKNzIuUnN/H2GfUg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.13.0': resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.34.3': + resolution: {integrity: sha512-1PqMHiuRochQ6++SDI7SaRDWJKr/NgAlezBi5nOne6Da6IWJo3hK0TdECBDwd92IUDPG4j/bZmWuwOnomNT8wA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.13.0': resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.34.3': + resolution: {integrity: sha512-fqbrykX4mGV3DlCDXhF4OaMGcchd2tmLYxVt3On5oOZWVDFfdEoYAV2alzNChl8OzNaeMAGqm1f7gk7eIw/uDg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.13.0': resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.34.3': + resolution: {integrity: sha512-8Wxrx/KRvMsTyLTbdrMXcVKfpW51cCNW8x7iQD72xSEbjvhCY3b+w83Bea3nQfysTMR7K28esc+ZFITThXm+1w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.3': + resolution: {integrity: sha512-lpBmV2qSiELh+ATQPTjQczt5hvbTLsE0c43Rx4bGxN2VpnAZWy77we7OO62LyOSZNY7CzjMoceRPc+Lt4e9J6A==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.3': + resolution: {integrity: sha512-sNPvBIXpgaYcI6mAeH13GZMXFrrw5mdZVI1M9YQPRG2LpjwL8DSxSIflZoh/B5NEuOi53kxsR/S2GKozK1vDXA==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.34.3': + resolution: {integrity: sha512-MW6N3AoC61OfE1VgnN5O1OW0gt8VTbhx9s/ZEPLBM11wEdHjeilPzOxVmmsrx5YmejpGPvez8QwGGvMU+pGxpw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.3': + resolution: {integrity: sha512-2SQkhr5xvatYq0/+H6qyW0zvrQz9LM4lxGkpWURLoQX5+yP8MsERh4uWmxFohOvwCP6l/+wgiHZ1qVwLDc7Qmw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.13.0': resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.34.3': + resolution: {integrity: sha512-R3JLYt8YoRwKI5shJsovLpcR6pwIMui/MGG/MmxZ1DYI3iRSKI4qcYrvYgDf4Ss2oCR3RL3F3dYK7uAGQgMIuQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.13.0': resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.34.3': + resolution: {integrity: sha512-4XQhG8v/t3S7Rxs7rmFUuM6j09hVrTArzONS3fUZ6oBRSN/ps9IPQjVhp62P0W3KhqJdQADo/MRlYRMdgxr/3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.3': + resolution: {integrity: sha512-QlW1jCUZ1LHUIYCAK2FciVw1ptHsxzApYVi05q7bz2A8oNE8QxQ85NhM4arLxkAlcnS42t4avJbSfzSQwbIaKg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.3': + resolution: {integrity: sha512-kMbLToizVeCcN69+nnm20Dh0hrRIAjgaaL+Wh0gWZcNt8e542d2FUGtsyuNsHVNNF3gqTJrpzUGIdwMGLEUM7g==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.13.0': resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.34.3': + resolution: {integrity: sha512-YgD0DnZ3CHtvXRH8rzjVSxwI0kMTr0RQt3o1N92RwxGdx7YejzbBO0ELlSU48DP96u1gYYVWfUhDRyaGNqJqJg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.3': + resolution: {integrity: sha512-dIOoOz8altjp6UjAi3U9EW99s8nta4gzi52FeI45GlPyrUH4QixUoBMH9VsVjt+9A2RiZBWyjYNHlJ/HmJOBCQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.13.0': resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.34.3': + resolution: {integrity: sha512-lOyG3aF4FTKrhpzXfMmBXgeKUUXdAWmP2zSNf8HTAXPqZay6QYT26l64hVizBjq+hJx3pl0DTEyvPi9sTA6VGA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.13.0': resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.34.3': + resolution: {integrity: sha512-usztyYLu2i+mYzzOjqHZTaRXbUOqw3P6laNUh1zcqxbPH1P2Tz/QdJJCQSnGxCtsRQeuU2bCyraGMtMumC46rw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.13.0': resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.34.3': + resolution: {integrity: sha512-ojFOKaz/ZyalIrizdBq2vyc2f0kFbJahEznfZlxdB6pF9Do6++i1zS5Gy6QLf8D7/S57MHrmBLur6AeRYeQXSA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.13.0': resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.34.3': + resolution: {integrity: sha512-K/V97GMbNa+Da9mGcZqmSl+DlJmWfHXTuI9V8oB2evGsQUtszCl67+OxWjBKpeOnYwox9Jpmt/J6VhpeRCYqow==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.13.0': resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.34.3': + resolution: {integrity: sha512-CUypcYP31Q8O04myV6NKGzk9GVXslO5EJNfmARNSzLF2A+5rmZUlDJ4et6eoJaZgBT9wrC2p4JZH04Vkic8HdQ==} + cpu: [x64] + os: [win32] + '@shikijs/core@1.23.1': resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} @@ -548,21 +645,12 @@ packages: engines: {node: '>=8.10'} hasBin: true - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -610,15 +698,6 @@ packages: '@vitest/utils@3.0.5': resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -646,13 +725,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -674,10 +746,6 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -689,11 +757,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bundle-require@4.0.2: - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' + esbuild: '>=0.18' cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -722,9 +790,9 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -755,26 +823,14 @@ packages: compare-versions@6.1.0: resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -802,10 +858,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -849,9 +901,9 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} hasBin: true esprima@4.0.1: @@ -862,10 +914,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} @@ -884,6 +932,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -919,10 +975,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -955,10 +1007,6 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -971,10 +1019,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -994,10 +1038,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -1089,9 +1129,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -1102,9 +1139,6 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1132,14 +1166,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1155,9 +1181,6 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1169,27 +1192,15 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - npm-check-updates@17.1.14: resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} hasBin: true - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - oniguruma-to-es@0.4.1: resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} @@ -1291,16 +1302,22 @@ packages: platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss@8.4.38: @@ -1334,9 +1351,9 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -1367,6 +1384,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.34.3: + resolution: {integrity: sha512-ORCtU0UBJyiAIn9m0llUXJXAswG/68pZptCrqxHG7//Z2DDzAUeyyY5hqf4XrsGlUxscMr9GkQ2QI7KTLqeyPw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1392,9 +1414,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1453,10 +1472,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-json-comments@5.0.1: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} @@ -1490,6 +1505,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1523,26 +1542,12 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tsup@8.1.0: - resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} + tsup@8.3.6: + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1606,9 +1611,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -1706,20 +1708,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.6.1: resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - zod-validation-error@3.3.0: resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} engines: {node: '>=18.0.0'} @@ -1891,147 +1884,148 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.2.2 - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - optional: true - '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.24.2': optional: true '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.24.2': optional: true '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/win32-arm64@0.20.2': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-ia32@0.20.2': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-x64@0.20.2': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.24.2': optional: true '@isaacs/cliui@8.0.2': @@ -2046,27 +2040,19 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - optional: true '@manypkg/find-root@1.1.0': dependencies: @@ -2102,42 +2088,99 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.13.0': optional: true + '@rollup/rollup-android-arm-eabi@4.34.3': + optional: true + '@rollup/rollup-android-arm64@4.13.0': optional: true + '@rollup/rollup-android-arm64@4.34.3': + optional: true + '@rollup/rollup-darwin-arm64@4.13.0': optional: true + '@rollup/rollup-darwin-arm64@4.34.3': + optional: true + '@rollup/rollup-darwin-x64@4.13.0': optional: true + '@rollup/rollup-darwin-x64@4.34.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.3': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.34.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.3': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.13.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.34.3': + optional: true + '@rollup/rollup-linux-arm64-musl@4.13.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.34.3': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.3': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.13.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.34.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.3': + optional: true + '@rollup/rollup-linux-x64-gnu@4.13.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.34.3': + optional: true + '@rollup/rollup-linux-x64-musl@4.13.0': optional: true + '@rollup/rollup-linux-x64-musl@4.34.3': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.13.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.34.3': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.13.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.34.3': + optional: true + '@rollup/rollup-win32-x64-msvc@4.13.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.34.3': + optional: true + '@shikijs/core@1.23.1': dependencies: '@shikijs/engine-javascript': 1.23.1 @@ -2171,20 +2214,10 @@ snapshots: ignore: 5.3.1 p-map: 4.0.0 - '@tsconfig/node10@1.0.11': - optional: true - - '@tsconfig/node12@1.0.11': - optional: true - - '@tsconfig/node14@1.0.3': - optional: true - - '@tsconfig/node16@1.0.4': - optional: true - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -2241,14 +2274,6 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - acorn-walk@8.3.3: - dependencies: - acorn: 8.12.1 - optional: true - - acorn@8.12.1: - optional: true - aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -2268,14 +2293,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@4.1.3: - optional: true - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -2292,8 +2309,6 @@ snapshots: dependencies: is-windows: 1.0.2 - binary-extensions@2.3.0: {} - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -2306,9 +2321,9 @@ snapshots: dependencies: fill-range: 7.1.1 - bundle-require@4.0.2(esbuild@0.21.5): + bundle-require@5.1.0(esbuild@0.24.2): dependencies: - esbuild: 0.21.5 + esbuild: 0.24.2 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -2336,17 +2351,9 @@ snapshots: check-error@2.1.1: {} - chokidar@3.6.0: + chokidar@4.0.3: dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 4.1.1 ci-info@3.9.0: {} @@ -2367,14 +2374,7 @@ snapshots: compare-versions@6.1.0: {} - create-require@1.1.1: - optional: true - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + consola@3.4.0: {} cross-spawn@7.0.6: dependencies: @@ -2382,10 +2382,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - debug@4.3.4: - dependencies: - ms: 2.1.2 - debug@4.4.0: dependencies: ms: 2.1.3 @@ -2405,9 +2401,6 @@ snapshots: dependencies: dequal: 2.0.3 - diff@4.0.2: - optional: true - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2472,31 +2465,33 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - esbuild@0.21.5: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 esprima@4.0.1: {} @@ -2504,18 +2499,6 @@ snapshots: dependencies: '@types/estree': 1.0.5 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - expect-type@1.1.0: {} extendable-error@0.1.7: {} @@ -2538,6 +2521,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -2553,7 +2540,7 @@ snapshots: foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 fs-extra@7.0.1: @@ -2575,8 +2562,6 @@ snapshots: get-func-name@2.0.2: {} - get-stream@6.0.1: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2585,7 +2570,7 @@ snapshots: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.5 minipass: 7.0.4 path-scurry: 1.10.1 @@ -2626,8 +2611,6 @@ snapshots: human-id@1.0.2: {} - human-signals@2.1.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -2636,10 +2619,6 @@ snapshots: indent-string@4.0.0: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -2654,8 +2633,6 @@ snapshots: is-number@7.0.0: {} - is-stream@2.0.1: {} - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -2747,9 +2724,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-error@1.3.6: - optional: true - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -2773,8 +2747,6 @@ snapshots: mdurl@2.0.0: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromark-util-character@2.1.1: @@ -2804,12 +2776,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-fn@2.1.0: {} - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -2820,8 +2786,6 @@ snapshots: mri@1.2.0: {} - ms@2.1.2: {} - ms@2.1.3: {} mz@2.7.0: @@ -2832,20 +2796,10 @@ snapshots: nanoid@3.3.7: {} - normalize-path@3.0.0: {} - npm-check-updates@17.1.14: {} - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - object-assign@4.1.1: {} - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - oniguruma-to-es@0.4.1: dependencies: emoji-regex-xs: 1.0.0 @@ -2919,13 +2873,13 @@ snapshots: platform@1.3.6: {} - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3)): + postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.38)(yaml@2.6.1): dependencies: lilconfig: 3.1.2 - yaml: 2.4.5 optionalDependencies: + jiti: 1.21.6 postcss: 8.4.38 - ts-node: 10.9.2(@types/node@18.18.6)(typescript@5.5.3) + yaml: 2.6.1 postcss@8.4.38: dependencies: @@ -2954,9 +2908,7 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 + readdirp@4.1.1: {} regenerator-runtime@0.14.1: {} @@ -2999,6 +2951,31 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 + rollup@4.34.3: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.3 + '@rollup/rollup-android-arm64': 4.34.3 + '@rollup/rollup-darwin-arm64': 4.34.3 + '@rollup/rollup-darwin-x64': 4.34.3 + '@rollup/rollup-freebsd-arm64': 4.34.3 + '@rollup/rollup-freebsd-x64': 4.34.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.3 + '@rollup/rollup-linux-arm-musleabihf': 4.34.3 + '@rollup/rollup-linux-arm64-gnu': 4.34.3 + '@rollup/rollup-linux-arm64-musl': 4.34.3 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.3 + '@rollup/rollup-linux-riscv64-gnu': 4.34.3 + '@rollup/rollup-linux-s390x-gnu': 4.34.3 + '@rollup/rollup-linux-x64-gnu': 4.34.3 + '@rollup/rollup-linux-x64-musl': 4.34.3 + '@rollup/rollup-win32-arm64-msvc': 4.34.3 + '@rollup/rollup-win32-ia32-msvc': 4.34.3 + '@rollup/rollup-win32-x64-msvc': 4.34.3 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3026,8 +3003,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} @@ -3080,8 +3055,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-json-comments@5.0.1: {} sucrase@3.35.0: @@ -3112,6 +3085,11 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -3136,53 +3114,38 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.6 - acorn: 8.12.1 - acorn-walk: 8.3.3 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optional: true - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - tsup@8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3))(typescript@5.5.3): + tsup@8.3.6(jiti@1.21.6)(postcss@8.4.38)(typescript@5.5.3)(yaml@2.6.1): dependencies: - bundle-require: 4.0.2(esbuild@0.21.5) + bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 - chokidar: 3.6.0 - debug: 4.3.4 - esbuild: 0.21.5 - execa: 5.1.1 - globby: 11.1.0 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.18.6)(typescript@5.5.3)) + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.38)(yaml@2.6.1) resolve-from: 5.0.0 - rollup: 4.13.0 + rollup: 4.34.3 source-map: 0.8.0-beta.0 sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: postcss: 8.4.38 typescript: 5.5.3 transitivePeerDependencies: + - jiti - supports-color - - ts-node + - tsx + - yaml typedoc-plugin-markdown@4.2.10(typedoc@0.26.11(typescript@5.5.3)): dependencies: @@ -3230,9 +3193,6 @@ snapshots: universalify@0.1.2: {} - v8-compile-cache-lib@3.0.1: - optional: true - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -3339,13 +3299,8 @@ snapshots: yallist@4.0.0: {} - yaml@2.4.5: {} - yaml@2.6.1: {} - yn@3.1.1: - optional: true - zod-validation-error@3.3.0(zod@3.22.4): dependencies: zod: 3.22.4 From a85d315f84440f127155d129e391e4d88adb5208 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 09:37:12 -0800 Subject: [PATCH 522/722] Bump packages --- js/package.json | 2 +- js/{vitest.config.ts => vitest.config.mts} | 0 pnpm-lock.yaml | 1028 ++++---------------- 3 files changed, 189 insertions(+), 841 deletions(-) rename js/{vitest.config.ts => vitest.config.mts} (100%) diff --git a/js/package.json b/js/package.json index 3bd4b5ba..8043215d 100644 --- a/js/package.json +++ b/js/package.json @@ -42,7 +42,7 @@ "knip": "^5.25.1", "npm-check-updates": "^17.1.14", "tsup": "^8.3.6", - "typedoc": "^0.26.8", + "typedoc": "^0.27.6", "typedoc-plugin-markdown": "^4.2.7", "typescript": "^5.5.3", "vitest": "^3.0.5" diff --git a/js/vitest.config.ts b/js/vitest.config.mts similarity index 100% rename from js/vitest.config.ts rename to js/vitest.config.mts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aab882ce..57a8bf2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,35 +24,35 @@ importers: dependencies: e2b: specifier: ^1.0.5 - version: 1.0.5 + version: 1.0.7 devDependencies: '@types/node': specifier: ^18.18.6 - version: 18.18.6 + version: 18.19.75 dotenv: specifier: ^16.4.5 - version: 16.4.5 + version: 16.4.7 knip: specifier: ^5.25.1 - version: 5.25.1(@types/node@18.18.6)(typescript@5.5.3) + version: 5.43.6(@types/node@18.19.75)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 version: 17.1.14 tsup: specifier: ^8.3.6 - version: 8.3.6(jiti@1.21.6)(postcss@8.4.38)(typescript@5.5.3)(yaml@2.6.1) + version: 8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) typedoc: - specifier: ^0.26.8 - version: 0.26.11(typescript@5.5.3) + specifier: ^0.27.6 + version: 0.27.6(typescript@5.7.3) typedoc-plugin-markdown: specifier: ^4.2.7 - version: 4.2.10(typedoc@0.26.11(typescript@5.5.3)) + version: 4.4.1(typedoc@0.27.6(typescript@5.7.3)) typescript: specifier: ^5.5.3 - version: 5.5.3 + version: 5.7.3 vitest: specifier: ^3.0.5 - version: 3.0.5(@types/node@18.18.6) + version: 3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -133,204 +133,102 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -343,12 +241,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -361,66 +253,39 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@gerrit0/mini-shiki@1.27.2': + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -453,53 +318,45 @@ packages: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} + '@nodelib/fs.scandir@4.0.1': + resolution: {integrity: sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw==} + engines: {node: '>=18.18.0'} + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + '@nodelib/fs.stat@4.0.0': + resolution: {integrity: sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg==} + engines: {node: '>=18.18.0'} + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nodelib/fs.walk@3.0.1': + resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==} + engines: {node: '>=18.18.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.13.0': - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.34.3': resolution: {integrity: sha512-8kq/NjMKkMTGKMPldWihncOl62kgnLYk7cW+/4NCUWfS70/wz4+gQ7rMxMMpZ3dIOP/xw7wKNzIuUnN/H2GfUg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.13.0': - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.34.3': resolution: {integrity: sha512-1PqMHiuRochQ6++SDI7SaRDWJKr/NgAlezBi5nOne6Da6IWJo3hK0TdECBDwd92IUDPG4j/bZmWuwOnomNT8wA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.13.0': - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.34.3': resolution: {integrity: sha512-fqbrykX4mGV3DlCDXhF4OaMGcchd2tmLYxVt3On5oOZWVDFfdEoYAV2alzNChl8OzNaeMAGqm1f7gk7eIw/uDg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.13.0': - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.34.3': resolution: {integrity: sha512-8Wxrx/KRvMsTyLTbdrMXcVKfpW51cCNW8x7iQD72xSEbjvhCY3b+w83Bea3nQfysTMR7K28esc+ZFITThXm+1w==} cpu: [x64] @@ -515,11 +372,6 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.34.3': resolution: {integrity: sha512-MW6N3AoC61OfE1VgnN5O1OW0gt8VTbhx9s/ZEPLBM11wEdHjeilPzOxVmmsrx5YmejpGPvez8QwGGvMU+pGxpw==} cpu: [arm] @@ -530,21 +382,11 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.13.0': - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.3': resolution: {integrity: sha512-R3JLYt8YoRwKI5shJsovLpcR6pwIMui/MGG/MmxZ1DYI3iRSKI4qcYrvYgDf4Ss2oCR3RL3F3dYK7uAGQgMIuQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.13.0': - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.3': resolution: {integrity: sha512-4XQhG8v/t3S7Rxs7rmFUuM6j09hVrTArzONS3fUZ6oBRSN/ps9IPQjVhp62P0W3KhqJdQADo/MRlYRMdgxr/3w==} cpu: [arm64] @@ -560,11 +402,6 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.3': resolution: {integrity: sha512-YgD0DnZ3CHtvXRH8rzjVSxwI0kMTr0RQt3o1N92RwxGdx7YejzbBO0ELlSU48DP96u1gYYVWfUhDRyaGNqJqJg==} cpu: [riscv64] @@ -575,70 +412,39 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.13.0': - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.3': resolution: {integrity: sha512-lOyG3aF4FTKrhpzXfMmBXgeKUUXdAWmP2zSNf8HTAXPqZay6QYT26l64hVizBjq+hJx3pl0DTEyvPi9sTA6VGA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.13.0': - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.3': resolution: {integrity: sha512-usztyYLu2i+mYzzOjqHZTaRXbUOqw3P6laNUh1zcqxbPH1P2Tz/QdJJCQSnGxCtsRQeuU2bCyraGMtMumC46rw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.13.0': - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.34.3': resolution: {integrity: sha512-ojFOKaz/ZyalIrizdBq2vyc2f0kFbJahEznfZlxdB6pF9Do6++i1zS5Gy6QLf8D7/S57MHrmBLur6AeRYeQXSA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.13.0': - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.3': resolution: {integrity: sha512-K/V97GMbNa+Da9mGcZqmSl+DlJmWfHXTuI9V8oB2evGsQUtszCl67+OxWjBKpeOnYwox9Jpmt/J6VhpeRCYqow==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.13.0': - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.3': resolution: {integrity: sha512-CUypcYP31Q8O04myV6NKGzk9GVXslO5EJNfmARNSzLF2A+5rmZUlDJ4et6eoJaZgBT9wrC2p4JZH04Vkic8HdQ==} cpu: [x64] os: [win32] - '@shikijs/core@1.23.1': - resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} - - '@shikijs/engine-javascript@1.23.1': - resolution: {integrity: sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==} + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@1.23.1': - resolution: {integrity: sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==} + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@1.23.1': - resolution: {integrity: sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==} - - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} @@ -654,21 +460,15 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.18.6': - resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} + '@types/node@18.19.75': + resolution: {integrity: sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/expect@3.0.5': resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} @@ -749,10 +549,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -767,9 +563,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} @@ -777,12 +570,6 @@ packages: changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -813,9 +600,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -847,27 +631,20 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@1.0.5: - resolution: {integrity: sha512-0c2xqNQfVcVBmETsd1bXWCYaN3iVl7m81dJVcjB7O2/c15A7t0s/FkydcZGzVvfZchj40/1f09AdjGX6nk1eNQ==} + e2b@1.0.7: + resolution: {integrity: sha512-7msagBbQ8tm51qaGp+hdaaaMjGG3zCzZtUS8bnz+LK7wdwtVTA1PmX+1Br9E3R7v6XIchnNWRpei+VjvGcfidA==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -876,15 +653,16 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -896,11 +674,6 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -925,12 +698,12 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} @@ -940,10 +713,6 @@ packages: picomatch: optional: true - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -969,9 +738,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -991,19 +757,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.3: - resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -1019,9 +772,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1053,8 +803,8 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true joycon@3.1.1: @@ -1069,17 +819,12 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - knip@5.25.1: - resolution: {integrity: sha512-vUopqkh/gOovZ05qYgTghZpmkM3b2eKYdLTsu11ZTYnYEcsdfQeZs6l4U7Rap4b+1KEDd/yydJsuWl+4NyEA9g==} - engines: {node: '>=18.6.0'} + knip@5.43.6: + resolution: {integrity: sha512-bUCFlg44imdV5vayYxu0pIAB373S8Ufjda0qaI9oRZDH6ltJFwUoAO2j7nafxDmo5G0ZeP4IiLAHqlc3wYIONQ==} + engines: {node: '>=18.18.0'} hasBin: true peerDependencies: '@types/node': '>=18' @@ -1133,9 +878,6 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -1143,25 +885,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1187,8 +910,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1201,9 +924,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - oniguruma-to-es@0.4.1: - resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} - openapi-fetch@0.9.8: resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} @@ -1256,9 +976,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -1274,12 +991,6 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1320,8 +1031,8 @@ packages: yaml: optional: true - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -1333,9 +1044,6 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1358,32 +1066,14 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@4.2.1: - resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@5.0.2: - resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.34.3: resolution: {integrity: sha512-ORCtU0UBJyiAIn9m0llUXJXAswG/68pZptCrqxHG7//Z2DDzAUeyyY5hqf4XrsGlUxscMr9GkQ2QI7KTLqeyPw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1408,9 +1098,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.23.1: - resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1422,21 +1109,18 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.2.2: - resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} + smol-toml@1.3.1: + resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} engines: {node: '>= 18'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1457,9 +1141,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1484,9 +1165,9 @@ packages: summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -1536,16 +1217,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tsup@8.3.6: resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} engines: {node: '>=18'} @@ -1565,21 +1239,21 @@ packages: typescript: optional: true - typedoc-plugin-markdown@4.2.10: - resolution: {integrity: sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ==} + typedoc-plugin-markdown@4.4.1: + resolution: {integrity: sha512-fx23nSCvewI9IR8lzIYtzDphETcgTDuxKcmHKGD4lo36oexC+B1k4NaCOY58Snqb4OlE8OXDAGVcQXYYuLRCNw==} engines: {node: '>= 18'} peerDependencies: - typedoc: 0.26.x + typedoc: 0.27.x - typedoc@0.26.11: - resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} + typedoc@0.27.6: + resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -1592,63 +1266,57 @@ packages: underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.5: resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.2.6: - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vitest@3.0.5: resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} @@ -1708,8 +1376,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -1722,9 +1390,6 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: '@babel/runtime@7.24.4': @@ -1884,150 +1549,87 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.2.2 - '@esbuild/aix-ppc64@0.20.2': - optional: true - '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.20.2': - optional: true - '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm@0.20.2': - optional: true - '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-x64@0.20.2': - optional: true - '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.20.2': - optional: true - '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-x64@0.20.2': - optional: true - '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.20.2': - optional: true - '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.20.2': - optional: true - '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.20.2': - optional: true - '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.20.2': - optional: true - '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ia32@0.20.2': - optional: true - '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-loong64@0.20.2': - optional: true - '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-mips64el@0.20.2': - optional: true - '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-ppc64@0.20.2': - optional: true - '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.20.2': - optional: true - '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-s390x@0.20.2': - optional: true - '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-x64@0.20.2': - optional: true - '@esbuild/linux-x64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.20.2': - optional: true - '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.20.2': - optional: true - '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.20.2': - optional: true - '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.20.2': - optional: true - '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.20.2': - optional: true - '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.20.2': - optional: true - '@esbuild/win32-x64@0.24.2': optional: true + '@gerrit0/mini-shiki@1.27.2': + dependencies: + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2075,37 +1677,37 @@ snapshots: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + '@nodelib/fs.scandir@4.0.1': + dependencies: + '@nodelib/fs.stat': 4.0.0 + run-parallel: 1.2.0 + '@nodelib/fs.stat@2.0.5': {} + '@nodelib/fs.stat@4.0.0': {} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.0 - '@pkgjs/parseargs@0.11.0': - optional: true + '@nodelib/fs.walk@3.0.1': + dependencies: + '@nodelib/fs.scandir': 4.0.1 + fastq: 1.19.0 - '@rollup/rollup-android-arm-eabi@4.13.0': + '@pkgjs/parseargs@0.11.0': optional: true '@rollup/rollup-android-arm-eabi@4.34.3': optional: true - '@rollup/rollup-android-arm64@4.13.0': - optional: true - '@rollup/rollup-android-arm64@4.34.3': optional: true - '@rollup/rollup-darwin-arm64@4.13.0': - optional: true - '@rollup/rollup-darwin-arm64@4.34.3': optional: true - '@rollup/rollup-darwin-x64@4.13.0': - optional: true - '@rollup/rollup-darwin-x64@4.34.3': optional: true @@ -2115,24 +1717,15 @@ snapshots: '@rollup/rollup-freebsd-x64@4.34.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.3': optional: true '@rollup/rollup-linux-arm-musleabihf@4.34.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.13.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.13.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.34.3': optional: true @@ -2142,71 +1735,38 @@ snapshots: '@rollup/rollup-linux-powerpc64le-gnu@4.34.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.3': optional: true '@rollup/rollup-linux-s390x-gnu@4.34.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.13.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.34.3': optional: true - '@rollup/rollup-linux-x64-musl@4.13.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.34.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.13.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.13.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.13.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.34.3': optional: true - '@shikijs/core@1.23.1': + '@shikijs/engine-oniguruma@1.29.2': dependencies: - '@shikijs/engine-javascript': 1.23.1 - '@shikijs/engine-oniguruma': 1.23.1 - '@shikijs/types': 1.23.1 - '@shikijs/vscode-textmate': 9.3.0 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.3 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.1 - '@shikijs/engine-javascript@1.23.1': + '@shikijs/types@1.29.2': dependencies: - '@shikijs/types': 1.23.1 - '@shikijs/vscode-textmate': 9.3.0 - oniguruma-to-es: 0.4.1 - - '@shikijs/engine-oniguruma@1.23.1': - dependencies: - '@shikijs/types': 1.23.1 - '@shikijs/vscode-textmate': 9.3.0 - - '@shikijs/types@1.23.1': - dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@10.0.1': {} '@snyk/github-codeowners@1.1.0': dependencies: @@ -2222,18 +1782,14 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/node@12.20.55': {} - '@types/node@18.18.6': {} + '@types/node@18.19.75': + dependencies: + undici-types: 5.26.5 '@types/unist@3.0.3': {} - '@ungap/structured-clone@1.2.0': {} - '@vitest/expect@3.0.5': dependencies: '@vitest/spy': 3.0.5 @@ -2241,13 +1797,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@5.2.6(@types/node@18.18.6))': + '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.2.6(@types/node@18.18.6) + vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.0.5': dependencies: @@ -2313,10 +1869,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -2328,8 +1880,6 @@ snapshots: cac@6.7.14: {} - ccount@2.0.1: {} - chai@5.1.2: dependencies: assertion-error: 2.0.1 @@ -2343,10 +1893,6 @@ snapshots: udc: 1.0.1 underscore: 1.13.6 - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - chardet@0.7.0: {} check-error@2.1.1: {} @@ -2368,8 +1914,6 @@ snapshots: color-name@1.1.4: {} - comma-separated-tokens@2.0.3: {} - commander@4.1.1: {} compare-versions@6.1.0: {} @@ -2393,21 +1937,15 @@ snapshots: clone: 1.0.4 optional: true - dequal@2.0.3: {} - detect-indent@6.1.0: {} - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dotenv@16.4.5: {} + dotenv@16.4.7: {} - e2b@1.0.5: + e2b@1.0.7: dependencies: '@bufbuild/protobuf': 2.2.2 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) @@ -2424,12 +1962,15 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 - emoji-regex-xs@1.0.0: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -2439,32 +1980,6 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild@0.20.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -2509,15 +2024,15 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 - fastq@1.17.1: + fastq@1.19.0: dependencies: reusify: 1.0.4 @@ -2525,10 +2040,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2558,8 +2069,6 @@ snapshots: fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - get-func-name@2.0.2: {} glob-parent@5.1.2: @@ -2578,37 +2087,13 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 graceful-fs@4.2.11: {} - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-util-to-html@9.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - html-void-elements@3.0.0: {} - human-id@1.0.2: {} iconv-lite@0.4.24: @@ -2619,10 +2104,6 @@ snapshots: indent-string@4.0.0: {} - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2647,7 +2128,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.6: {} + jiti@2.4.2: {} joycon@3.1.1: {} @@ -2660,31 +2141,28 @@ snapshots: dependencies: argparse: 2.0.1 - json5@2.2.3: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - knip@5.25.1(@types/node@18.18.6)(typescript@5.5.3): + knip@5.43.6(@types/node@18.19.75)(typescript@5.7.3): dependencies: - '@nodelib/fs.walk': 1.2.8 + '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 18.18.6 + '@types/node': 18.19.75 easy-table: 1.2.0 - fast-glob: 3.3.2 - jiti: 1.21.6 + enhanced-resolve: 5.18.1 + fast-glob: 3.3.3 + jiti: 2.4.2 js-yaml: 4.1.0 minimist: 1.2.8 - picocolors: 1.0.0 + picocolors: 1.1.1 picomatch: 4.0.2 pretty-ms: 9.0.0 - resolve: 1.22.8 - smol-toml: 1.2.2 + smol-toml: 1.3.1 strip-json-comments: 5.0.1 summary: 2.1.0 - tsconfig-paths: 4.2.0 - typescript: 5.5.3 + typescript: 5.7.3 zod: 3.22.4 zod-validation-error: 3.3.0(zod@3.22.4) @@ -2733,44 +2211,10 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - mdurl@2.0.0: {} merge2@1.4.1: {} - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.1: {} - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2794,18 +2238,12 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} npm-check-updates@17.1.14: {} object-assign@4.1.1: {} - oniguruma-to-es@0.4.1: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.0.2 - regex-recursion: 4.2.1 - openapi-fetch@0.9.8: dependencies: openapi-typescript-helpers: 0.0.8 @@ -2844,8 +2282,6 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 @@ -2857,10 +2293,6 @@ snapshots: pathval@2.0.0: {} - picocolors@1.0.0: {} - - picocolors@1.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -2873,19 +2305,19 @@ snapshots: platform@1.3.6: {} - postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.38)(yaml@2.6.1): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.1)(yaml@2.7.0): dependencies: lilconfig: 3.1.2 optionalDependencies: - jiti: 1.21.6 - postcss: 8.4.38 - yaml: 2.6.1 + jiti: 2.4.2 + postcss: 8.5.1 + yaml: 2.7.0 - postcss@8.4.38: + postcss@8.5.1: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 prettier@2.8.8: {} @@ -2893,8 +2325,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - property-information@6.5.0: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -2912,45 +2342,10 @@ snapshots: regenerator-runtime@0.14.1: {} - regex-recursion@4.2.1: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@5.0.2: - dependencies: - regex-utilities: 2.3.0 - resolve-from@5.0.0: {} - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} - rollup@4.13.0: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 - fsevents: 2.3.3 - rollup@4.34.3: dependencies: '@types/estree': 1.0.6 @@ -2992,31 +2387,20 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.23.1: - dependencies: - '@shikijs/core': 1.23.1 - '@shikijs/engine-javascript': 1.23.1 - '@shikijs/engine-oniguruma': 1.23.1 - '@shikijs/types': 1.23.1 - '@shikijs/vscode-textmate': 9.3.0 - '@types/hast': 3.0.4 - siginfo@2.0.0: {} signal-exit@4.1.0: {} slash@3.0.0: {} - smol-toml@1.2.2: {} + smol-toml@1.3.1: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -3040,11 +2424,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3069,7 +2448,7 @@ snapshots: summary@2.1.0: {} - supports-preserve-symlinks-flag@1.0.0: {} + tapable@2.2.1: {} term-size@2.2.1: {} @@ -3110,17 +2489,9 @@ snapshots: tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - ts-interface-checker@0.1.13: {} - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tsup@8.3.6(jiti@1.21.6)(postcss@8.4.38)(typescript@5.5.3)(yaml@2.6.1): + tsup@8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -3130,7 +2501,7 @@ snapshots: esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.38)(yaml@2.6.1) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.1)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.34.3 source-map: 0.8.0-beta.0 @@ -3139,28 +2510,28 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.38 - typescript: 5.5.3 + postcss: 8.5.1 + typescript: 5.7.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - typedoc-plugin-markdown@4.2.10(typedoc@0.26.11(typescript@5.5.3)): + typedoc-plugin-markdown@4.4.1(typedoc@0.27.6(typescript@5.7.3)): dependencies: - typedoc: 0.26.11(typescript@5.5.3) + typedoc: 0.27.6(typescript@5.7.3) - typedoc@0.26.11(typescript@5.5.3): + typedoc@0.27.6(typescript@5.7.3): dependencies: + '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.23.1 - typescript: 5.5.3 - yaml: 2.6.1 + typescript: 5.7.3 + yaml: 2.7.0 - typescript@5.5.3: {} + typescript@5.7.3: {} uc.micro@2.1.0: {} @@ -3168,71 +2539,46 @@ snapshots: underscore@1.13.6: {} - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + undici-types@5.26.5: {} universalify@0.1.2: {} - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite-node@3.0.5(@types/node@18.18.6): + vite-node@3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 5.2.6(@types/node@18.18.6) + vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml - vite@5.2.6(@types/node@18.18.6): + vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.13.0 + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.3 optionalDependencies: - '@types/node': 18.18.6 + '@types/node': 18.19.75 fsevents: 2.3.3 + jiti: 2.4.2 + yaml: 2.7.0 - vitest@3.0.5(@types/node@18.18.6): + vitest@3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.2.6(@types/node@18.18.6)) + '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.5 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -3248,20 +2594,24 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 5.2.6(@types/node@18.18.6) - vite-node: 3.0.5(@types/node@18.18.6) + vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 18.18.6 + '@types/node': 18.19.75 transitivePeerDependencies: + - jiti - less - lightningcss - msw - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml wcwidth@1.0.1: dependencies: @@ -3299,12 +2649,10 @@ snapshots: yallist@4.0.0: {} - yaml@2.6.1: {} + yaml@2.7.0: {} zod-validation-error@3.3.0(zod@3.22.4): dependencies: zod: 3.22.4 zod@3.22.4: {} - - zwitch@2.0.4: {} From a3ee33ddac81a69e8924977f5403270d58036219 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 20:25:45 -0800 Subject: [PATCH 523/722] Drop support for python 3.8 --- python/poetry.lock | 4 ++-- python/pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index c2fc636e..9d6f7cde 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1136,5 +1136,5 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "955ef39aa20e83c5efc82825bf120fbb1fbf87b8db4645cabb8f6241b37d862b" +python-versions = "^3.9" +content-hash = "5435d0ba1aa34f8515214810654e5c11a3bc34e7c12d52f9426c42f456d978a7" diff --git a/python/pyproject.toml b/python/pyproject.toml index dc118b04..9d219088 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -10,7 +10,7 @@ repository = "https://github.com/e2b-dev/code-interpreter/tree/main/python" packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] -python = "^3.8" +python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" From 83de9d35931dbd8928fe3fae9020840f2a40af65 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 20:32:57 -0800 Subject: [PATCH 524/722] Add changeset --- .changeset/honest-kids-tickle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/honest-kids-tickle.md diff --git a/.changeset/honest-kids-tickle.md b/.changeset/honest-kids-tickle.md new file mode 100644 index 00000000..6434beec --- /dev/null +++ b/.changeset/honest-kids-tickle.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': minor +--- + +Drop support for Python 3.8 From 98db9beaf21eefff84b2de2b6c01a6b1bbce8c69 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 5 Feb 2025 20:46:09 -0800 Subject: [PATCH 525/722] Update python in GHA to 3.9 --- .github/workflows/python_tests.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/release_candidates.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index dd63624a..3d653e82 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -23,7 +23,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.9' - name: Install and configure Poetry uses: snok/install-poetry@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 692b3794..b7a178dc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -266,7 +266,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.8" + python-version: "3.9" - name: Install and configure Poetry uses: snok/install-poetry@v1 diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 154b4208..52ef52bf 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -61,7 +61,7 @@ jobs: uses: actions/setup-python@v4 if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} with: - python-version: "3.8" + python-version: "3.9" - name: Install and configure Poetry uses: snok/install-poetry@v1 From 4819396d41e2898a96e83e6c5974295854835240 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 19 Feb 2025 17:17:47 +0100 Subject: [PATCH 526/722] Update CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index b6da0aa7..95443a03 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence. -* @jakubno @ValentaTomas +* @jakubno @ValentaTomas @0div From 89b55230c3be0ba5ecf48c4634f6d04c57c3c3ca Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 28 Feb 2025 16:37:10 +0100 Subject: [PATCH 527/722] Omit blank figure --- chart_data_extractor/e2b_charts/main.py | 10 +++++++++- .../tests/{graphs => charts}/test_bar.py | 0 chart_data_extractor/tests/charts/test_blank.py | 10 ++++++++++ .../tests/{graphs => charts}/test_box_and_whiskers.py | 0 .../tests/{graphs => charts}/test_categorical_scale.py | 0 .../tests/{graphs => charts}/test_datetime_scale.py | 0 .../tests/{graphs => charts}/test_line.py | 0 .../tests/{graphs => charts}/test_log_graph.py | 0 .../tests/{graphs => charts}/test_pie.py | 0 .../tests/{graphs => charts}/test_scatter.py | 0 .../tests/{graphs => charts}/test_supergraph.py | 0 .../tests/{graphs => charts}/test_unknown.py | 0 12 files changed, 19 insertions(+), 1 deletion(-) rename chart_data_extractor/tests/{graphs => charts}/test_bar.py (100%) create mode 100644 chart_data_extractor/tests/charts/test_blank.py rename chart_data_extractor/tests/{graphs => charts}/test_box_and_whiskers.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_categorical_scale.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_datetime_scale.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_line.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_log_graph.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_pie.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_scatter.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_supergraph.py (100%) rename chart_data_extractor/tests/{graphs => charts}/test_unknown.py (100%) diff --git a/chart_data_extractor/e2b_charts/main.py b/chart_data_extractor/e2b_charts/main.py index 7e748add..7f51dbbd 100644 --- a/chart_data_extractor/e2b_charts/main.py +++ b/chart_data_extractor/e2b_charts/main.py @@ -88,6 +88,14 @@ def get_chart_from_ax( return chart +def is_figure_blank(axes: List[Axes]) -> bool: + """Check if a Matplotlib figure is blank (has no user-added artists).""" + for ax in axes: + if ax.has_data(): + return False # The figure contains user-added data + return True # No data found, figure is blank + + def chart_figure_to_chart(figure: Figure) -> Optional[Chart]: """ This method is used to extract data from the figure object to a dictionary @@ -95,7 +103,7 @@ def chart_figure_to_chart(figure: Figure) -> Optional[Chart]: # Get all Axes objects from the Figure axes = figure.get_axes() - if not axes: + if not axes or is_figure_blank(axes): return elif len(axes) > 1: return SuperChart(figure=figure) diff --git a/chart_data_extractor/tests/graphs/test_bar.py b/chart_data_extractor/tests/charts/test_bar.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_bar.py rename to chart_data_extractor/tests/charts/test_bar.py diff --git a/chart_data_extractor/tests/charts/test_blank.py b/chart_data_extractor/tests/charts/test_blank.py new file mode 100644 index 00000000..5aa77861 --- /dev/null +++ b/chart_data_extractor/tests/charts/test_blank.py @@ -0,0 +1,10 @@ +import matplotlib.pyplot as plt + +from e2b_charts import chart_figure_to_chart +from e2b_charts.charts import BarChart, ChartType + + +def test_blank_chart(): + figure, _ = plt.subplots() + chart = chart_figure_to_chart(figure) + assert chart is None diff --git a/chart_data_extractor/tests/graphs/test_box_and_whiskers.py b/chart_data_extractor/tests/charts/test_box_and_whiskers.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_box_and_whiskers.py rename to chart_data_extractor/tests/charts/test_box_and_whiskers.py diff --git a/chart_data_extractor/tests/graphs/test_categorical_scale.py b/chart_data_extractor/tests/charts/test_categorical_scale.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_categorical_scale.py rename to chart_data_extractor/tests/charts/test_categorical_scale.py diff --git a/chart_data_extractor/tests/graphs/test_datetime_scale.py b/chart_data_extractor/tests/charts/test_datetime_scale.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_datetime_scale.py rename to chart_data_extractor/tests/charts/test_datetime_scale.py diff --git a/chart_data_extractor/tests/graphs/test_line.py b/chart_data_extractor/tests/charts/test_line.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_line.py rename to chart_data_extractor/tests/charts/test_line.py diff --git a/chart_data_extractor/tests/graphs/test_log_graph.py b/chart_data_extractor/tests/charts/test_log_graph.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_log_graph.py rename to chart_data_extractor/tests/charts/test_log_graph.py diff --git a/chart_data_extractor/tests/graphs/test_pie.py b/chart_data_extractor/tests/charts/test_pie.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_pie.py rename to chart_data_extractor/tests/charts/test_pie.py diff --git a/chart_data_extractor/tests/graphs/test_scatter.py b/chart_data_extractor/tests/charts/test_scatter.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_scatter.py rename to chart_data_extractor/tests/charts/test_scatter.py diff --git a/chart_data_extractor/tests/graphs/test_supergraph.py b/chart_data_extractor/tests/charts/test_supergraph.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_supergraph.py rename to chart_data_extractor/tests/charts/test_supergraph.py diff --git a/chart_data_extractor/tests/graphs/test_unknown.py b/chart_data_extractor/tests/charts/test_unknown.py similarity index 100% rename from chart_data_extractor/tests/graphs/test_unknown.py rename to chart_data_extractor/tests/charts/test_unknown.py From 6262c4de1b805499f5ef533caed31c6bb32af82a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 28 Feb 2025 16:49:39 +0100 Subject: [PATCH 528/722] Add changeset --- .changeset/red-onions-check.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/red-onions-check.md diff --git a/.changeset/red-onions-check.md b/.changeset/red-onions-check.md new file mode 100644 index 00000000..6ebd7099 --- /dev/null +++ b/.changeset/red-onions-check.md @@ -0,0 +1,5 @@ +--- +'@e2b/data-extractor': patch +--- + +Omit blank figures From b1617a4009503c2ba7451853c90aae0a67016970 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 28 Feb 2025 17:25:16 +0100 Subject: [PATCH 529/722] Fix test --- python/tests/charts/test_scale.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/charts/test_scale.py b/python/tests/charts/test_scale.py index e4e690f5..221ef04e 100644 --- a/python/tests/charts/test_scale.py +++ b/python/tests/charts/test_scale.py @@ -9,7 +9,7 @@ async def test_datetime_scale(async_sandbox: AsyncSandbox): import datetime # Generate x values - dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(10)] + dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100)] y_sin = np.sin(np.linspace(0, 2*np.pi, 100)) # Create the plot From 5c9d48304846274137e1cce24e8e7af89d0890ff Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 28 Feb 2025 17:26:17 +0100 Subject: [PATCH 530/722] Fix test --- js/tests/charts/scales.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/tests/charts/scales.test.ts b/js/tests/charts/scales.test.ts index 6b6716f4..32a3ecb4 100644 --- a/js/tests/charts/scales.test.ts +++ b/js/tests/charts/scales.test.ts @@ -8,7 +8,7 @@ sandboxTest('datetime scale', async ({ sandbox }) => { import datetime # Generate x values - dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(10)] + dates = [datetime.date(2023, 9, 1) + datetime.timedelta(seconds=i) for i in range(100)] y_sin = np.sin(np.linspace(0, 2*np.pi, 100)) # Create the plot From ef48f6cea0ccbe327bf2971578e6df78688b4ef5 Mon Sep 17 00:00:00 2001 From: Dennis Rall <56480601+dennisrall@users.noreply.github.com> Date: Sat, 1 Mar 2025 00:18:20 +0100 Subject: [PATCH 531/722] fix: use correct name of variable --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d718fb34..5b93712b 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ JavaScript / TypeScript ```ts import { Sandbox } from '@e2b/code-interpreter' -const sandbox = await Sandbox.create() +const sbx = await Sandbox.create() await sbx.runCode('x = 1') const execution = await sbx.runCode('x+=1; x') From 7a18dc2cd9c51b5179c564b13e5a8e9294ba16e6 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Mon, 10 Mar 2025 22:12:50 +0100 Subject: [PATCH 532/722] chore: update broken docs readme links for custom templating --- template/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/template/README.md b/template/README.md index 4d00d588..6e70302e 100644 --- a/template/README.md +++ b/template/README.md @@ -1,10 +1,10 @@ # Using custom sandbox with Code Interpreter SDK -If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled package) you can do that by using a [custom sandbox template](https://e2b.dev/docs/sandbox/templates/overview). +If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled package) you can do that by using a [custom sandbox template](https://e2b.dev/docs/sandbox-template). ## Step-by-step guide -1. Create custom sandbox by following [this guide](https://e2b.dev/docs/guide/custom-sandbox) +1. Create custom sandbox by following [this guide](https://e2b.dev/docs/sandbox-template) 2. Use prebuilt [E2B Code Interpreter image](https://hub.docker.com/r/e2bdev/code-interpreter) by replacing the `FROM` command in your `e2b.Dockerfile` with following From f651795436b5fc164c0538aadec3539d7a2a0839 Mon Sep 17 00:00:00 2001 From: Vasek Mlejnsky Date: Thu, 13 Mar 2025 11:37:30 +0100 Subject: [PATCH 533/722] Merge pull request #64 from e2b-dev/mlejva-patch-1 Update CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 95443a03..fef21ce8 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence. -* @jakubno @ValentaTomas @0div +* @jakubno @ValentaTomas @0div @mishushakov From c30f7e993495a842aa1aaab530468de18e400acc Mon Sep 17 00:00:00 2001 From: 0div Date: Thu, 13 Mar 2025 11:15:13 -0700 Subject: [PATCH 534/722] pin typdoc and typedoc-markdown to non-breaking versions in js-sdk --- js/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/package.json b/js/package.json index 8043215d..e2dedc8a 100644 --- a/js/package.json +++ b/js/package.json @@ -42,8 +42,8 @@ "knip": "^5.25.1", "npm-check-updates": "^17.1.14", "tsup": "^8.3.6", - "typedoc": "^0.27.6", - "typedoc-plugin-markdown": "^4.2.7", + "typedoc": "0.26.8", + "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.5.3", "vitest": "^3.0.5" }, From 455d71794cb793522deee595df848300ea34eb6d Mon Sep 17 00:00:00 2001 From: 0div Date: Thu, 13 Mar 2025 11:30:51 -0700 Subject: [PATCH 535/722] update pnpm lockfile --- pnpm-lock.yaml | 323 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 300 insertions(+), 23 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57a8bf2d..f59a4eb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,11 +42,11 @@ importers: specifier: ^8.3.6 version: 8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) typedoc: - specifier: ^0.27.6 - version: 0.27.6(typescript@5.7.3) + specifier: 0.26.8 + version: 0.26.8(typescript@5.7.3) typedoc-plugin-markdown: - specifier: ^4.2.7 - version: 4.4.1(typedoc@0.27.6(typescript@5.7.3)) + specifier: 4.2.7 + version: 4.2.7(typedoc@0.26.8(typescript@5.7.3)) typescript: specifier: ^5.5.3 version: 5.7.3 @@ -283,9 +283,6 @@ packages: cpu: [x64] os: [win32] - '@gerrit0/mini-shiki@1.27.2': - resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -437,9 +434,21 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@1.29.2': + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + + '@shikijs/engine-javascript@1.29.2': + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + '@shikijs/engine-oniguruma@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/langs@1.29.2': + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + + '@shikijs/themes@1.29.2': + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} @@ -460,6 +469,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -469,6 +481,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/expect@3.0.5': resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} @@ -563,6 +578,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} @@ -570,6 +588,12 @@ packages: changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -600,6 +624,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -631,10 +658,17 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -653,6 +687,9 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -757,6 +794,15 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -878,6 +924,9 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -885,6 +934,21 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -924,6 +988,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + openapi-fetch@0.9.8: resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} @@ -1044,6 +1111,9 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1066,6 +1136,15 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1098,6 +1177,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1121,6 +1203,9 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1141,6 +1226,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1217,6 +1305,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -1239,18 +1330,18 @@ packages: typescript: optional: true - typedoc-plugin-markdown@4.4.1: - resolution: {integrity: sha512-fx23nSCvewI9IR8lzIYtzDphETcgTDuxKcmHKGD4lo36oexC+B1k4NaCOY58Snqb4OlE8OXDAGVcQXYYuLRCNw==} + typedoc-plugin-markdown@4.2.7: + resolution: {integrity: sha512-bLsQdweSm48P9j6kGqQ3/4GCH5zu2EnURSkkxqirNc+uVFE9YK825ogDw+WbNkRHIV6eZK/1U43gT7YfglyYOg==} engines: {node: '>= 18'} peerDependencies: - typedoc: 0.27.x + typedoc: 0.26.x - typedoc@0.27.6: - resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} + typedoc@0.26.8: + resolution: {integrity: sha512-QBF0BMbnNeUc6U7pRHY7Jb8pjhmiNWZNQT8LU6uk9qP9t3goP9bJptdlNqMC0wBB2w9sQrxjZt835bpRSSq1LA==} engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} @@ -1269,10 +1360,31 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.0.5: resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1390,6 +1502,9 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@babel/runtime@7.24.4': @@ -1624,12 +1739,6 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@gerrit0/mini-shiki@1.27.2': - dependencies: - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1756,11 +1865,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.34.3': optional: true + '@shikijs/core@1.29.2': + dependencies: + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 2.3.0 + '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/langs@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + + '@shikijs/themes@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.1 @@ -1782,6 +1914,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/node@12.20.55': {} '@types/node@18.19.75': @@ -1790,6 +1926,8 @@ snapshots: '@types/unist@3.0.3': {} + '@ungap/structured-clone@1.3.0': {} + '@vitest/expect@3.0.5': dependencies: '@vitest/spy': 3.0.5 @@ -1880,6 +2018,8 @@ snapshots: cac@6.7.14: {} + ccount@2.0.1: {} + chai@5.1.2: dependencies: assertion-error: 2.0.1 @@ -1893,6 +2033,10 @@ snapshots: udc: 1.0.1 underscore: 1.13.6 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -1914,6 +2058,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@4.1.1: {} compare-versions@6.1.0: {} @@ -1937,8 +2083,14 @@ snapshots: clone: 1.0.4 optional: true + dequal@2.0.3: {} + detect-indent@6.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -1962,6 +2114,8 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -2094,6 +2248,26 @@ snapshots: graceful-fs@4.2.11: {} + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + html-void-elements@3.0.0: {} + human-id@1.0.2: {} iconv-lite@0.4.24: @@ -2211,10 +2385,39 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdurl@2.0.0: {} merge2@1.4.1: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2244,6 +2447,12 @@ snapshots: object-assign@4.1.1: {} + oniguruma-to-es@2.3.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + openapi-fetch@0.9.8: dependencies: openapi-typescript-helpers: 0.0.8 @@ -2325,6 +2534,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + property-information@7.0.0: {} + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -2342,6 +2553,17 @@ snapshots: regenerator-runtime@0.14.1: {} + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + resolve-from@5.0.0: {} reusify@1.0.4: {} @@ -2387,6 +2609,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@1.29.2: + dependencies: + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -2401,6 +2634,8 @@ snapshots: dependencies: whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -2424,6 +2659,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2489,6 +2729,8 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + ts-interface-checker@0.1.13: {} tsup@8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): @@ -2518,16 +2760,16 @@ snapshots: - tsx - yaml - typedoc-plugin-markdown@4.4.1(typedoc@0.27.6(typescript@5.7.3)): + typedoc-plugin-markdown@4.2.7(typedoc@0.26.8(typescript@5.7.3)): dependencies: - typedoc: 0.27.6(typescript@5.7.3) + typedoc: 0.26.8(typescript@5.7.3) - typedoc@0.27.6(typescript@5.7.3): + typedoc@0.26.8(typescript@5.7.3): dependencies: - '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 + shiki: 1.29.2 typescript: 5.7.3 yaml: 2.7.0 @@ -2541,8 +2783,41 @@ snapshots: undici-types@5.26.5: {} + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@0.1.2: {} + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-node@3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 @@ -2656,3 +2931,5 @@ snapshots: zod: 3.22.4 zod@3.22.4: {} + + zwitch@2.0.4: {} From 916390e04b763008fe91605e7cd68fe29af3f27b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 13 Mar 2025 18:53:43 +0000 Subject: [PATCH 536/722] [skip ci] Release new versions --- .changeset/honest-kids-tickle.md | 5 - .changeset/red-onions-check.md | 5 - chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.0.4/messaging/page.mdx | 2 - .../v1.1.0/sandbox/page.mdx | 722 ++++++++++++++++++ 8 files changed, 726 insertions(+), 16 deletions(-) delete mode 100644 .changeset/honest-kids-tickle.md delete mode 100644 .changeset/red-onions-check.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx diff --git a/.changeset/honest-kids-tickle.md b/.changeset/honest-kids-tickle.md deleted file mode 100644 index 6434beec..00000000 --- a/.changeset/honest-kids-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor ---- - -Drop support for Python 3.8 diff --git a/.changeset/red-onions-check.md b/.changeset/red-onions-check.md deleted file mode 100644 index 6ebd7099..00000000 --- a/.changeset/red-onions-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/data-extractor': patch ---- - -Omit blank figures diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 62bf9e57..8135e77c 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.2", + "version": "0.0.3", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 1b2e3042..6ca00367 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.2" +version = "0.0.3" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "Apache-2.0" diff --git a/python/package.json b/python/package.json index 4eb2aa20..e7ce07a5 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.0.5", + "version": "1.1.0", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 9d219088..fb8e7447 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.0.5" +version = "1.1.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx index e816e6d3..4b3c4ed9 100644 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx +++ b/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx @@ -38,8 +38,6 @@ new Execution( ### text -###### Get Signature - ```ts get text(): undefined | string ``` diff --git a/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx new file mode 100644 index 00000000..86e0dfaf --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From 6c0bb19dd50e6408391918096ba729a3980c3ec5 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 14 Mar 2025 10:09:54 +0100 Subject: [PATCH 537/722] Send releases notification to dedicated channel --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7a178dc..cb4920c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -342,3 +342,4 @@ jobs: SLACK_MESSAGE: ":here-we-go-again: :bob-the-destroyer: We need :fix-parrot: ASAP :pray:" SLACK_TITLE: Code Interpreter Release Failed SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + SLACK_CHANNEL: "monitoring-releases" From 3fe798e18b8ea0fbfbdc3fe02aa9f8deae33381b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 18 Mar 2025 15:21:17 +0100 Subject: [PATCH 538/722] Fix `to_json` method for charts (#68) * Fix `to_json` method for charts * Add changeset --- .changeset/smart-turkeys-study.md | 5 +++++ python/e2b_code_interpreter/models.py | 9 ++++++++- python/tests/charts/test_json.py | 27 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .changeset/smart-turkeys-study.md create mode 100644 python/tests/charts/test_json.py diff --git a/.changeset/smart-turkeys-study.md b/.changeset/smart-turkeys-study.md new file mode 100644 index 00000000..5f346834 --- /dev/null +++ b/.changeset/smart-turkeys-study.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Fix json serialization for Result object diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 04df1a0e..13170a4c 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -317,9 +317,16 @@ def serialize_results(results: List[Result]) -> List[Dict[str, str]]: """ serialized = [] for result in results: - serialized_dict = {key: result[key] for key in result.formats()} + serialized_dict = {} + for key in result.formats(): + if key == "chart": + serialized_dict[key] = result.chart.to_dict() + else: + serialized_dict[key] = result[key] + serialized_dict["text"] = result.text serialized.append(serialized_dict) + return serialized diff --git a/python/tests/charts/test_json.py b/python/tests/charts/test_json.py new file mode 100644 index 00000000..f0dbb189 --- /dev/null +++ b/python/tests/charts/test_json.py @@ -0,0 +1,27 @@ +import json + +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +code = """ +import matplotlib.pyplot as plt +import numpy as np + +# Create data +N = 5 +x = np.random.rand(N) +y = np.random.rand(N) + +plt.xlabel("A") + +plt.scatter(x, y, c='blue', label='Dataset') + +plt.show() +""" + + +async def test_scatter_chart(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code(code) + serialized = result.to_json() + assert isinstance(serialized, str) + + assert json.loads(serialized)["results"][0]["chart"]["type"] == "scatter" From 7dc2a3f1802dfcdfd1e445542b516d828031b17d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 18 Mar 2025 14:24:21 +0000 Subject: [PATCH 539/722] [skip ci] Release new versions --- .changeset/smart-turkeys-study.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.1.1/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/smart-turkeys-study.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx diff --git a/.changeset/smart-turkeys-study.md b/.changeset/smart-turkeys-study.md deleted file mode 100644 index 5f346834..00000000 --- a/.changeset/smart-turkeys-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Fix json serialization for Result object diff --git a/python/package.json b/python/package.json index e7ce07a5..d5091ef0 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.1.0", + "version": "1.1.1", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index fb8e7447..9b97f234 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.1.0" +version = "1.1.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx new file mode 100644 index 00000000..86e0dfaf --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From af59b5f06d2e6744c8bca9d9470590d161f7b200 Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Sat, 22 Mar 2025 11:29:31 +0100 Subject: [PATCH 540/722] updated readme preview image --- README.md | 7 +++++-- readme-assets/e2b-code-interpreter-dark.png | Bin 0 -> 116085 bytes readme-assets/e2b-code-interpreter-light.png | Bin 0 -> 101240 bytes 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 readme-assets/e2b-code-interpreter-dark.png create mode 100644 readme-assets/e2b-code-interpreter-light.png diff --git a/README.md b/README.md index 5b93712b..e2d42665 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ -

+ + +![E2B Code Interpreter Preview](/readme-assets/e2b-code-interpreter-light.png#gh-light-mode-only) +![E2B Code Interpreter Preview](/readme-assets/e2b-code-interpreter-dark.png#gh-dark-mode-only)

diff --git a/readme-assets/e2b-code-interpreter-dark.png b/readme-assets/e2b-code-interpreter-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..723ca497f95cad66ec7b37134f94c8916de2d718 GIT binary patch literal 116085 zcmY)Vdpy(s`v;CEMMshj&MK8eIo51WiKgTb${})Sv?Rk0ISi{5shMO#%qpkkltY+v zDP!1ZBFrhanX|^`yx+XupWpBI{r=(beBQX-9*^tsxbD|=zhC#o-mtOQzejG*wr$(? zU%P5jM8i)Z2)4>BxQBsED@8&py{XkNX~o z&60kWzq5ohiX1y*B>$7(d`#}*cGd5`<|l31;EY$(dW!T{`(dYcfhtbDF#mP@yYH>R z&uP`i*Tv`AP>f+rCAi}&&zPTqm|F=|_Vt@H;wwO?7kUk$9T%GAAoXKEk9w>Rxu|91 z?JYweY_=0ubYpsJhL(yd@q$+3dTXCx#YDiKE?wCK%}y)Mg^>HEiW?#wE!CJXE_;(f zG(e9&KT6$Pju$LXH*8c29zFUUSh&W;Y|uDXaQ%&LQL1Qx9)3;uafhgPV;N~}F| z7#?l2uS~E`6mUn^gJ$8IH+Z?2)m#hqAHk}JVCubi#M|SUHj}Hfx8rD3FO$sV3%&e$ zew|rOxDyU;Oc$G@`cJMJ5RJ}{=fWb}9_7U-{E;9(g&|$U`s#HqMa0uez8HhLePpLO z)P)j_CA*xAg0UcOT7*4yt~)it-eb~vDVCN_1HR>5Bk**|dM40R&?Z^1tQ_;N4hXJU z*K7w?EMcZyhSl-*v!~}iHRTFps>Zzcz2g+1NU+f$;Fk%XgXOWW<>ZPJAyIz6Jyx${ zIGw7>H%1JYi%apF6Y&y0a~Q#zB>2X@_1a4+58p(y3rq3b+t*yl<2GG|T`Skd*QsoN zE!#-EX%4edELaLu%%x!#G&g@X1;`|$0&hesK)wgf6S&wX&g5@+GfkWQR4Y`QAQ=%2Ocf3_{Ip+z!n$cwswp>S?T)5>A0s{h{| zwj_nNbA#C7ba90kgfO1J6~??YaH@j%BzsC3YY@71rPY|=e;OGh=dWTAyv5;WUrrJBW>GZCKzIjI(XS zn-5@Bwl^6pT`+{4B!99|zK}u}iw;;Vuyc)(8heBKW%^iR)zSt0@V%MJre!7Wy&jH! z#O7U|0kgAXd9vmGeu{p*(V$GX_Agr?`B^Yn&=~|4RN`N1P?*E@=O7 z$dMxI(C<6}Z|IHRj*hy-e%avnEay&R%bYYXC+<4?8tCLDa>-6ld!1KiE*dFUT8U&={R{QEWNVafT!{0LTXU**N^k`q+s*EuIPuL+H*TTD z$0QXZyHWZX;_^MTz2!*Di}dNH45h2=p0^CkVDP(#99oNX>nB;Q!N1yrve!h@ZP}}D zVa-8rwTHO1?+qNX7I1DLH*Ecw;4w}qJv*mKH$pCgb_k8#J&bVA8#okztE^7aExa>X zfs5EaFb2SB3gS7tvaw;C%9(f4(^fDAc>4_Txz$aRZ?udg;f?rTP}~m6(6qn2xxG8; zOtUkVfp^HUJ1Sb?TfqQCfy}#8epy=VMp?yYLt=JGEjH>! zX&iEU-T<5rOr0UkU7O4yPF{q+(6-$GRj$LbZcr9*4CFqN<|~^gNaG2^mSMy`2R`yL z^N-T2)fQSGuVmL@CU0_<a8~ofs zUK1*LtIMul##0*KNKX}ThbI38gP*0UjokMDZWcR>leKMR#vdDxJ_{OFST)BhqEI_N ziVl`vS3YBg(~AbDEnr#%kcoRXa~sO)*?9J~|JOxA;}D&ornzdt;=MSh9) zxxq44G2iZ~K&^Aq8oB%FtAy*8cb8 zq88jCI_Ozz^)ijUp?D zU2||37D(0nlY#bf0UM#@70pf7iCOfs0_e)xkf20ZWHV~V*7l~(5&r*o(GZIL z+qnEvRDA3+*qaix!}IZl6F>BV`_4QX_I(o0jD%QDFkzfY4dLL!%d$Ll=$APNn^xn=@{Gbd|8$~ldmZsKGF|HFg zFrBzGB!%v&^04K_&XJDNK0oBOR#^SaK0nz$2Wo+*zeZ^)Px-h~wNZVM8KP^UR+YX@ ztg4A{2YyNDHqZc0(SsV5=a)Ue)meMZPNda3B6Qgzn7#U*@S!QIyF*jhE>q4hO7Wx+ za4#qfUntzd;Qs-!>`3B@%yaEy(h(m=`|c}zeEcbDA!RtI+w&0Zh2jwEzzrg3c0)uh z+0MNC7EWh!{<4G$06t-dqq$ahLCtqJaCKHKtdx_`{hhcqh28!><%i&4!7lJ4`i)qz z)jR`&)C6ky#E0R&jB4FGawz2M*aWNH)n&HehgKv*_epQ!>s%v(R$t6|5yFeoamYJE zeM$?Q*R}{j6n{Y4Kjhp?zjs?RlVmU4rxw!_+)>DSl5nx3&m}jIidJ$sV)TcekF}f*SUn5c%=xonB8(ar{!a zZBs2c6w~zBKXr+Rbj{&D3l?U@Oii`5Vp3kMH+bBc#aeKAD~4v~K)faa7Y4csoKM*0 z)>4vW9Op-=&FpU#8D1GteX!>`!|!y1Em_LHkVghy;lES^Ov(CRY-90Vn)R*89S?

-K`6;{KQq z9*Aw+RQYaf;FcW6dM^Q<>Gi;D)Z*6IGS4rsO_xQfs4{b4JaGzWF^R`0GatN!|DjD{ z7_gonb=O}9|9HOkuQOmDYm!yN8MQKEftPY($Ab6I&7#Jus)t{NHP%_>z{ue_d1Xdx z-e(QGtz0hB2l5Qo^iWZ2TxT-!exItth>N%jv(z?n_}9!bNUS^&PBk4U(-;_Y(>^`f z^&~msM(|r}QXU#*tca+mMdrH#=_O3V`Lzc)rs0>NA%%goG@#^}fiylZO`F;O>>x*cXS8S^4hSgU5%Qv zC2y!zdGdrDTA4D1`R7co@l>aK&ZRc-htqs3qk9dx=@awLoD5EjjvSPSev3YzlIEgH zE1oL{4rF@hF7;unC=rPYQ6%N~YCh`;`j!tm(xXGPFAb8nu@O^Jvcr=57DQIM8c;ET(8BG~!W1M)wsx z3Ghf#`jiM0zTZ=EQ3f?CdP+an8Iu0d75KjWjOvFutSKn`6WQ#H+&tQ$Co8+ z^F2V@m0FM}b*#shP)2Z3MX}c&LVpkc4wwzr%|s|fDM(Ms5Hxg4za6@d5TwWgP3s`l z>`mb71RWt>84aXK=^|*U1(m%@?L0^Hg4LiailuMOS_nw8HjNjXBcBlfZQzgGz4 z%1OY6;YCTu2vdH#c>aWfO5!oW>2pL3z`;Fc?yQbQjG|4s@D$0u&uoPovM)NvLJ~c< zIRg=ms>q0cjyguWZTtRheC>5N5D;__%g}M#rwjM<2e%TYV4>eiZ%3DiI>Yt{-rhVu z1!TqEPuz$T*Q#<)yS>L{C{AN!aKoZv-0IxVwa>VX@4MnkQt!V-o>ZJlgx98>ZaZ^? zU?E3a$)Ji7fJIS;67&e5;I|SpdWh4uGDUc2sHc34MO?}s~c#rN?>U5FplRYp-97`R0 zLk0|_`xA7?tmSGl4kN!#7_YU6u2^@y8$k>1?FMhOp9!OP+0g{Y&37`Ljaut2t7S7D zRmc2aShBu28|`jMjC2JAu`>C5E3%kO+Oof~;xzvpRC2MoWD6Gb-64GYk6|0XzpTxV zHgQ++L5i5MH~>{;+nF(4iIWcbT{d#hVp&XGNyLrhDWhl~MO#WCl3u~d*78nsY%BNA zx$gkWb_K3JHr_XYd!EoFQxK<=gROVI2huZEdG$>pQ(p`=m2&qL&v);JK5;_2LH=92 zjMX66RaSU$}(`z*_=Ef!q zZy1vkWSb@%QS&@)c&ghJ9922BEz?C0RwMo@dIeu50nd>svl^>|%N07oC(^)z0$pa{ z_WSR9@UYOsr!>3`j|9zqfKP zVgADnHL|gS|BDGn=|B2Lst7boE-nmb?*>Gre*Up21qu)GV47$Ovyt-qJ>7G5p!7NJ z@V-Ito@0Kg2?qFunl8;qB1+5LAw~y@7$m}FQiV6g2*v&N7$>2ukXk)B=Y0xlq-eK0 zdd5of9A6CT7l8S$)i%;mhc?qNrOKmi(jSolrCd8fmJ9iGnlKG{&`jVTpkUgisf2m4x zI+Kkbu=yYJAblNAEN#sbGBYeIUzkd2PJ6}N9l~S5QyNX9ua|h^dUE+uVIZY~MBJ{- zknSrH?wnoDoC@2?kM(dFa;}QF=(1ay=Sf?YWk!57O{SZEsiFT*1}_I<%DzeISn9A! z^jU24p7qHrF-FlM;tP`7V*&!V9|I_Q6BuJ6N7aYx&nFq-&mUE7$Hjf*~R@Xuvc!iDqa zw@{RFj`h*@kZt%`ZQuUNt&2R_xXW5^A7|K#X4$6g~0B0HQ4L06y4)Kr5alht_k05&~z8+b_OTv@g}_G#HZAO*V~gi}lAHm;b}0m;Ys ze_KN@nIMz`H@p4O>*w_62d`IfuZe5h#Dwn|h{1)KO zeSDcW+JR|emKIO!WWoXVk9E@JQmNN~Du_}XRfPXldyj}#VA|!EU!TCi`xesR!hR9I zp*QI@n<)ym8CL?z{47&y@X_1Jl;P@5J_{;s|EDGn-kcb@bQEQEIA-5iPM5OI-4-1c zhkxnSb5<1VL2#dU_t!4%)X9A$H*}snu-A|0&^!G)t{NKx?Y_!)WlY8SA;M**sq)wUd zX{IX`rSWO#u*S_dzW&PDo0%ngw7g-_6M`2jU|vO{{o3!$x4ooI_>8dHU|R zaMx;Op+uM>jfQ6+R31Ghjk;gJ0TH^H&AKmD*&@|kw+|RzYYVZEnNt2w zaq}X6;GH<0JuHS=M(1Yu+kuJtfVdPP;^k+e{}&p^1Y7HO4^9NQc_k$esp{EAY$t7n zEO&Hi`9!aC=D~knSZsL0%9rNPadTG|oAG7ShX!>mp_`8$W!aLPT2Hpcy-7(h9Cn@N z=njBbH(WWrjRWjrw436Zy4>f;tCh0ulR<^sqBR12zBIHh(jv!au&R z=Yi7v#-9aPN69S{+f?zDjIPV|#hdk|`+W?Z$UOYnY2%3I&Z53GJ4B!ppg8!QxZ_F>G0w&AN~0D6#u_>hCN<~^MtCMFbBlmmz@T@B&75b zx)m7M2lJyp_vb{*z;5TMz%CYesS>eS=OvC4?X5}A(yr`tgq<*4+WNQ3-AbkN@5oE2 zsdq8QfBWgT`{{$=4N?Rhnde=cIei-j;O8MPH$Us2S4>JJIE`A)h{2v?)TMMj9ulX8 zsR4@Uk^>X+gt7PgjFeQ>{>td`i6XzA+p&gBL5-aq!IUIKvEtMX z){uJnl?H}<^wGRVM${RUL-In-eq@&0WQ7q@%MsLUPc_zwR%o-VlrW@pnklXpavOQC z&645ex#?uKv&~@9f*}SRMiG-vgd)`2|w8x`Ot5-w~c8xk0vSjiSV6Eu*RPF<`*3xNVYtXAN?UC ztuKJ%D1p~~deXr$C|se~r^pO>+L^T=LQEJ#Q#cw@6vO&%|8m`V0>p+yg1)8}xu`12 zO;UCxC8gVx85$FIqpN}LEO1Yz2LE$VoIZ+e4CZ-dh|)*}`ShmU)_?FVcQ4)H{a9y7zf;skkcQ%x9~?A%@_}Y_)YG@>gGU! zr_MdI6^qI<*y4l(Ewxldbfd_ax`g8XnH=|jzTrx5ZYcNq6*UxyhVbQPFDL`s7%wu0 zfAxK@K|Qp%cbV|o9AGL@j2zRsIMsZ(mUfSlDSxV&Od~2kQXthl)KFv>0#gQeGB{f_Msn(5f<{@;Z zWC%J_?Tb**E^Y{$^sZp_hhfSZb9_Ng4fRkdc!r6qKOIW<&^u+m6`4J~RTl9|1QTlvG6T9|jJkp31U_F_EVwKoId0td*5<{Uaw%Up7iCZZsgS)kdewj>0 zbFyZCE4XruFG^aKv1$RR_gr@i0*2Ug&AGS?7CaOA;Msa2L;YmY;2`w#f9Ur9|MWKX zg;uW=+n?{8>bC%^cW=?4K1%C**i7>-Y)Q(l*Xp(+XS_hwe-6Kh; z3XTN_@zYz4Jgoe35YKrz>1w~Mk}ITug+9bQ-u>Nm-V3x#w^dbigEVEc9P)1h_oi%49XKgdk_n@}!o|C=_(`*&#zs#1kM0rr zh8`%%9DmC;WLB_DsfXkF*VxYBsdnI7?&I7CHQaWICkpZS_pk+0T}P>&^NThOQlG znk*(>s38BM=AmbUn8Pm0J;J7d9@2{*;%5Bc5Q=fRR*ijH+vDi9h5s@IDjw}wG$@0O z?P=7vI<&)wKRalEcK~N???s&O59|z#AWvA8i)ij^rVI*Ox*Ouy%g5wmTJ~aF^wIaP zL-)aD3V-|Si8lLDUT2=`FPCVL-F+8L@!FA#jk)n6Olu~&8Erqd^7ti~*Xxd+=~Oo6 z>VTrhN~cGgV%Q0QmJi8Sv+sT>AxuHgFQt~RQvgQtOli@-0e`wSxr$l&!6~{0&h8%55p07vWT_p z^y)$Jn0hML7gU9B17RH|bFdRfRqi7xoth3m>|#pBgM|fcn}RyGf9$JmI{_$Z7(Ak2 zMg>h&*t&8X>(Z4BLjpfd4WIDWp5wS?7;NHzrzfpCY3Zqc{MkaG(3Z=k{!gJ5CQ>%u zuZ4l$$x~uz-Szq^vhmqU?=3BErZQ5uE~&w*yZJp1(xjtc+pXInGqHTtahM$h{Xw1{ zcJJ%X&O9+C8=<%4jm`(<^Bk+4HrzS=Q){u@&!eH>}cy zHFPH14R1wiW^?pQG#qMU)kbt8(m3Nt{guiDoTB1qiqBd7NQB23V=n(EbQ5glLN>rz z3t(1)dqR}3VcQFr(e^>=|1l0eQsq*o)?}saV|g+C;wAGqboLFfB0Wfr9PG}K`CF65 zaJYwlcr#x6T`>0d1e)6ckj$&Jy7Ihs$to_}bO`U|i(~^RjtP>!H;4aTW1g22`Fi;9 z*Q2LUmJOk_h0uefl>tk#S~Wj%m`+%=?TVoMDMkh??N{BK$4rUIx+2Xw?lXHW*3d`) z%JY@$@ARkU0j8h|4N-~}YF8E}6NmBZ`OyAJeOyiDXS&U8K@M_u9`JYg1SX$5SGFa4 zbQ=9ParrN@@N)p`{ zL|*rd5)jXM_O}cz?)%;XzyzPlOB-8omTAC4_T|8sG8WB0f*#S1Oor4>q*Zq@GxYQ| z;Kj219k+#&FZmKM9xyf1cqyKGY2M8RY8y-m(g=;@BcVpkhP2{pAhgG{l6#*01VRN~ z!d1LRG@Rw<{wiq=W>=t>C%yz_XoENJxHOkku}{IVF;Yggw!lT#90=|a{Yh2^Qs%>} zFx28!Oz3#n|M#w0k`l)^4fSQU9#54wro?wCj#cF4F)GQ6PWpS`^fe?krQ&Rx)$^ob zZ7dxZ_FDH!Z$>)xc)TguH0QN0icp<&eXycZ6-sy*z`I6LaAF1qW}UwZBwJdvOopr& zqk=RL)Aqq2T^5N_fqeXFAn0$|Qa8qmKe=2=%tw5AC$4`ra9l<)QSDcHOwLs^Wt=5J zTe!5@^VXdIknX=@Gl;d>!DD@UK@~C;n;X&6FW>}qljSIrkTZ1B8}#R@_}Cl7mUz8& zE*flnEZ)w<;fWn_*L%*@YlAtfI#0y|x7~O<5qOQ1msZL-nc`d7O;DTql$h7JP4$X! z%8QdGn+&L&IHjl#UdvLVVACmMZF35K!rg=x>74jk=WAbScTM+-ybl>kpObBUvvE^6 z^czvS*?!G)7%wP$;QmK^T11v2PIGD`>#Bu#yU?sr;r?dr zc;8%KaR2QkzsZcT)C9{`d|EYhEx#1Ydjk|x7jh0e)k&>eAM$nq@6ii6kKr(3GuAg^ z6((#7s9U_UGR{G`n5ioc)m!wEnL5g9O}!i?e=Fk$qgtC4of6JuJr;-E3)Ru%{@YSY zvrmGJrV9;TWE|^%9^tSf^P=Cr%p13WCeT}stL3;lOE==g)#LU}$UC5Lt)8_( zP>u!t+E{h;+$;^UC^kHZ5Gv($Zp$4JZh^-poZk~YQ>zmogrC|IBNX0rB7Bk;GH6Cd zKJ0E4DpB|#n?_KMnd_3;0K!9gZ9HU-Lk-Kw$BQniLuFSV#v^`~r2fMhvt*__qVNO1 z3K6fufGn^VlMyah8^+xCqgtP6)mgp&eLO?T3#flo(JYpKIP36mxU zkzCOYG3h3Z31zoo`-@~;@c8}U$()B2X2@C%%1~4H+#TGj253VWLq|b7^!!Tg1<8Yo zo@!)%x4&W=%TVhxndE!Yme+SP_-)57BAP!-Fd(pox6hbFt}pxh&F|j0WKx=||3Y|D zh9*KXMsa9#u)r{j*OSV&s`dPqq5u}(4|rktB*k{;gV&>#!bZ7{dHT0}_wU4Kpw}Tf zL9BSqY=)b&2darx?4u2vZ%iCJzEy1oAC zO>FZl{PK0SrQ7{|f>G~bu+=yk>`}n;x`wq%?K`BAntKb&>JUnv-TT2s;vlqIGlQm=;%`xpC4IF{jF9F9R$+CX}dCo zqc^q8()2NUpXg@9F@wxR;lVN7U{=p)LMI~zL;pm*GC91ShC%Q&1nkQ(HbGC% zRfjUVog?Oz zT90b!PW|i@$BkNzz%SDa!oN3hdrP-yPAUmJzku8axsD-b(Hb_V8X`jksl=63t`2$Z zL_1HmEk1HF6N*_25X@AzuhoUlmusCb4^CM4U|ihVGwfaQGkiTth|^`7kqfWdKD)-k-^!IY*cuaAgJPNf_+94HOSNQ4etk~pV08|pHd5#% zgmphf&&xzS-Dh)v5_{Imf3!bJr~mGq%X)jK)s{0-y;n)mw_8b)@o**AoF~_fc)AWPd8z{xW9EWQj3ci#jHec_LcXHf zEd+;r>HCx!&c!R~oSuKRDWx!we+BECP_!^&PUo{zRzed#s(^YK7Wc=*=_M%?={!r-3C)XC#vnDCf)9_@v5as(20`ed(#!Gp{XYm)S?_=bv+tr&rRrjlc*O-*FpR<;nGRnqb|vnH>7{ zX+vINNVHqCI?F{@9jHsgQ6wb~#Cp(@qb2=aYPE2gHF5_HgiPZ^f zpE&gpZ2tV49&3vZ?MQZTB-`JIF`;7X%9vQdJjd%RuXe^r6nm_F^+2a70K(Az@XS^- zb-{%4MrM(hCCU71g3k}FULf{MC zla)J7Mq-$uBzoUY!%I;%-dE*?GonK2ry%Te4%scS%R=$^B0UDt-SG->FAP9_yx<5B z0J?k>kqAS4DqI5CKY~^gS_r`u;NUrU_EWg0OA{$=1MK(jvnN~7uaBl+YZ+S;S zf+pS5np=cc)i(?Gj1{OU?OhH0GEc1z{?}x(-o)mdP;D8}a4AeCMi*Z6m&_fYEbvZ_ zHLWVkdh=N#DCe=U#hTqyYw~0BQYX}M7W4_n8E&CZUp&*g`{cgJ35nA(Z{u#{EeV+9#1+?$;o5<^~j6ZdaUJr#~SwPDVKVt7#7jJ*|PnfHjLU{_0$%QAAraR>Ft zin&@~Q(K%mfNlIU1vpTNJn72O6$&w;u!_fNwXcd)FthAPnC{EKowoXLZnMKv^TXL1 z4GXIr;wHzeoc39hF@GGeMzb!nyOdj`eqD{6+Phd7W8`Spq>gRu+}$V_g+5R(oOfRk z9oD8gG;f~OKcu%>ru0EFKO#WGEMRs6B3q3R$fZkwA=_~A9A|r&(BRniE7a4wwVM#} z{Y7yTm~r%8w!zvD^t`4W1U`o5*9c) z{Cy8A*!bj61qwuiS?V=|v_wW9NPs7xhF>}`H#~yw?Avgah(8zT?0fVS=#&;hJEKAjC1$i)-P?x^+G8v~HzNoJ>yH_Ua zu&||D3D{nFS5kT3Ea<*Y-Jzq#ah)=)PFX4=r5{ga9HIvY8FE=#4qvrNP9w?I#M~A&%${rlt zl?;q7zw%=*`P-V0=PC&@Rt6XI|Cat9Gcg`g!J6LlOL}tA@N1ntW$9kqF`>iu{w_c@ zV;L^pW*|_B&&H34CFg48kw1P>J7XETIp00x_+S^2MPJYz1y5fiKD4UxMHasonss0w zL;uEy9o05IHWv18%O5x98P2;s`!(X{+5LyXDC~qQzg2EENUkc@$VY}3htw)O(y$g` zeDx#!*xJ)OcV_|mDv3zY?&$DLL+_kHd;YUhH}vQqp=oRFGvQ&XLw1}o{_bbn%_uT2rC*ewkXC$4?~YpXZa)*{Dj@Ug*SEF17`7Q7En;YN zP)f$pqEMG%>SD8kwA$dv2|uUt&X}n2k5f$5CxUqWpg`6(#7ODGVcc$s>~pn(Kk!|5 z0I=sx;(FDzn-6jTZD%CA?#EBxngt@x&dQhnK8kC?BV5rxJWmD-lJkF<+U6(Hdw87%pq-Z{>k{s(-y5gV8^b|8_dvFqPjzy0s+zRh7&)2|Co1r7 z0C_`IHe*yZTaAB$H{H_uFVD;Q+_WTx|3OUAiJObZ339e#td4iM4CL~>fz(hpnUu@Y?^*9vB6YVzl1p?6 z@$0U+oH@%Ji1?V1*b2!#=ng~?yHZB2?WIPz+w&g=$Td!|^?DqjlOJt44^ya5WwR5P zauV-mqjks+o<{lp&h0B+G2$PmfVL)^J*m}>8yS*1q};@Z1nzE~{Lt5aw@~_kpfh3E zc5BuLoVu}rNqk|jEO8}Fj(tNoOHu4u!AO&LPSHt6I#$&Kj~rmeO`}A~?e5*LZ1(YZ zq%%dC#NY3d>)k67TR#yRR-FVwV|V(~cJYr-&W{<7y9AEeR~zk?AzYJsF1;hO{#BC| zWT`e2eF=IPE$RP+F0OhQyqfeRL+{b-HDpqk6!z%YeRB#*rU5cNlaI8!nnu=^9z~=s z@1Vamn>#x{H+r_;yZ)nc46Vd%z1@|(bTo4GC{;+OLVun4Ak3gBd9(C$#N{8V5`gAQ zLjkbMbzS3xG<^jlV>>cECTm}Pdt~~XS+6UC3WDF|7G!B!`j0V1@1%ld$hyru_@mAnV6?MQ_sYj>7J3+4R~xx+q| zdgRCGD}0~J!IX}Lool}1ZI*mXs?PWsZVmZO#NBqGinDHG;skf)9%D`eQ1{SO(H6u{ zLwf5qSp?lEe45>+*%1C3xb$v}Vf}i}IGI^AI=m0#wG=Nh9zX!j2iWL+>DNrRcH^KV%t4tbA5f6mZKt{57E|v0#Q`a&l*qkE{9)ejv zi*H^}8WYLXwbPYd`8#CXd#YMouc|>f8csu1oJf84b36H!3ak6mOVyw9Fj!Bq?ySg| zlAi4=DMzOg+k;eN{@r&{zE01%g3@N_-|cU&OdKiiSb$GYUq?zSyx7u&Lg7^(*4No4 zm<&vM?Wq2f@TYI&)nQe2-~O8Bv>|!vPiGODDZZ+B*_W@aR?(fN~#I27vx+KI)rwn(R+1v&m$3^Ja$i+s~{ zbP`P6br{7hwIYRkHiPaGrd7$r8Cg{6FTw^3(PIjm%z$^NZj29>lnc#i2W7R(Q5t3Y zVv^yw!Rg8b^E`vh0C@cSX`xqtV2taQoo)xmo%j^4aW@-(qw0V37~o%`2FoA~u~o3VixT~nx=9}Z52~|@l_3VR| z(zd|!M(VID&m=J^AjJyoJmciSrMvj}=EW^e19jRtQwX0dQqYzyim(h>buWJ@Wv!sn z%*}s#|AYb*So9s(3JJ>)3#W>(Q;}Zn(jTwBz^x7rZwxlopp^+PZ4&ZdzQ0?1npZNq zu3f(t zaz!BYL5A%g8!9WKNrE5MyEY3%G9e711q{0quWVu*4*0m^Op{iM&Hl~!19o2MMai*n zkgAeV7_zfWl^pi+%v*dWRp=z4(v$3BBDZK22DNIC}4@)!3K|%nGZ&O>MtdX%ten!(Z@e4iY_8FQ3{gkgw@7_g6oVisODMD z+&ZCw`xd1K`3DfNh7A=A{Fb1yzl~`F<9{NF1v4nQ-G0G6^ZB2SD{rq+TjMvzA(ls4 zQoND0w^A9y$i?@fvM1!Rn^k+xA6$XE$Xh?bJ#qMT-)O%KCl+aHLVgLk6eG_JEebTe zbH%(pZzTOAQD1jLo~>+=q;=HBdWKvDYIYK_i6?IK5smae-S^`qRRrz1b8k(lW-KaG zjnuO2w&O_crqTA9>N!U>CeL$dIn}^u6pYjyuCleYQOsvdX5-U#0+Jb3@I=EEA-sDK z!VxG9(7T)RxdpFC3rix(4xtZ!r%5P}oW`d$53C-#uhy&BtB6MbsEVBbaH!KXLF!<> zxHZ<$Yfz{66yE3NPE_3V>%vd3`l6-4d1xN_e&Tpalkg(~pR)7NIo*Wnm58sAY1Ott z-#d7$j4Nn(nQdZdZCQNoq&vrhV|=$AD(?ZpP=3A z-_b^L9dz0?wZ@qrO;3FAPP_%aK}&C}m^C&5Ja=92P__`or7?)monQ=X$cpeN3C-A+ zMh&>KY!$WY6V;V&avR4#i<5@#AUCF9xM{8S1h_e!1nYTc?e{y-a|FN85WBR!`4YuBYW|Cyz~aSs z&pY43%%Rbo<`)$ul5!)l)t=Un@jazEvSsJHG|Q9WSwDDa@PyT%>`zl83Nj<*0T$B# z>zw)QcuAFH+)_xMymOjea?r@Ko1eB#URv0CK)J+Rj>dK13D+E0^H0!3yD?Cb5#J&d ze%o|-zQ3N7pUQ=?C43ap#y&w#tr4ovxps&~LT$3$CWqdMV@1ij?9+4Y*0|?1s`bYw zjbG1m-;N>Ya+46VpOrHxp*JWfak7LIs7MfUtd-W=n)ih3MH2~jH!BlPJWNzf-0TDAi?F#*v$6@_qUeCN>Qz)fXCIv;JRu}Bu$+s1ao!aTsb6%5Y z_fcpkP~GnG^wGp6n^+34Cz#;sG&=un-uC3Ki22jWcwh7Nk>zh{uQ#e-U2@oS5r3aI z?O}_lbq59px^bJ0Mr)4?3V0Ee`aRT(tF4ChFYysMajtQ+TkWd-H`qcIE}mGKsJ8vO z8bBU4Zw2|bUki{KN>5Jfrs}~MyU;??_?bkrCVl_@P#y2e@Rq6aDiRt&rc6Oj#~kj> zr#1x8twL0Q#OCWEI&;3iu316j*Y?h64~*5=K82UHL>l+{(ueGeMCJaWmPalDf6HJK z+{ol1fhcykyGcgCN(-p>i7>5MX@~~lNdb~yV2#ey>L)tAXLDHg@%}F43%mV}v@F63 zTy>rwUE59S-EXtaft;$;zTxsI=9{}}QZ*-DLTvR%O04XiwP*a1d_RonGpmk3aJJhNAQ^#W#pPQL$s6RH?9FE6K2oREArAx%7}}u z;_*|LXt$K+x~*lG?5TKPhsqfsD?hX`=jQlkV&2{{|luqw`e;xAM!0Iqm4bnkeEksYFV-CHtHP9ivDmDu`#{^e((--*6l?2 zQFW&z*0gVDY+~pg)tq`z4+h5_-WZ%IFOW~aY-Qgu=pE}_4i{fF~I8@>lPm8CG8M_$gQw}8MiH=0SA z*o&`Q5ljWk!C6^v0zT6O^yo~Pgb(#=Vd(qJz)3171EOe86%8~wM#yTn<{MB*u^N(& z%=)X1h8OM%KgPQ7@jT|Jt4)f6ynFXjK;W(V6NGE)5lQgDz`@qxXKVcX6J)86CB)%? z>!00m&o5k{D)o-oavSk>MmfglBNJEarx7{?L&i}pP5ovl$)d}rlMr7lCHKP`So!w^ z?vSDm`CqEXA;Dv4H3)_aS|2&|-Wt2o+f`EW7k^(9K{Cmo$T$aQ@YAD`Tl0(S!$KM+ zOakmHj+b3H%BqsS^`rKR7}-l$mK!_H01Aw?eY>rVMS#WXIZrdG?OvFK@&mpK4?wZ@ z87Ag+U-B^}epx>vG#Cl$Wd|rCK(d_N4FlyFb{bDtB z#`s3jy`V0rEOt6=h^3?Isn{s@{%q6}pBIEg*d+AlbFWGamT8O}wS^*-qEa-qwlgK+ zj;C*@yWU2)Ir{-mi0&ABqmVqa8)pSMt2hv>sThRQIbJ<;M$6waej!-Ygy`l!Dj|Pi zMRL@K_Ax?>4sMgcPg@D+NU1f2t}M zVXQ#qY$P$=-afYM-W#xmrN{QrO|Lbxr_r+I$tFjvdOtLMj6^3fBQ)MWXQtyHk6~wy zcfyS03C1{WpcGt(L|Yf1o<OeYE^7GXceuC3kmcMnR%62L##|oR($EONa1BaX>9Ue>x_dj#vITGaJc%v*7-ZCUP zTk7^Ah_}3;t3I#CM_16G#fNB|dn+H3uU+_UM8FQ5W8FH0SEekS)4tz1BhJ5YJQq-R z)+^M_`~X?kt+fV8b?t74-#+u}Pi^hpUjw5%y4Ty7S25u&nvd&6Bt=1=*C{B^o%MHK z&zDWclYvCd`k+R9kLgAPv(z+NEyEETPj0V0 z`2;_$mgMlJK*TPOf434D_ z#sm-UVUJ&`%9EJFujsfSo`+_0Rp@QK9ol$XY{BR&t-o<@At^A?B^t3Gg80LI3u9~c zC74tru9|b!`}gqg)_o{fcDfBVb-tiIX!qUs@n)AEH}m16mY-4gT5_)g5cK7-SJN3 z>8R8NVCnqL#gd)XzWvEt$|N4)%gD98QdN&sj6ZDkWhl;EN36kaDdK*a{ft4^ORclY zn=%=V)t&Xh1H##Lj@5r$yV`%J%=u$KDYqGH{qaqj*GqK{8V2QmDMck|OCoK~Qub``L|M$m8GAon%y_L1QEE!pIr8H2K>Z8O#C#V_kG zx4)(@h@PDn#s2wud+WLWjeJfV%^RXyWnE{3lw2L!xEVAvOgRUeU5H8y{QYzBq|sh^ z;cWwUchGis%jSL{6q`svx<;OkmXq4Nx}a3Gpu{4*t*Er=d|DJfS}VC3ExjK7No#&$ z?E&1MSZ_W7n5mKFIFp2qqmcr4c3P$JKef&SQu{s{3$Ut?lmr-!^0yTu@Tm9_75zjp(5 z41}NzgB`VG6(HY^ZmTlB;5`D5rXapxR}c*m$7Uv*RA2KF7gYBdz!{}2Ns1kdT@jf5vy{=Nv36epQ>ZF2M=mg-X%XHoR zx~}n3e!R$pltQo|A+`P}*qi(YW5WpUvSN2f*T*EYDJ%+tnFbebol3w&1p--HDGAh>eC@O37@Kird@M*I@)TIU1Z9;6aLZX-~B$o)UiMHa`MX&UN-V zf0ImGm-vGPQ|(E4Ge%%!w}8Mj`jng|kDJZ;dvE??cb;T`Ed{8HY7qb6i$|%^=)S#L zXnfhu{}4!1RP}AYdQfkQGqn%_x4-^>csA& z8^_xM`$3Cj2fz;2FHmAvUf+?@Fc_)wK(~3adGx|a9qzka-Q%~(;}(o>svpGP2@U&J z8pXygt0Ki5fA-dF`@DedJ+iEtAZqsr60X1xF^?dhlW+Tm8a-fMgJlHg>|fpD!katY zTmW1NINj=`urtKn>0517!*J(BJnCK4N#XXVLJ|Gy7Y4K>UtEAW8bF@jtpr4|&@#nv zS6Ks{Gu0(e(X`sj17vD4^h_^5NQvZf8Rj@iqc}^B*!(EWWOf?+b&i0<-aHV-J|}2Z z)xS=j&mb{NADF^{(>MI##_S+m2_D!uDZN>}u2FRNgkcJCr%?D7H;1Bw6ix_fx2QF&ug?V--F z!Rv{N`E(mnOD^->15xl&WOw08D&9qS^2CW^7twi~s1JQretDJ2_z)U#2$Lyd?E&t% zk(K_(Y9-pEA;3}j=aqVotSWj&lzZ?2!V}Dxl{VPvwpGIIWzcQ>KMkI;Xll-z;!N`S zG447qNp3BR;2aTwF;Gv1N;}9k1&>T1odWLx)fyM>)lzE*2~Wyy7})C&RIeo}3(!V+ z+zADoY8ffG^dY&Eq|{)g64>gz6BQt*6AMAJW8G=ld4w4@;8>@}g?W8T%LBj;(|FJogu zi_itvT!m0insIdaa`~c(uB<&VZoyxjH_~!<75CyEvikVVuHydf#|l`fY}fH3sWjt} zFrkhLnOZEQPoeQjIAH~l^bODet$5EPU5AoKC3)MPfAwd;Zx2H3B=kQENfHOd2cJ4s z^N$S%f+~#Po`FDv=RnN^*u4Qb6>#5sp;woIjAVXOh0Ae5c85aH<$*if-`y~QrmR%9 zZpylll6Cg`s_wenZEL_N>4$i-UJb>i5`VREowtT~CY+@$>JPs6K+(-6Y>b=0EpQxh zi0GcMXQTned0ai?BivLpAnL|AsuymD#+{*(SY|C;6hTYv%YvEb5x(P z-7O=qD+9M1_+e_XlH zgJZyVwH#&&Pyd=S0px*eB&jN#zog3Oa}&rn=O_RB)hbh(kOl*t`xzk%o;u0Jr_PEdeRz=B7_=>(1+#Ur-tF{U?N!m2I)O6# z6lYpl0QMqxjx=>9a^Tm^uEc=sw>>IUUuSvNzG%BQ>-ttS1AusB;VSW;R&~D}A{L$g z#rUJCkE@vGi^aPG=qWpsRn8UlySk&^0jU^A*E0onsm9Y*SRLP`$^Jw=hp^3}`c)S( z)_uM%kg$}FRyXU00iEY=#e){L4Eu|8Cx&VtUFO_od2xQawX7>X^VM@TU{pT+aS6V9 z|B`N}M~g&?*~+82`eGBcg(qcikN`%^(^Q7~ynnybv=dPbx7yPd?clf4uq>fQb7)lS z)BhB3W9rORX-oQh@0$U;J3fw=dYX*ilG%7}@6S>H&Gdivnmcxunx>3^U3V{EBILUz z#`^(P>xEO^9Kq$vJRm3fy?#At`8sUwv+3K_Q)^9FB+jCuz<*o`JG9OA8oIU<1E`R& z1?3A2yOdp$jb4?DDaC*cYskOxgC26NMmUutRlE7I=EGv&(9TMa+n*J;w1MOQ;{uZH z@2s2)n9~lj=&D!V?(e7zoXMQmc4?^yApU4THdVMe zfsxp0*eexsZeM^G;JQ08%|Nz2B*m0nr>6-oS<*dMAq@P(702)L>41|OV2%EBGbJNDu(WDp zcq%Q$RC__9pg;7l)AbW?*RDL_;QBa?1ZNHG>EIg45N(z2L*&wYcVTHf=xq(AAs?Ct z$x~AOT8t9Gw_QWva^g43UhSs_(2$U4dj=BK1WR)zLSoA9CKr)Aa^GbqBgiAiI@W*M z=;Zbx7^O&iohJ%O#EZbdGSVKmEEu`c)8VoQO@h~H_F9k-6qS^KY1C~J*i%f`q)H5M znnBHkSO)?!bXVu*r(9$MEN`~Q;X*1q3Me7(>7|Abk?+5{8Su_)`_iZvvBKMo?PN;F z()0D!iz^n4#Xa&uLc)|ILmOS6n1OSvfpe#;LMe*X`8dFxU+wigZC6$N{+?95*8a2tD4b3`r(ED8pkQ2$v-`d8#|t@?>Ut=;0_wC z?$0|~`j!k5w=a=V24*;87Se$;9);cK6=amNMq>2?{nbANo zDR+RDis?;$6{N|l)_cF8X;Q7bu-FuFgjH#X$j*zQQy2LrL??mSmsc}CFHtow0jMvY zepwbX(amEeIQp{AanE~uM22+$NlhhwjkuG19`cVjbx_<+ z4Hoz%Qkh4h<6VTQH&f8lc>m)zF75-*HQXrI*D_C66$jtn_)8dAzk|3A(fwGz?RM>$ zY3EZDq3OkQeB<*T=|IBe4)GtN&)WL>Re96I5%g?ggME0#sJj}U3`V0puND60Ob!NpL~ zy7d^`j~t~DOLf94#kGUo-)^=|Ap+2gAHM`ZePCq(Q7nJ=$}5>?yjWh+b3pkx6YfdT zy(P*~0b)y~O}_l`%DCk%FCONcKC^pfzpO_fppjgAr))XDS@mZ#eCdJY9MQ8^KLFP7 z==Oi}?M|adOrGn#fb-W4g~^TBVR_p3ZK0W%1>IWkfc~?LGsm- z(BjFU#MVxo^V8C5pITa*AFXv`j9jeYD!kW%IG08wc14HjKbngJ%-D6og-&nlv=VPL zkB(cz@teB@O=KbOEKCMS{D3(_K4EBz%If8d?`*d8NVV<&?%ZXFZ$JGK_DC5#^+AiX ze@SVw;XE~e@6Q;9x}Jc5SCphR+Nem~loU793?N|I#E1SbH$>ZGB?j^%MQt&;wJyUg@OyK5UBZYi};pnuvp% ztTaT-cQ$L8$B9@@S)LEaeJeeemOFYYeXbJ%i7Cl9UF!GugCEIwDP{d^w2P!KSCKiM35v;QkTR(h?PS7?qdn2=#Rbg?w(_O&>7Z|sYVac|?+({!*Sury59cfM z0L?E!L5{l(dV__IN+OqJFi%EyRp+EmmEa#*PHe~x5pImx=xL?nc`V(eM1}bAEF0*O z5+;Yssm0el%n>x`Q%0omuf90Vu>Dc%B+R;@S&pKW^L-f=$wbR7c9e)C7q689{kUy2$QaEwBC-LtR?vW#vYA z?GFzmn&aKMF6h@YTzyf#F4r8|IqF;Yr~P@RfuDtq&v6G+c*-!-NYv+ zvsX$*(((4rLVSzszW<08xe4%QnbrA`x}KH^gEXOJOzMVa^Toe6h8OfLD$6n@_g#_y za&nj(MPBE?OVaVxt;XeDB#^*1ZOsTRA8*@vcEUd?pjJk8m6HBonzrpYlfYJc& zw1I|^8W@ezX+|2eLht@4Dwt#<->&2&vYb#;4i)|P>v{bE?4Fy{?F_0i;qxE!3`|tv z#cck?@CAyJ{{#qanx{+;L}fKzot2o{iRXkyH4Te3!hyekugjW9P$-58R=n`d3z@w4 zk9LG8vI2E!Iaf^v*boD->Pg@BZ+IR9S3t*`ql)4~gFs^NIDOh{)J2X;$xBt_Y*UTA-u#qCKEd zic;oNd!iyP-zM3mTf?Z5J%0x2?x zNBwi51Rf48&iq6m-N*L5pinTeyvFWJ(g~{Bn$C<^+fQyKRB5XUbioilZ4tLw`I~K{ ze+O^Ej*ejWcRv{_Iz?cu^_n)uUIq|>)mJ=Fnu&Ls>@ApTq!eEtHpp$sxU@5p!n&Y9 ztw3jEHwKBIpSaYPPRBhU$M;Wa8I|UBUQ~bLns4vYUG--GRmgRp^!B8ou*m@na$&Zh z2{Fol41&G=XQR6%U*hOf>YSSRu|gqtHVXI5^{x}^aMh#|yhcKPBz zX2qUzJyZKfrF{V@NoiG_ukXd(%~KkKEzrme-pbfc& z%H$dE8qpR`2kDIlDwpFOeyi>4*|t_4!~oy@6@B}vw>cYm9&zjiwHZ&=0Zc=;U_%~S z2Xe>eXpTVE$(&Bc_oOlpf~D%M!mm$HJP~U2ckE>99C3`czqOUJ5|KCWt(dJcIRRU3 z)`QV0p2VkwYh_|sJgam!!_zc1H@Qsm>;_hBu8Dgh4EN-sbR&h=f5Ne>e5z!Alk!Hi z?q_Ei5S?3Bw}s%s?^nBRce#NxuC5JTB)6a;z8y92kYZjfCWfL501w*$5_iz{FS%AF zjz`VHxZ^?y*C8+7O$CfSt;Fe#@K0m7dLj=ie)p zr})fPf7Rx;$zYi8or;-?+eX&{elEVgjeFqaw^e!1Z5lcL=v6EmGp4qo&@lP7GjXnT z=y-`&OMmj+te`h+XeqE=+f44_XwDx-*o<7r6u#StTq%r7893s8FW{$WnwJ00x7%Ca zYEv(GMbhw`;~wME3$>7MuS}crEeDn+Vk-JAA&oJmI$4dFcgO~xedXQn6k7DO z{;f{hiXs83Y_R=X+uk`zYxRa_KIpDNqKIQh!xQAR`4Ap|^Zpgt7i-O>#gC!mpU^=% z9uK16)5@3g$(}HoXW@UoX`NNODxTXP5jJw6H2Ty{5dV8eVedhAN_oVcJ8l^jx_-*L z?Ro!NPacX+j`DEkIGo?rGLo5?e2Uxgjl7ug-grgr{ug2pu5mJ0{fK$|lOw2SY*D~Y znWYm{qP*GryzARBVT9wsE}_h!gI&C!KZ-0nQGwoHUevZhwJvbnl-YS$mAx(O0?0Pu z%cHSD)$$x_&9gc22`egyYe7C}K|Wlq_cA;xe6G_JP7!2??Y*<{32jZE%T2C4na#}w z--yKNoulOHSaCJHPqIL}J*eA29yd`FK}+~#6V-!=)zw`<3dtPxdOHocTG zT+`{%6!--(dR|P_`qvV~^#n|(dP?eV3CES_xy)$by$Gq^`hZ7!bP=5sftOwtdkFWA zyYU)|n^a*&=D5Uc);|FTHl?+*A)=vwsyJEqp#_O8X^|N)p`Hf+?0O*Us|R2J8mhR072cFgWX#I_8sd)p#|mq3$2E7v^?%(6J)IDe zA~ECB@un>p;XffKuG`-fVk#%)XQZ&a@fBFE0nD|q_}DfjT2vH5$O*CQ3vjf&3|bzo zJr3F;>^lIB5jhCTurz%a<}NMXh(Gt+I$Ur&{gm_-4{1rkU!Ym5swM;~!9i@>7*5iI zR|23^${tXM!f4Im8FM6|U`$JS936=TBQd{d9tj>>xe!|*NzoqOF}P#&>9qTe=EAjM z-m_~T&$L|*RZ&%rA2%qw2PAkov%g{OYYuF4(A^WmY+gFKKu`8{D+@TkkfEqBVRMc% zxP1aAOMdrK+Q3Q?lw|)ZwJ}>BY@;etRc88Jf6btSg!VU-A18 z9>oj~4Wz{Y8}+kwFslY1+P11=ld><7=X!Y5v2c;J9H+MR7qirx`sA`UO}ZyLM1vq< z9J{S??buOl$3C7w9J@5IG)2aJo6mAhc@UQ<8|BrV)pTMb3l~15(JE$F_u0fC zDjAtQI!69LGejx!arn@(;x%?EU?ZKTI7$E!v58alee6+Xa+##b^BGt)r z_5`0Ia&k|i$ykQVM&`Z015O2{4ifYf5&Q9yN-~!PefLRBdVZ97wCf=4VPpM}*a$b` zh}u3Z;uh&UP$fDP?$~iR9k`8(hAIBePr8AsYF{>)8rhSbSL@AmK9R!hSEjzta1Gh= zy)z|R&nnKO;Pe1Sx#f{3d8!q|jF6>Mcu5JoO@}GcsW{AmQH_lL((~lFsqN6oV-(H$ zGU?U}dIgJY*&tzJjGvnIn4Q8n36Lu)j;oExaOW3m`Ij7tpZO1F?j!e3b%_>$%wpV` zFLT|pwAE&EsjufWj04M#a;(U9#mAkb0fqPNQ zka5Jw8U=R&E3x?WQrf|3Byx9qy87R$a2hl0Ud{^ET(s zf1;+_=$AUKgEijGeTQEQlNksgxQCjNI-c-7*T`5LxG0c6XOLY&zr@H2ksDX-75zRx z2oRRbbp#J#07Ht%+B^^_@t<;v+CsMbPf6gUuCMjbCk0n=>qlu0-Z~fEQ9{W zpul4hpmZ?lD!jJ|fq@l-3rkm?)=W0n1|SU4u+$EY-C7lexQE8p6=u6`gc60MGG38! zw`E#}j6Sh~b>l!m<66Az=uw@E1LQXOItDabk`>`He@Ez5pMn%v1?L6L+Oy{~6u!?2f!v2>c4>0fh}2sS1F@iRZEHWPw`Wnn0jhHk)ICr*XtRA-Uo(J7zPjXgmGr(ujOCgJ0bqc*kb5k$d4q+PlUhn|E`EgnR*tlW<({e+HdMm$|!l{LLq#&R=#JL5`4e#|bg*4(bRi%jFD(Y?dTT+d{dCQOWI}tjOQfQwC z=SBD{G~$AlH}a*T#KgeI*^c(dkE%o^FYb|wA_SjlO&4vimzq`!ItC$-0W6at-VBvY z<_gG;O3a8HB8&81qj4VQ?EiU~s#gyS9THpwZ9<=o5^Ky{H%_j8Z_{dV^Y8X{JswV2 z8<;%MQJ$XcivT;v_#(8_n&Zupuc(Tc@S4tApk@k`S&GrDCyvu;Wzm}AcfW^U^;_Z3 zj&>)nsc_YJ|ytJr!myxkDs&8Li|523uM=;V-^4**6V>zbu1u ze8=047G7P@NXxDe0L`jMPY_9u0XQY4;Q|W=eVIT7t|5kb3aG#_lhFfCN$o z1ev+!7^d{$TTgy@aGYK>O$Hs*2kQAv-=Ni9H0-ZA)=a+ecZl#2a(!k*zZ z3e_Dc>f8HFb0%Wm^P~2q9r)gAcOzll;XZKPp51?YLrLYvS-JM{sS|5go zRB8Nvv$Pqw#GoIzt}Qg5(}3W2z-5x}5+H4VJUJ)fR_?Jz5)hHEPY^o2%4*|J4>^z3 z3-l5`vcZ=ph9)>|KuJ*_>dD+B2;t38!0pL2&uJzyN4qiN^@x_s?SaYny3+{^CN4sm z0kHMiWLyf_H^&}vCPf3N(QVavCmWIGq~?sgQjdaz;@S)$Z!8y~@=?uc4fmRJYMl>n zlU3=HhP3S325)peXRsV){p(Cr8spxPKk_a6EVSHRog}kM-+*S#6$s?lcS@rTsr%GG zh9!wZ>PI*~;w6|L%Z@6-_D}ROmgBtyezN~Oev~q!iSo%WWXq2dByt+}>z6OYy^)~Z zLPeUW?O zk=S}^pftRtGj?b4TF~I3b)Ah%56K zCA-uqQ%XdSq`3HU$z4lO{b~xQ&gd_h(g6^T>c39`N1?1+QvZ%I>|_1TRe!eU&VqI? z@S6_vP_q3VW&174Q9LEJb)p-T+CbGExnpktS)T=C>YdxZZrgmS4nCT6B)>=eb z@R2epaqL<620&tn)-|~P&UAmbFL6do-rG9_fy_*oc8a%Sw))Q|a35B@@`O-=vdp4rF5HLvCNsTSF;)xSUaIJ%}2EK0DOENRl+ z$C;3QBoSfIR{$kK9=WJ`^6UM)%?<~Lh^q9KmN!HGu#?}4h!%y!Gm$$NovzfKEL$Z< z3|-~0_N<|+1CL7SLWFDP>bSER7=UP!w{j|JJF!jk<~Gw~__Mi2&zybP^?=_xEjf9B zgKl;jWFJssWSE0-`4Ap6Q-AeP)C@|}R9*Jp#hU!9Drxh;HaInF|G>51Bkir{!Hdh! zO}+2n8Il{~v8w2`_j0Ds^4ooP!IpLSr$s*)j{;H5_?beZ!#t>mdA~Ov8Msux?L>0ELkIT7YswJzBpUH_O!A<@nyNSEC~|_biy-rsXYf zqLXsLs-k*Fp(2*?1Az9^UL*(9BQT#fCx72WD9~|b#b*=ntqSk1C9^@CPJK2KYwIJV93V) zljQkzi7>zR2#>cbTml^*J!T1iz?iQU9FlKc!1S1uE@OUIgk$F9PlSoD@|fxhYcQZ5 zcbd1O1Q?AM{SAfHXrAhtAOil1LnqW1?Go1XKn0S5<}!SCX1cE>))mt{O;rCNX2QRu z!0UfaXn>tuYnim~I-nCHy!h0#F;br{x=&z6WEr3T_$?9(dK&MPgM=v)uZMg zsYQas_L9q&+Ap(A->`KX0PRjzzkz$bLy{_3!%s+h<>$yoX)na_jUeQ{=7hxTXsY5Z z`&nKS$^1r?tGhA%T$*QR%@5N}+T{6o^AlPiwcYZoF1}%QJE!^-?`9Q0zLz1um?04ScpqWo2U|fIZ81Q{)`-(ECqv0D;ef zG2XFflk*DJudTVzfknet#j7KN&5uQL`?-(KIko5n+~9mkIn@$e%HoH^^GQwbowMIR zQs1So9W6(*SAYDK@9>gcHT}2io&(HX)5o$$`LMeP?t5fvKcsGu&3W|$5rt}H7x8ON zzL!w3nf;PfEBbr;>4|}ri4up+&cscwwz&r?1RA?Xo|=GB?t?k@14*hMS+xy;awynS z;T8vjC3FCdtz(01QJbE^j{$Pml(S7-6AS)sEy9o5CN0SM7GNZ z7>DL(k)Qfs>QWTCy7mYoa24cX;vv8ptX@w}kFMbl1#kBKW@8Jgv?SdpZOgmi!6Dq# zDk1TdV_W&7HDouRfHMm`18)uy*j0CiA`igpbZGsT4bdVr_Ekio*rlxe3dAHnDoOW6 zGV_R}4CXp&D&Zb8Ai&A*O+X6JN5w*#lpx7XjiRx0@24t(?Nd#=T`8NGiATQC)S$(! z^wmSz|1wg7|CN5e+*-Oc23%d%ErI+GY@e6|>w29+A|Eqh{W{@0Fd(2VC^QR_=mKLy$2;a5_`zz6o9}Dz%WpkO!*=q2SBv*f4f-?YK z+GY9=1?)4m%8pbZukA5rHW3JCf39sr0P;-9)Ai$l=NRK4g>ct#_xh6CLXMqYXQk-p z23GiWQFljP%=gd#gb`RaIt;PG(bDtT+h-zGJPoD~e27^L_Js#|O1(^tgr7?T-zJER z)as=Cs|m_4dasJ2K^-5193TA5q6|u zMs;V*Xq2hRUm=d5%}C#daNT|{9^HHuPZe?Zpwz_aCVS|!y@nU_&94Da{_))XaQY)( zVmg7`s2j4Yf{0~U#RaI|kedPK0H)3!5S!!?UmC%wxCI&UX$K9_Do3m7BV+DmKdQ*; zYT>vD;%IKi1n(UwGZogOVLs2fw8UrE=?8_<@EVSP58Mk6a{tncOYNPHTV)xR=8)bl z0WG_LJZ_3c=lut1n_~$^&plVYWGuKN>e8DoO6PYN+#ha|xf5P5EHH0C70j=UIn+r zst(peue-0c#?iy`aE|w-ezcTgF<<=M%kgWs>U;q#BoJ9;UmpZs#z`ZQYxiyk>pE?m zA@0-Jn*>|%{~K6*Yi%fAJ@!q5GAGu4y~@g|lfNzq;&E-3sqk`7DW<(F_277PwARt+ z5PLr!mt|<<^-cM=y=g9Qds7`r7}B^A%u#Ws60P{@o?F&^sl~$W7h0=8!l+<-{pR#T z6IP``3?hWHp*OO?DwS(@Mjvn_P1-!B_@BQ=6ivbBo|g9eWOOZokupu9X*A&x#T#i0 zn!5W{QV$OJ9waAkmapIbz)N2X?D5*7J4_u=z7>1<9dlzj|gU(%Lpidz6*mC%80Fy$7%Y{Gw^c2CmDn%Gl%Q$+pyz36Mz5S)6Gmop-Yr!_=XWp+($bJEr*bw zyPs_?t^MXP3u}|2ZW##;Fg*OprK~8$uWKY|+Ds7QiFZA>Ay+HUePX{KAGhvMwEF9a z<;TL|lTE|L%-w>^fR%AR|5leC35h{T8mAY@yR~9EW7_fR3%0pyth+Nj*6cI1Q)Zp+EFUh#})vS-g02b36+Z; z@HwSaO0=;M_VjN-n#K7Y@jwoUUdle`%}n84fwQ>G*hsyV#t#xMe#)$k10a>vK#RC_ zMkztEXI0^kvfR!rc=PjR|B{OjrtIT=$Q?@*jN9lB*Rv?2x*S zX){Z2<8&G;Wjlmk2(+;ylT-xzK;N#9pMTHa?L@`7?@aDWx;t31(k_I^xqnY(*(p;w zO>tD*6dXD0&r&D2pHa*Xq&`BgpXqD42s*cl{-g;Bw7#qmKh^g#kD7WlC3YutrwQ3M zXYaSxq;RzUkTYY7yy%C}55`sd7?*x8;~yyf_)~r69WXh!TBQJ9lR+Tt-X$O{E5$NI zSOZ(M*SO9uMq&^mD`&31^HP}T-F%7J7BT_(+N-6<{?CZ4VlZ5VDL9yn1e(7vtbe}u z{=wM-`;Gjk)zbukxbuF{?&+j!A<3KeuqmZ-kGYsQVBov%1GQ<2OZVx2y<%;;yBh^D zJGOf2QUzOyDw9$vVw|2w;$@&~oI;=7E%z?%j*6D8Puw{qxPqEH*+O?rqOV`@c@67NOTcB&NbzbScQ6uh1drO3S%11%!^?vO($P#DSNLO z#ar61&JSL^HMNw48~>qm5nVu6it-rGOIBzsgHmHnd?x7uNwx^^sx3N#$FnN?Ir}q! zFehxxNMwgIAqWX4InO(KfTAyRkaI=p;Rb}E~P``u0aI;p3Rsa=3m&rcp@ za#Le0B|zUVZ@!vO^%b*jDmz~q>)H|R_zVsd^$be^)*d=L-cPP)u9NVr|F!9~+QzfO z+WC(!)t?y+DAG%y6BKR8m(I76qxZxs$v`Jr#oo1n`ZNryhEQGE-Xb>smr$z-bc@|R z$x*BWk4ye>+iu9?DK&qijw{NEgAR|Q_u21>)}veetK#j&bg_zcflB`u+w52urNol#clV;zlaAw-VpZ@}u5a$>5 zbBhy!U6+8=PE3J4Y*hTRs)aSLKG4vN+}ASg`>{+Y)dD+r8eAk2fwnlmUnIEO| zrWnkd#pei5D;P>l(r(xP&Tx?p2jV!m-r3x63f;u-7Le5iwJ9uJfN#_{)=Sj!!c)MB zm6zeGHJ1j+73&kp;VlS18YRF8Aj+O%-ydDiOl3-~wv23L)jo}o$7fTY1UiB<%+{<2 z$|I8WObi9KM=Sw<)zo{BRFTAQ>(`>pEf7qaE9)mG2c(=0dAbtu&S{IH1Q+J~%E5t$ zOVW-%aRwiw_Li9n(lZDClQ2O=N=lJuXB#X~{-r#=f@OP1%bbg%Da3K9Da z_!8Qu$uqC+HldSIVB%>=ig=? z{W6~R4nyj(&wPe7f1#-y0fT2ueU6}|H80`H7{Q(JwnzLA$ z@7d84tS&dxdX$O)dMU}tJcf+BCmr|(xF6}~5y`(kZLUR_YhOad2j?7I&FFbueDda0 z*QF2F-Lm|o8uP-rL!pT*2Cv=m)eUpkED2tF#3NA9##2o5MH#$=?pw@6O$aY5x`URb zej(X&a^kaNk5s^S4})ZbodhNcXLv=JWHc?)2$dN4zI2xp05t#CoK$-^O2u^{vIv?I z5w;ssWEU~7KBeQ^0mMqLZSkZQL^U??y-Z_IurKomAM~(QlmU^?6xq1Z$%;U=DflkO#60wcGVK^!ST=bN#HPFhEb-y)v zWAnI#?O(d?+H zlER8StRI4!Q|o1;b@oL!eWbNza36bd7!rF=qZbhEze@9skNxu3Gt?60|)6VsIiH^j!(In8?g*nReZ zcSC*QqHbVXz_2AT)apYTlcvGirXZIwMaBQQsn4k1(Z}+%q!Fg3WO)VfWW# zTYB*(hnHRjb@e3KvrlmLOtRXXFsFd#W1+iNux*gRr0H}OKwSJOsddA>DexZS{L$4ZG z^NX87YSWbm9hYn!7^$vHKix07JA*qae1AYzH5dG*&lvIb0G*JTb3Ia3V#_a=6&exs zZB8`Xo4PMvI-*WAU-2MffMY$1d6?pjVrdC`HjnA3K7PKz48cq!{5t_#8jfN%_2?xveblhyu? z{wx@V${W+v=y-aG-AJWOwHGx-oM?ldP?zNevMRLVM?f(C#&@y>Q9N{WHvLb6Ye(;i zHx>R9h*|}T!v}2J*9z~VD0cUr#GNMHS1S{bOtL8U{>U?Q&VLJB-@gnAn{O`Y&!%wL z{`wT{FZG3#4z1@}AKBS|^Ow(m|D&My z^J}oz-oN2dBf{e5t@PXceZBXhgkh)ii-EwIaiI;Mc!;+U9!_3Nmjoj;R9{Lw9of-B zIa>0t<6|7BDcwec>Nk!rV@v&-GPj6`bQ7DX0SS5PjWug{V{A;nz9IgMqd1__u$fK` zXy>}H-LGz_`%!z-;kap>>A)6pW^BHRFFn^UPWwzMhu>Ll7DwM*iZx?q;oE1ML*TrT zdk|;n6TSObnL*s8tD-YX4ATIgYq)r?e`YLc*f-pj8_4NT~N>6?e zGS_(@&y>r54(Q3KQri$<> zPehCZJFWQ33MtmnA$qm|-!iXzbrq`nrs!&lJ^g-)y>MoNt80NSeF&Gf40NPh)a}0E zhZ8`ne0uiNE_L+O`R@Kz&UsSN@%g`l=chfZn!8d}Q^L53`;hZZ9ZXPNPK#)n_(4@Q zI|cpJ)x_7$Iy*7_<-oDUs7JN{0xF6uPY}_5(H%#m^*np1iin*_&iz=D@6kM}Z4MG| zZKE$o@$Jhn%&|ZD7LyF`*JJ-jL+@24MInw&Rb!kP9AsegUBN>A8EsDk&Q_OutDctDJ- zsSyl^TG~3-Mhs)xCjTE*ZynZj|NW1PC?Gc>3OdFB5fwy~j*-Fyl$#jR(vEJJbV+S0 zsgeSNfzlz}CCYFhBONe8nAGTQ{J!vhe}32X`-^MWfb01@=R8lJ^T=W#UsR2`bZ8iG z|HgkqAPDyuW0g2t{QW1ex}&-}sc!taQXVeowoaxK50T&6oo4#uv`m**?4h)y@N&S9 zfHQoiO}CbVIg`>v%Z3N(23#O?Zr+FNXrOZ;nO>jY#zvps%o*(1eT-0Tg(^_`__m8UhB9or zM0RV|HcDSC2~x*iluze70sv;E5Whd5MeE9^<3K{p>KD*{}4D<*u=s+T|=YbWFZ1 zuL*xQU12o*NxdBNy$NaK_wFJSnea=9X|`cgad z4mdGTS>KKcC@8=D=9{haFF8(|9tNH~vl3CFIqcCx{aLNFM9JuF)6BM5P?lx#|J?8%OH$htt*X#F2}7S)9KY^7?%61NF+>1EcM- z%+5{6o89wXb>7<0!^DDbHIx)}LEIF%D>ygZ0cWeIOGt8!6I;41lbb7sCiiZTA=aEZ zuZCQ{_P?0ZsK1ZamYEs1P@CtyJbf|1>CTHm3^IDN8EX6J9nv}R=3fVB*5QBd;cd(4 zzK7)(RUvzjb%&?XEZ`sFJ^R~5G-sfEvobH=W;hwCww=>qJ9rtkkm8}u9W0gomDOZn zTV^4gaqC&?(WTi&Pjj)WV_sz-ua8$Rj+0c?sBuaOPw-go`Pidj{=CY6C$@RMH@ie2 z)F*P)(t0Wu)8Rh5-|431>l0U_^{%9g17o!_Z`r+yOA%gk^`0di^__R$_ekH1Yq;v7Ak`&X+1lkV=>08b;w4iuh3ydiw*85uJ9HMZmvr zlZbG-#3G7g7<&Y-^I;;2GA;mnu<&Vb5}J)4Cnqv1{}MjypEoHD@6u5XirLFEz2^an zSI~l%Wk~ZUAVV;MVplHU&Jm5ae=T5{4i^!tgz(CjQwcz#K3#_o=#W26k^I4bb??0A z+J~W)Q#oMq_E8M=8<~3ITb&0K^TdM*GB6Vl;GDJEaULxOt67d!6#%<)VbSnK` zf?u1@iv~ghGP)+ZN|niMSxkIy-D8!I;L1L6Tl45|0zvmbKxb*3g(5^WVLnVW_ z-S{8*+4m=+wO4HtbR=?%|Al(-lJ~{5{F(qv$x&^k2fRr`iNGWXqAf+5d4D-r7FbQZ z#Ghe}jQx}zz&L$Q*{)aisNp7eR(pN&UCLi?Dpu!j-=U}4`dxjD__wT3rFPS;1gnS} z6==~+18-h(YW5kI{gP5jorUnBQ+3|cmv3Z;IbGKQfyl4Vi)4rMGn57mO@FZa$V}sV zGbWzYXfWfReO6gW>>8B>Hi7cBE=9K)zl6A4(&B#sbnCr3h4(hU=D(_oT9p3K5JRV| z7<74WX>>rdo{2t|Z`QpoHJGt^!LT-f%7#@Nz+IRd2QrOX`rGzvpCEx?^7c-^%HZx@oaYQFqo4l2jks&F6Dk9H!-q|u)XdF5h(ogh zt3?s-nQW^J|Jts>{~=qMM9`oTsUjf9a<3g5B%cngN8Iz9n@0^OKzsI@n*;yC&a;Xf zQfp0EpAN|f)|s<>YTtSN>UGKP>y~rbs!b?t<`OFl@1xw5&K@VO)={_8IJ{rUquvAy z8PB@hD?hBpL=KZ#I7T}KJ5t|jQJ4M@n|&q|G#-Ew9n7+E{G8~TeyK)DKF9dD)D?$5 z%ze7YR9)2MFe<8Pol)S&d#e*p>C#v@B?3T1D`rrcxKPu!Bo3BI$eq7p$Umk-=LF8sr~8Tgm*-hDXl zvk>^qJ`F^!i!!P!r`GR@I9uko`J&#oX<{aLsbH79fXT%(NmEuAgh;3QFITvC1e7A` z-L%4#xP+s1*okVTuVpUwtyDjyJ=ckZXoBXE znb)FE4&V_EL*hL-+R*O!j&c>_RnD(IWj_KMf>L04z*>idkFL0<6J4PJLvY(FM%-7Q zjO#KJf@zQ=wz`)rR3uyd-6G5nUNr$Yr+f-xZQ`?J5}GzS2pkU4Sz z$?4~biP23@-0v*B>}q%z#49Z9i#!o~7hdD_)LvX_#?G8JbhC*m*VO!8{R4_+m(!=a z-`&s6n#)O3%_+!kL-z{%MH1fXKsa3N9=+;+43(^M3b;3sz>};+opBl199oZyS(zSR zmtFy&{F;k%5ciiB1A!I<=|!V%`aEapz>YN54j?6woEe?LhAz>sw-dZQUI0UH_4l##83v)y`WPQMt2&PdXa6fW`b7QK~D;KLAiJq~N@Itl|l>7i<$F=;f}Q@$QJOwV+Z%=+00((Cr4HJw(QFaO&3o(NrCHtXjhlOo^oi&DW+% zy2)5bpB9*?jSN)}WZ=R|jooS#L)0)bl@K#zdM*UFq@a+*{x(v#6WP1p>-X!p_vB@Y zcGpJB2ZSmmA5q%BuccRm{Lo@#r~0g{ufX?htE{DFGBD5u+}2apUj6T6dhEkO&aE+O zsRN*f9P;lWbF_-w{gZ|MoXKM#+X`hLEU{W>VY(~d8j=|x+|+uO6J7(2J+b=M!2<5{ zfX8b^J*Lkw%?}6Kd82m{W~&ESp8@Eg^)?@b_Qu<(UIq^i=-A%6FPi%}C)NRO$2mrp z8uZ%W3}Sy<#M>U0Anr*$!VnkpB_Sx zocn#rTD&eN|v;HwvTAFHx4H1goOrZ z$2u{xKvKu>3pXh4E}qP+ln;)Y(7t`wjD&!-fT@5wZ;zmk_0^r2L)9<Q-)bO}q6I!!v6C8_8S@Z6gmE4Qo zK5d9Y(uSzbNRsPd9}6^L#Y0f$t;W&^09UUws%6QZ=ebIrIz>{26KIB(%aE_it8}2y z#BxISZ1B5JW4FE>i-OUj*)A{qKc%182Iji{e)W9U^dw}tIb_*oQJ)yHzhM|-yV{dc z|DLHNEXDx;2*UY#IRBzVl}MF@diwxVSVGO%6NYlo-6vPo8Sbk%SHu3LzyIl)@CT+Z zmTY;i6Ijw;Fq|kkiz(%})FbC7$BSsfLV{X@IJXY#RzCygw zpTWD6gy3DMlf2V?0(Zr_!i*fex7@=OqS%$+nhHT|e=naoZ5Iu38W!o4D4V9$j=~ro zlw4D$+a~*bg zc;Fz@CqEapSN9SQ@jvYmEy>_FQKHeeoQp=(>P!2xYhd5Y`p?(!?hT5wYU$Oo;BERis#RhU6Cp6ouTqzDOBn6OX_tS1W_81lpv+7D0_;TvYR30*&`qAU!`eUqS32f>+PM47lqB|jZ!9=LY zlVR}FbeD|(w_-=1qU;TXF1xQh#mm^v*Xr0;ky-kHmv+RkJIM9Kh-HyYgZLm07)i1Q-=Cl%U5ox7^nD#GlxPQmGD4J2-aSIPB)g+_6?DP1d@b1ydRpbE7 z?IvM?RG5l*%Ys+-e60C{>aw3AwXyIxZ_vvIyXeeB7doNxVle-Bocf8QQNF$S0tS+# zk5G1#9V#7cevGm%dEbm*sCeS-LbP!Ys;@B(fPM5hIbgJsHfp=kB|&^_E87`+5G=f_ zgRa4U8Ns=|8)G74$Y{~dTbn=Ds6mj$tE%9RpH`NSl2%3}KW36IyNMp!DDcLrAQ&)? zFHN_2b!>qmybl{9+&lI<<@403N%zr>)}k{$es+7lehHw5D+~Nt%43ioJ{3j&s&(RTp0Yf3C?@Y92@Hw0B_im zoAJxp{ByXo)P3Txj%Ao_?c}V{*{oC~VPEED5QJHGmuab~>^~M%>~uYpwCNglhso}# z$<`F)6pv|9UqAY}pQRSR(!-PEe7IV^UJu46Xx8)mjCa|WgAqL@#d95^!S8-ROY2|s zr0E{HfE2cVua7!8%65j*F#qNyI=vLck1N`AWtY-$|Mu)%sz#8U)VK@s@<2xj69PEq zZP(Dq8LmW}m{6c069P(B|Ob848_pu7_HR{Qr(r0;l4M za0pzyd3HYFkYDa!RQF9-^F7Q;=VMLey5dWQ+wu!gHs$I48TjV}uuNV%AB4-|Rvwn| zP%O_~j=lmq=RYDWr`?cTKto5`xwV7ZpsX}F%V|1tGJu!M=C=FOK87tnvu$)_-IUvr zkr(F-$`2a&^)&9{TCxBKr5+iQX3bkW7fZ$9J$%mEsOCXql0(&u%%&*wV1vg)d0cyg zi0XtwuwzT^-}4E_f&%|PVtyN!lMqkD7W?lDG;2R}O9bz#uW>Vq@^3J9+dN2Dm#CuS z;!4|0Uy#4$kJj53FM!+Sn+Yv>77{h?7kL@(6o5lfW2s{KKid~XUI+$-=u2iELGve7 z2Fj>{Rx8jHk!y87hol~HfwW4%(}&VV5}g#^^Eh=*-NrCP(~HG{&0&JuUy_NujdwjG z9m_9z6E;}^>z|P-O2%L5$IDlMqo#BAtoaTP!R`6`h(8ATmo~B%th(06;FrqyzEwLB zwHRo9tu4jt{C6m?i%D*+C%@~@`8usHFRUzZ``Q2Qm0dFx*k@ewBAWT!@BVQFOSSr% zucqk4ew6da)iC^g(7YTRJrBrzys|vL!I?zGC0m{0XI==guGExgybBhL*M!awxg*Up z^(&yZnYCc81l<^3GszX{d4EYAA2Zpp1s0oNu06NYbgv4=Rs%x)^q+M(&mP7YYPlEr z^JkY{SQ^w;Z1#+1RGNA_oAT2r!f;Ts)o}aHX5D(r80|9Jka4GWF*x#WEBP;DQ2U!I zXH>Ced~=0OPr~jcJuRyc41azM8?TJb5~WkY=XwKQ_tMP!jCcnFixN2(jIlf_k#g$R zza2nXJs0+>3T*t{hvdYng;3;ydmR;yBiIbgt+~yD$-Dm9L!uN0zdR#asKi>d{l~Z1 zlf`nxWAWIs+9h*&JPnEGeZ@1k#N{_QCr-+q41V{>|2XImTZ~wBMt!hSK6t>+`DF z;1YAB=&S-WaCBuO6}i7c$ewfM!bK|j(89i_8!zAGls3>9He_!v-E%x~%{K#RP}zRK zsp4k1e>l-67jqthO89#HfvJ(e_k&*eGZ<3A9OUaZWOu<+N15CnMr7jR@?{zJ#@A}O z(N?k85Yz8VxsDsT8phqB414qM>tq>*Gn?P~{i=VYTvL|Pw>PFmcmv-3XEZ%$EN`;+ zvd@zBR&ghEX z&T7>b(+P(oODuc(!tJ_v&xN1M;=j)JXSnejVP{mQS;sNsFnzs|a!I#Y{Sc|H9YgQs zI291f0m5&HeOz9vID!JIgsY?QSgD$M7~#MMt3V(2wdQe}-_Z9~NLB*rC_;ifMB*{eO^2$6|FY^`eeJ-@Y_)}ik3A5SJFs; z*2?ES{ri>$X8!slJ*=z&#k)2ag=jK)Oi!K}I^>Agkz-{s(-Vlg>#UkJ2$iyFz(wIn zXG&<6_|qd07vVAoAX_r{dCxGy6LHn6*Z=&v&-R-?Ws&(v*!en$@?JDX9p#e4p#9D~ zPeC!^H5!d~q@-njM6FOdZ^B$1Gz!e6s?8WxY!^N|#uu0?;A=AVy%_8y7zY5o%-TR;;8rX1j~w6#tm2AR~&5!gnzpcZQPkllP{wx zw=2U0xmWdRqEN)vXiO$p4)bsFgZptCo3q_fJlp3e=EAT}wt`KfRVi$8alUX0c3L{) z>vUQKxTP6Q1friFbM-%e zmCRfp)!efV125FvVsAVS-O1jHu!#8XnF&sfkE>wsI8D4~sKq)OF*7q7HZz{i4|?UB zlog+=k#l9GxI-)=C~LXYrt2FyGze@E?GnR2eD4eSr|{R)1zy6PngWCtd!}KHm<9(< zlU>xeocT+*Ur$rQkH!@S^xUbOp}youZ17g^&b04})EY{msKNm!f^31df*|(Yd*)7u zW=CK5ga&%iIG%&^~jZzGN~^r^|cmD-t3< zu$m*{uvp?L5E)XFtE8R%-r^;WVidFF0;{h=+E zbekiie1w9+6e7o?9BNT`6)DzbYjUJCY1lhG>H|8r`zKPRBgLj_C1_@(7}mO@QI1*Z zsmxg(<6{s9n~UFE{4u!Hr)3PZVC{?+zs=(QR|4*ETr}P5oabDolvqNmA>RtB$j3?K z34zdu(tZ4B!NYdx8+JbcgDlG+9~370u=}9Q9vgC-Q$7gaa1@YIkyt$Mp$8Q8L#0D1JbB59JEYq;g_(wX6 z5n}Z(7=98bP|XFvJPMr4L>Z@Fhdvbg2g3+@!cT5a)`|0O+LHm<6bk+dz=#DB#Bz5% zx++6Y4RR89mKs&xJX0gX?!y*awQ4#)a~&4_q_Q^5q23Yk9h(0ziF^U%CVc#q{m140Ta9jea(2M+C)Mini zTt2k*#yNQ2C@em{2bZ8?0KQoi>7?w77?GB|I;3jOZ@Jp!`+VNu=0oc z0^1k*`7btpxm%~0?5+B6w)JtCJp@z|wjP<&^f#9nR zOQkmT>i&2J3EN(Fj75USG5^?)n2sVMRnvnJp*LO(R5fD7>??wqUyoop;gBhYthBZbWSrSgCbrCc4NT zK9X&=m!qu#lt9Nny#Gu}*Ax-ooKAS)IHk;xV>il@*v)%A+V-NupV`?*zvX*_u!?pO zo!OVQ%g|YX-*7gUs`Cg;i|yYsvI_iqBy*b?pSTqAM)KhDP`;6d>N* z5*x=YeZpCLbZh*_LFVvINp)Kc2Z&c#YrS~7awVU9lUm-}8K=NsWPZD8oJQW>x6Fzp zd`(Y?m63PHPqmQ}lOyuTEyb(C!7kI;kRa6w`rISK)i|YJ2DT>gExA7stSoCbOT7P6 z1Q$n)K+a1}d5v;eFkeMCnWML|Sz@m5^r&1|?%wLyDMmy(IhAtbLRCRHDlZ5}P0{qe zb6#j+Y`MC;P*LzaM>7^Fe;pKEv*#t zG2^cNW#Q${%PU%da0}~d2sCT4RK#4l0OgN9#Loa%o)1TQ6G%@N)n|Chv_beZUG@)a zMSS?&6GK0Lv5``L41-Sd6M<@He(?;<-Hd0+YiP=g(cy4g&T1x4^x*{ITl}(%az0Zv z$Ji7+IHkAmv~cp%YdYzVHnp8xA3cIX^i8VPTz2f*{SW zjCrb+ow~lGZ{AI5QL2Q?@=n{m*tq2=(U!ebCE1R~e!ky2c>xN2WzTS*U8)%foQxvi z4~5Q?^4BO1dRZALJ`xWJNvXCZ^|{a0mowQ&9H-ZBix-$H0h)W^k{Hyj% zDc|&9?fS>7q(8=vDi=z%!9P()MTJ{1V!1IpAoCr4D zxjn7DZ7b50;!l#qX)lk)M0_o~bAyG%NAD(X!;@Gtq%4i^Ov)~!_TNQa7rKK){(TK_ zZ_s?JfI9qg-C^>`zJ5XE%xr1n>N9~4r53Hhy7fgtwe58$Z3_PHW&wef3dgEBV$ygd zf2=)RP5i+3)vuoL-5V?+%2krT!4nC3O8>`DjSikp{*HnY4%*my ztVpLqy=zc(f9a_!kbIOdqF6opgIc{^YAAna-FLyR`MT-vf$0(9J{g)qE0_G$>t6Tx zT64Ca4w$?Na>w{vEb{Hut7;OgcARIVC7S-zmN&WnYRhP)f|t*kFNUgLzxp(du3kX1 zEis?}hGQ@t9v5M=q<)sDSYqF-F^$}6?2M6VJu=g#FH^1y_@@|em%|r}VNb&HOEu-W zh}>E%*IBA7$;CGC*+Ku2P45cxrzn}vPn21vsV{$Gb&C_`JW`3)G@Cku{*J$=a) z_!zMQ1G7zZ#tVQ<{LOiy?+&M3B&)jF**B?6`S)c8n@jruj_m>}g5vi)(>_Nj7u87; zXWAC#03(8mrCS=Ys&Thtq2ywuMpFc&{+Ua28r zSUPP@#)&Oo@_`pw9{Suc{DRFng(NCmR@389c5?3>pk?EmUwOkqOYSi4MNjPKT6GO1Th&TO!Ol^;)|kq63jYg zQj$ly|*2`;k)1?bW0 z3VGaz-R{Tc)NYMzzd2Jh$|Fe;FV3POR~@*Z<+=!qhgqt#;2*EcA6|Kv+B5P*xPulL zF9ZeSoZ29Q5%>nrS^W1s&}(5qY~VHJXI9I?7x+Czp22b6f;Y}#Xsa^_S75Kh@J{&c zfvg^P`|a*y2~-kwv^jr=lPo@~w!_|Xzf#{T9>yvET&L5Gq{V!_H%j%*q}J$9s@^oK z2H{|%JiMe~Y|xBs>3eL~c3(+FfGne^9GQyz1|zlIi0@2$6wW<6gb0DnACFZ#@u6P1 zbcQ0LWlps$(^`mtCx5*Ra%G$uC88l+eP)Y#B884-m}~ztMef~JU#z#zfd+mM8-!g1 zrtP_JKL#AYYx>x!d2iO;gvI+`U#+Yc)&-7h>}o0`#fcl zh|965F7rR1p`LOv|I-m#kk02PZ^K`Ax8vXQ-zp~A`I|Pv@>k#uY0O_g8&%~*2i+{{ zHt>rz{r#&%$wW><&pM|~jp;-@;abo`CZVyx*j-;MIC0%|yZonBrq8$su7U|yn)i>* z^828To<3QeoHY2U`0+0l<;vhr^V=J%RZ?)Z2!?vkXTYfZWK5w$iv9IUD=sUf!5Y^IH4ueD|tpy zPdkwLt8q)uxf5fEh7;Tse#1_m%4y54OGWk(|)$^!d0vAqoLe@wdlA8`Xj)`nmT#G#RSKE$$HnD;E>^Ad zT(TZ1^QvfvyZOI2LI+{H)Bu-ZTc!Ytv?qxClmUmynQ!ecEIyZor9B~7AQb&G%(Z!O z4c;(@@2j&w*5kn0V8`LTo%)Vt;gFqJrqrx(1+&?1-$DA#f5{{P|B$0#6y8AOMK6;L z&y(Q!zjuoLFO2C)_;7*a(*=_LlZ7{KY*Mf{S!Zfm$-!*iq{GeYQ=Mw446`Bo#N#X< z)la?TnkDtEvCOg3ZZ6SRFH{;PS;Ine@BP~NvXDYn5oYxo9d^ICt&Pwv87$~5(cck& zsxOS!AIanrSh7wtdAv~BS?smarK2~UPKK%iyd>UbrIuLxYsG|DNh1mtBY)^spL!KTq0&em*jBa zMfsbR5h<^2nZK%tZt(Hr+B3e{)(Mbq^)%)5c??Uvx$<7AC}LDn!vv83KeRmgaBm_o zEy1?Nj%Os>q*{rJyh@qB$e@_Jhr)Z|3$1eJf<*SzfB58}A2U9oLAea(BPKyMMW3a{ zQ&$oePf^iNB+xONjZx|>W;q9G4}JNC=b{*RgtYbX05?NK*5cnV$qOs18oOhVc0`0 zkM*v*MOac(cu4RFkZXQkKT5QNY3BQEkW%YNoR{zy54i-7@r1<;RI!=gP4tys@D}M=#H(WR8oRkhqu4H<5NhN@7_-7J-NCt_N(W~zWG}gdsR^Sy# z$WZ_1bKCu7*5@$Fj4CY#oBgq zNyYjttB~Pe10=tu>S*t-fpEN&O$$fwC1M*yJso+tvf=n@@Z2N$&QRiO7mB;WlAmba z+X{OpraO$cfK6ctY}7-3Y64r(kQklc1Fmw;`S1pmIMP`k!7!i8VL$S7-9h%ys5x=L zu7rA-G_H4Moam-s1b)AssQSGMa;D7b4BgXAsBGwMB=qRjc@kj!&W@g|z;BT{AWP$K zZgPF9wVFsVNk!-c<{YbSXr@kz_k2U`54giSd>metS+)76PO89G93MlQ1GXiNZ#SZH zDlPo~F-DX7gq1UQWD0h+DdkKg{hH~v{bIpc5}(bW7IP97v3OD(^t9%vEa(EmWixMi zA=vz*gX$>|uOlaEn2fLhIRr9^8H_Lol@Y9BLP7p=r+~BO69FR!Fx>Krb`U=+B`VWl zE1^-(&r~=QJz}d8pU(D;KSr;(9G@=As>UA$e}RQ$H}PdK0ZA7wWQs6aG+CxL`?p=G zL~;xUjH>^#^$~0${?#z0TW8e}KC>q$JYiHeufo`@+UU4oblZga-Lo=R!!o8{vdxGF zo=-og<@87WnY{J<^Zg)IImp`^>_RU)r|T2y8^ zKsWPBUjfHPT(}5*<31;+?6x9s{S_C;%XK*C>-Cf=+`7ZWKQ!crQV;dQskV;+sMi(L z=CWRc-48g&tj}nWM;p9RYe%v$h=O`=ZueMn{xj+boZY>9yqm7bS*GMhEYr71Tn?5u zi^fXDcizwJfOnKZRRxz28f%#fo%TdV^Tx2tDASPNKGZgU&zM5{UlF^9!E-^3VK%L6a^~d5^Yr zOF@Rd8%pd(bGr=+9vB8bG%X|Meoams_->&fwkJ>olIDrBX5M*^>?t?4OLT_K`>niH z8ND+KlC(!KaU-{eOkvKv|B_>a*8TlU5;Q|7`-=oC`8M&#O!BQiIIBx1E_V&U@==(g z*6WfUdlNpHfh~atn>U@A=eY?^otKEN45rArcyMrEq>O2!{{Pjl{ufA!^;`_~Y!9R< z9VjhoGShc9*1w{IQodx9gi#8N3!}GT!QW^7SL86_^4xj)fUWdm-FU~Yeq?7uPe26W zIg|A%#|M)Pp{4Oc+IVEX-}8J@M`b;MGWx~N+^f{v)!@KsGI=%VDe@=(d;cU44QHal zhS|;x`@0`Cvjfeh3uT?}ur23pKx&jqhsQPZSxMOARj!AyihG!?v0idX5OJLs0&^j5 z-M@<)S3Y@mHz)QVoWcE~`Vh!JB)Qh2Wabr=T%JLUL-fP+ZkMJ>;aHDxut3M|g1*$Q z&s8D~jKzILZV${YA>-y$^*6=;f6+6r?Y#GW)5T)`QhIJy**Q!W7d@R}CiUwqW6d|4 zuM_k2m8N~F)PNKUv?kM^_iq|7qwl6=eTIamWi~YT`#5*fr}?OAHBxG82_{B=57b zS53crm}r`vzDwSf#w3qbQ(sG2ivH-t5p5k)dY*svz*Q}bYW^_~`&Xp79KUxZAZ(zB|uw!dq z^S}i0sxxM+6kk(F z*LQ#6Ze4HAv$(HbM5(_<;vM8~NZ#|XK0KRt_8d`Ng38m;=lIj3F^R>Ial|&HYwnu|hbPnM!%P5c zg#EO)&lXlug1F+p2XtuODC;g=k)BGYg{674ywxQEKGSF{(wyXB9?yvSq$|0GidT)sE405K(-rFa?M|*r?fp&&C(XGW{5y|ai+q7hav%N-HfNR-dDeAb$ zeL4EIX5Sxy94@DkXd0py#vTmXY7{&p3F!*+-|CZXU6@JadwLbTo*wp>r;RB7c1tA} z{`MF)BI@~_2w_8bK2g|&Usb1}Ol)8JPb!}c-TVBUF11T>+4_h`!0-2v)pdLfQ#k~7?r@0>F;$?48ud8jNSvfYs9a;o|I>U zy)Zx+PN{mk%$IMQD#8x@8@>edHxUbE@N;I=x{(S)CzTUR3od#`lT!hi{AANzIaPnS z-l+TwPU0sHg+n7sMbUdd;($Ck+?kbp z!>Qb0xnIukjcSLE$`eRVmHhtDh^=rjN(O>@UV#BdKLcR9b|Tw8N>}*_0e>V@OF2QV zj8)sP7i}?q`VPTEO3-KwYhYe-t~sB?L9Qht>%Xq zXGeRVSdd13xx1vWh46zq9}q2g7IG9w*s+uQx_(x3i*Wf%2v@89s|R*}mNU(oeq9tY zlADJTj9vFGwD3!v;{NP&M`;I9bot7*zA6k_95$B{c8|`W{;uOLs8g{Tl>SnITGB!A z8k1&hZdnz56%AqR8gRxt6=$xe?R%f|QzAH-T2VswFGHSgS(>X`hj3ev2+XJd=Yau2 zY3CZ2p(Da8et7AIAtHWuE}?(WCZE%$XI7%hc+UXKR_U6(v;&O{l5VmT>044Ulxo{QrD5YmN|4Uu4s7Mm9K)6+F!23@V(|<0`9wYLRrN z$a&E&Tla_U#1JZL!mu8P8=e+0M9+LJqQ_J*Rs_~qdfsm*)zzrZ-3W9Tw`5j!U6_e~ zaNP-$2@9Y4Ww9k;Q5m>Ff`rc@GmpmG8~&WM{@I&#+X4Xk2D=IKCz)qWZPEsRn-fhK zPE(raB+87zn!YiSijE-oBmjVzIm%rm5o&#l&nLPc-(r%qR<%v=76Yd5p3!xACBfY_cMD4(tt5HB>a%I%ie#}%|L8gE6 z0;8^c1V8WEW5!fFp!aC4?9XADg)?byat%v1^6DWC9sC=zC^TU`(r>hXQh1#0PzjZcq4{;UbL%$l^=c!1#)p784-!IQf+wZH&-r((hx z=2!AP8tw29^)ocE2a^CsA!ckHHYI(%(J~PdEzPg8&)cLKvP5s2_|!|KGE>J^{%Dk7 z4xvAS|Av6iSZkSf^jb#us3)j;>lg!D?F;&nYuSS|{3AoyaLB-Dp?4okmCpZe+f9=wyYuvmOy- zQpZISJO*@*yY$~K&@cTR%tvRyjCqo~FZMfd_`jf_vW8=Wb_PvWSRj-)!EcZ!H$cy?fhj}4~dDqJVCYD_BoDrc)YxIn=z7F7bF+PXA$CHdo zM>Gg3jKiO~spGV7ih$ztUDTo94nG}I@X+A549J(x{1;6VRJFEUkM2wpi^hTrSL3C> z3M1uO57$b)FlKpJl(MPHj+}`aBWJx+U2SfJY5<(35$zZ)Tn;+jweG z?Y2MF@u#rdGJ<3CF`y>h>;4Lp8be6mzV4UIDl@RA%;~{sB2^?X?@l-_|E+x+Lx;=) z7t#sAe3=t;`GpR`XMu=j981-Smm?4zm?8#qM52B``9YjdDqd=tcL$ zpl-1~_v+->UKxh88 zQajZ$A_2~-SA`K{x1M9vmzdg*JR3d4h%2qeXsa(juQdymM^G zaWq9wz*KH~1Cilpj=$QI_nV@e}K|5h&IJ1ZBulR4lMf!h&<`j zl(}bQPTTn-WJBom+swVz&3mhF^K?`GoBG7_L@M zYBz41|CW+(?Is|oa3I*JpRyu%&~|?~eo*>?YE?P$E!;Jt9gq`Y#s6p&p%`7N_GS~^kc*LL3tr-C=*RsrLpSt& zlPg8EkNCaXQUmnFkN;i;og#&BkKud>!_-Esk6`B)?uN?kW%jW@Jm^@^`P-!0;HBCJ ziB$ZjaCrIop?DR3krNF+&%KDsh@-ppfnWSy_RpuaET&yc7P3(A^MaQ?-|oM{V4^rK1Dw>)+OUy}{zs&#mgQP#z=9OvhCJwH#neH@)M)DUFQt|Y zLy#xiY2=h}o@}ym9CSM)*j3aPa^<*la$cEcOL!CP^eXqXG@1yR=b4@6ts3EtldDLf z7W9|>n67Z#3J$mr_<U{EavN zd8T&b6-E_O`sP8`5dgpP>HK9CHWZh_(lElP7Di{x>MFnf@Skb9Uk75i1IX#msY8>f zfYo|C_McBa$s?szgF57_vZTd@xaDq`AK(oi9K{%3>C=wZz4Oj4ZH;Lq^-)My>eG%t zEKCxF-o8}wOjddNZtK?v?IU7&eb4_NO;;Yz^yB|4CC3~^%(-+~CnLwg$V#PhBvzxVole}C1Z$D_xCz4v|{&+Db?r^Bdu zVtmi^aMN}mL2Tp)YnO53RZ?L=zrR<~0$Uw4Io5 zG|9)86RVWRpIGteo%$InhV1w8BC{g(D1j$p#%-7ACjQs0L&`(fX=T2XY$!K(I$)$% zqj&rhS~6(rR-i2)2=l(wx;}rsP;268taB)LLYMX+Dp;M2Vrr!6i3(I79#E&rs~0O@ z1t$)Vw!x$x#`6V?yrF&d8_>g!ThHS;hLNfv+2Nenqg6Vx8QoK>sGVqfIQ)6M@m!6E zBQy5Ads~5TPmU0u+Ir_7AKmzK6t7L2R~?0Lf8Uz$lexoBw>E)$+Kn>1^)g95aURu9 z$1(YElD7lKzYJ@sj*n5MiuTpx`+shQkCtR67)S4wEA~`|Z-18W}fIGqj87>o1P!e9YLjaQ(){)J+l=CkPTG$Zeq>Kr!DIV2Pl_Id{(| z93S2JH<|vW2GYm8p-;AGL?`V(-7Yw3gPnUpbMy;{jqkdbtEr4?w*>C-%)t3ft?8M8 zUOfe&4#K(V1A9|R_u{+@`3_CXUJSEN+UISe$)(Lxc0UD3a#lYJh?zFVkf zEUR#&a|C>mp+rfF57nzior-}A7jS`&h3?dYUp@=j<_bBewNSGn%&edA1jc{~){umo zR;i(>#9;-do3QYRyPw7ES^1dlTW&zwVw#r(FtnjAe~vLcJ_H!%>Gu440Ax8VSiUws*c~N6#lVbC%fR$?sxT#%#WA}qUej2 zwef3ez@Qa^anJB=^Jg8ZzAyE8%fiM%rB0UU^M}THS{#)v39(soFo@CvV8ZgbK|@rx zw?D}{sfqZCgs8(S<4!N2&S)ZvplLCz1Cm;o9c_Xjz%lWUMg78)#aH^r5M8v$q5uyl z8UQyF_+T2te$=YgQ8R-;^s3)hJP!i3oo=<0-Z;8f8RVTV%sbt-jmO6fkSmVZ4Xg73 zBjX71ByH>5z;LAjiDN&}l(U1_KMFJYM;`G1so+E7p~{TFE*qyut7Q8$|Mk}qGFBl$KTU=O)g`q*0IrFq@m zsY&1l-Wo<>bAS{4D0zREB4an1ZdzvovzvxXUhLUA7$7!~0{pWupZe~~M8W<>O|{SZ z?_0vC?Hyo|m{!5Qb~F(g94&FLhH2T%)`A~zDU@KIRl@{5EVglPL&@OVZT3hwW1d+m;R~EH z;DhU)Xcj5k_SaZEN1R#`k%X0*E_k4cJ#caOaj?K?T)NMS;)utPZ1c_fkTU z4{j1wXbx1N$&)NOxAJkK==rU*UwMVMveXryUXU6$f}PD@HzA9~N&_+NjC(DWoIHl8 zeRJkg4Y0~k&wVlyA;LATUnNa-*)WsndxD#h7y>c>v0|)f%d?qFs`sxl!M=;E1?(dY z-159db_-al_IKj{UgAMOTjuQBF(LQx(iz}-xFxc4HTrj!nBp$4Z1O#rkZK6z)9f^aj|hJGIKL zTg1^g#t;?hsXSUji@%h1WinWJRK&wAw~izmB6?y#iIFvO?_=2CTIzUV&1Fn})T(3( zw?XvW&uz>2K8B|Bj07Ib3$Vw#S0Icel^9j50kXXPye`W-@xQs?Ku{--uZ7KU*5E5}LkGL7m8uB6<}yAhK{bRee2N#}>7#sbko5|8pNa&{EV+xwI+2 zbNa`C@T_Y zsv6krg{AuDHKjos2K#A?0z1l^L9e!xJKpgD>o0jl`R`$hD#j0BZ_EDSKG81VJ7bV?5@NL|Syq`Kd3m_SGJeX>AzLB#G4%FA;+u3r%8E%R%0+GdZXz!tVt2 zqkK|RQevi|2MG>g_cm_^eMgFrcFM^Cu5GR#b4FmIQesrzsZMX(#7R3)Q~j5hAj@?= zc*{(>GYHc?{^(6;z@?z6nBBK_HE$c?D@io-KNp=re>J*=<=mZdpFa(~y5_rafOs4v zja|$9tx&Isl*Gm$o>?> zKI6~iyw1w4#q;H8N>U~9D(hcF*w|k>{?PEE=U)952iyT`kVX`O+4itf17HK<4CL#m zd4X>mP~UoP*LxcXy&6W7)s#f;13}XYV`UjrI$Sm>I0Z}G1~!2WrH0g@RrM!#|quHu}u&FyO! z}Cx*QoE!>B{JE z?}-$+INk;n(|%B>gD-Z&XCPkHQnsR7&lEeK zZ7DVMqA;vyN>$0HP+c%>s;(SxPZsfd=*M4+`7OMu)TnY8c}ynR3Tn0O%$r)M1*uOG z*#V{T4mJJp39~;gGv%S$oeF&Q<6o9X$MTp9gPj^mt=2hD^9IyAX%F-maHoNWlAPwF z!cg`H4|y~v5}vttaK0q{N^(3Yxbu*Fo^kyNUvcmFqi4Lt67JOE<}re@ym!21-@@2P z4lPe>xmY|A6=ewkbkqqW!Vy;#Q}@T%v>GsGl+KptD?ugOfVs$#q@Eq+tJE)V59r;e{ zcwxs=eXk{IY;_lwX%rJ8HQ;Q9I5Gr(qI%2M<^HPZaRTGF6^|p%Fm~G93KXiK8zX!4 zDgJTWrq@(tgtT-23EX{Z@qPAHZs99Qp+CC&waubF;o6I3cW`?_wbXXA)$+jG+)Wvw z9+T=lW}`d3EGOvXKRZ-BoRVPedBI>JnR;rf)P{a8}f64|qs6wBGN4a2h^h|PXccwk#{!36WO@N>=z>>X!|B@e1M z;dl#q)yg*i^{~TuxC?VoZV1U-#w#c^fbsd`!0Z7wiAt9te-$De}p zHuU;u?m`$NY^{oiArRc(h-)q0T2gG}sKuNPYK!kApzWP!D+8kPsLW-mq{JyPa`GiS zpy-*DW=&DRuXq9$ZoMMnbVGzea*RugJM=|v`ctYPvM#LX#fcun<`ZE?{YR%h4IZZT zq=staPr&-xO5mnOm_Jz#q}f{kU|~`}hHLullF30`v)Iq;e0FM05JIOvdEX0;Ks zA!SP-5_nUr%r2Bw9CB*W-YvYyL3;B6OFGE;;`Qm8JKx{_aILgYWC+;V7*3%yOzjp= zo)N-g_jiE1?bfrRRd=s8&0^%)2d#hBf}`FgyVSp0jlTZE{dSvSZ0a|ANt9L4biwY2 zMib^x5W`Kn+_pc3cn-(c_7)YzC$7GCdRK&>3#81eYNogLwc%z7w@~#?PL1y>iP;Y^ z!;K51Y&G18K5d7-GCX>1vVp&8yzy7*=(@lFUinrIzXSO|G{Dt%&CA+(0%Sau5u8Z;uO6wApK`Jm?A5P|ZOb7`e9 zbfG>*R|<1|E$Kd|m^a88Ix_vW60-FY0$y6uo~;5t?^1SF8P?=*ieKQmDQG@ZF$UHf z{_d0X?naWk1mneu6rda$J=F#g6d5`rcP@8`9<)z~gqDuOtd&0ptU&fBgUtQAlmfc$ z+le|pe7yEJaJvOK1KtQ;AG~f#P6~Y>fILuiiBMaoij_LlD5SmDSHs*$+YG^t?&OVL zTV3q@QWtpjYLo@sZA*qnMw~k!*HW#!&Sa8F+!T|2C>2+2JaEnvGUT??45QtX#fujC z)&#iLs?mpwedg|3Re%Zh>WqQ(dz)dJL$n4sDJ`<7FaVMm>koonFNJAz%laB<&bLR= zfh&EH0oQf%k&j!pd>0Ezu7gkT-jl263J^gtPY+C2*Yy*svQzDwUj5W9vA`Gdi2mN8 z9tym;QeW0k<$ZBivNo$M2M_nrUo~?Cg?ii_0i3R7p8w>h@i6oT0v?K29+LCg7*5rw zxj!Fu=-`p1ZgDXwXYPov_rKimU5&KDbA(S`XIW$+FiO)jef{!q8pSAU|&Z-&`ytbRNa zw)>s&p$>Yn1jZXi3*Y|QA>vDXj%_J<$!`Ys20ab^6H8vC0rS+|G(rjk9psvjB#Nvv zkpwX2Fw*Z6KcL3O)6Y$hYMr93X|$If1P|BD=TtkcdRoyvBWrf!_SgPHO2Y6+tF3zB zk7)Xv!oY~ka~_KA`{3?>dpIF;d_aCW$;ozMuXmQXk%tNGNSuGx%@cB>MZX~&L!fa^ zt5`~3Lc|}h&h?|;YlPn*WWfvO!AbAz7k}azf2o#OE47QK4-zFUeZJs#dJ3xT2-Qmh zLEdM-xdIwo(SNw2{FD4~;>?tSeBX&@&;pZV?_FfgNn%!_K54te*1-<1(+xCPlAI~qrmk^!mW;IY}@1lcFnK47Qy?QsZm zeA+4HM}4yUb07OZx**5R;u$)aFv{=?a@!u1R;Q!YOF?r_X4S`(!KZN$)rPWV1^Z?U zVOwEcXhhI{N&lEvYc=J>N!4CN)`&NSlQtE?hbSv`PtB?2r~i%#eE!tkw<~evCr4$N zUckR$Ebsci;)_ejsk6`DOBR40GUVSpv14HLGyKQpq0nF(Uh55aWoMB76c-wQIKgln4niu6_UQQsp&SPZ9cmTLp{Z}$Ry+;vLt@m(NzL>)_K9=YNMW~(3h+{ zia19*2~OEv;PiqF zQQ&=e*m~R&l6J4&&pJ_7oAR~~B>}A;Wp0+Lr}<~4gwOJLy$aw8KPo9xxxW1DVDuy( z;WT^Kr~P?6&z~68wWbMxRsX%Vms>Y0z}DzGUMjr(?`Kikwi5$l3!da--vg)_RWUp-JXBx#irynPWPL^Z`}q?nSMjx<;)mJ>Sd4o0`X$)9 z$gEwxs>8O0_upT`2*F9t)Zq~p=fOZhFuZ`tLqeLS#AV|#DO&@HC_T5w%%|?;r^gvD zNwZrJD9KKjN-JQWKl3woW z1eFm`L(S-nUdTeB`>dzxyN)7vOvM5@s2^o*E2pE}{82)~z}E2gy;TfLp(xrx7z+u; z$vQ(%>(AeR`2!9;!c+c`&~xVb{eGnermjipGy!&miHYT)ADc&-INjqcbBBZpXkKinjkX;o6t9cx zFR<{}Wc??{U1iG|CNtNtgeNO&Hg?O`KnovbW4gwNT`DIYrLSf%PQ)CVk&4}FgZLcz z!=C=N+@wt)#z32_c2@L}RdEeMZh4c)J%)C)KWGh~VrP!04UF0{A0 z?NET%zm?zFf97*vKK}MrUTq}CI)9O7skzyYZl@O00q9_R4}czSX|qh=vZ!|i`~9R_ zR{ASFC)N#O-$JGJ1Rowbto`Eq_^_n^N}YXdsf~uy2thMFPH$huo&4V4gzdywLCO+hQ@1lCfi-*=xIkJ)8sLPzvz49UZf*Qsi zk~hDIn--nZBh&lH>|i>p1)_7JzL9J!U)SxbDD9QNSzUVk60sj76rUjaSA z;x|0-YTHxql|(M})op>-8Xh}uc<^9{k+}5vx0g|>TS@XAj?P|SX?(?Xc9~xQEbqNq z4^Vjx4)Py_YqlC;Te&a%KHybR9Wv~v@ct|b$z@iZgZ!&=ZR32s=6E|>9j;K??8Tto z?XDQP7LQ1`<%(dhH>-plMMdubCsW??5i z*9Y}}M|t2W_;J4yGGUCt2->GwVKoVpVdYtpr@4%Fa!%Fce-xfi+87Q?onUqTqV?N5 zrTd$s$x~Cu7;}a0uCPz*D7cI=B?hrGyXI?rw#3p(GiX8KU{x;I*np5a{-H5&?kFW> z$;GZPNY!di*oEOU^4zLyYa+M)>kck#YDC3MmKZp1kn$+-Nt-O$rGnje2G{7v>81_Z zG5{%d{HE9}njR$)+zwiTg|=!mnP8j%D#1@OC15Y56Wjq0oOms*^(!ilMK8(x_rW9> z_*@;2S;xqp{n>yK$uz&r6WR>s=Hi-QrpZqHlKC3SwE!0Ay}T%F{37ingso-8lgrhp z#>rfg4g0ASKYdwRs$Z`*ZN;B8?B3h6lS^E1@Rgy5gG~EnWslhZ}DZE zC%SKv&~2#Y)HRTVRtiUB=pP!8Lh+x5>7SY@$GG6ig2%F6x8qM)=R}OE1G%d17a{AW z`gubC!Nhu1PYwxEtKO%XSB&3~z2AAX#zLxb_1cHKGAWMEF!4_mVPp*UQUQ$gGERh? z`CUt3lO*46e%6u@F@Db&wo#tGI)ACY{7!P=BxV5UXE-?_AzZWR+F)Pxrmd9bo>~dt zoA&r8h_OJ5AwBcf^tG!X$xn5e1UE;I{S}0w44>4*Ohoyl7Y{kLw0a}2m5dz_L)}B= zu8PlmVhPx;{F4_X5V#s(LBSbdKCgC@(=GX+M+UJiX!8xN6n&rX9Ff90$}%N93)oZ3 zMm!SFjmi%B=f1TTfbQvs#%$bZIIzZ&Jls8UHURm(IVlYG7*|JO(QMTwe{sL-%cBvi zUvsewUsF6QvB5(^xN{KZN_bpKj*`w^8=}9LjSI;`dVMTg^gJ~4{>Dd}4zCfRd2881 zoL8bp#B&6o^^%DK(o-}flWS<+%#L0U%Z+T~%R@f?3aP3j?4oEe4%LNzy{ehm6`Iy% zaFifQv3B+;J3l*@L2_0$$JPg~nkB5H4l#MByrm=1=yeV z>pzbQ`T_~Avu{a>umA@TMg3)y#Oonn3UfqFZ$>}nYW$8-VL2Yq&2)ZO7tlhu60Eoq|C@H`ri!-D%=IYlZqmsIv`?MUOOCbI+3jXfsaHIpNd4Es?fu&) z8qX}nr>ytZqW|gt{y8f#G_vbJd4>{McX= zkA$xz`OI<*B0~ui3yX6#pmxR|Z`t5y5^DQLrx~xDUp&j)zg4#-KaHQ51{A0O5itX3 zAf9xXgdE1cw+PksrKpUS?}pUQ;|td^a-R=1rl=YTM33tkRlZ&H0)=XeJ}L}M#z5-x zS`{yTONg5h`n1+r>!1m~g@Z%8^s`a7Yu{)laCukD-vfKz6AEPUxz}&m;eo8CNqMPo z*$ilxmw#`FgBd7i2LH{TgBr>$#%6PHzb$23UV5mf^E8r{!X9hU86|_Xl+M}t;p*4K z_B8ue>zkLiPYYr>9P^WrA(I*+Df~{fBQjVR`}Hb+UJ267uqqj= zS~yd05<X>3C^BJB&U9tZ`)ttYAT#nWVT zN5TcEe;qnctc!;Fs!aF#{=zMZMmwAJ8}qS+mmbqPGxMX+5}^hXw~Pu1`kV8uZ{TBf z({+?dx@hqWvX8u>Y?G&{uWe5tUvn~$gg&el5Cn}FrB~B06IWOu{;Ki*yp>wB+gE2* z-+rxw?Hk_;d_E?OzVh8=|6<8u&pGMp{Hnw!c{#2e>mk7inkXbmnk~LdRW+1rOynWX zJOu2c?*0F5Z}t(Zwz;I+_DwnA>gu_n4F}c%UEFTNfg1yF4mvD4mRg)~lBo1`=?m)2 z&`2SP&a&3i=?k`kF4|p~}7hk-DE+hs#JtL*t0hZnRN0)raTX;Wuf6m*jMw_UIY5yy)wW$}B z30^Jt!UjDMBF3?B645+R(B6VoO`D3xBr!^0Ak-@jbUG&aHtv2)e+tTZ9>X_&6(=!? zUR@iIu6)Jyg9}%W4q26*Nm@Lux}GumaCMDkD*PXP6eW#%|IKSJHg68*qDFz8vG{h!;d>Y16H7ZjZ{z+D?{INy7FYwswpfR8_&4=BHonIWd-P@UP)9 zM5}7T?U1^#VfmTBEKg{$gy(uomfg(vgMxbodS0K?Wchcyb@#d*!g^RzflEWy&IeSr z+fEzU8H7_c$nOi?tKT->C9qT2Cd0KPMz*Uz4rKZ|TV7lMHO~y5%A6TY_~X{WL;1Ae z$BJawTG`Px#CBPcq5>YP{%D6e#7{hW9|H}g9cpCsk9zqOk7kdJHyp|jnCci;+6G?g z@G*?~ruR0+2d=xZHm?4!EdIx2A0jdn;vetwGuQ9KG@oyEDQYF$3eqiJbJk9wC+uRx zGLja8_5hmx!FJ>yo<>n^O`|z_=N+k}v*_rapxH0??DOk82?5b^kaUEkYFnZY<44qQ zeA6B(UZx~3m9#lIaw<9ZuFfblt_vNkH>9mxE;%iU_R2#azcC@0CG{QN8ODo z$-Ikep9`&BX(%Xqn=Xhq4!>+@ReQK|3E1!p0T1*RFcDhLhHiem73Y zdjvzt6&mI**=DKtX`EI*^o@8}7 z+CNT0`FO90k%%Jh87-dv&Ka`9rkyqH0K+?Up#o@Qoj}Ip6ox1ggg>I?bDgsNocB#WOS^U=V)x- zYPvE%80{i381r(EUx#OsgMMvq-0sz7%ckit{U$j)bLGI9@W_ZDJYr?uW{BUesh+!W z#oW0oXfQ$S=zxN5hvL{k$nK!DE$YB^#cA-pz)kxgFMvdn^cg#2E9&7x;vlYmB5<&k z<;0Uj1C%Z8(5}jmriooWtSZjfS|U2`8rTdfAM-$s@)M~@Et%Ze^y*IiYjPSf8Tt%6 z49FJd&&6Cx)m7i8sn>v!?*hWhU#?n@Ca(^s4bz7S9Y+^t$;T0Hz8@Dw0~hwYf_8NK zddHPENb1bhW-J7!hGb8_pG4Bk-Kq4?Eev1vAM& zs4D;QG4IVdlqgqWF%QrI_j0Doy}}R?4`O4WyiNlTlYJ&$H&$=;lMsq?d{5(rflE1k zs0SbxSk{op&USzfZh;G~K|5eSy->kKNsaMkwFu2lb48TTW^qc@)d!W34wFQZnB z1E-BYvNyoUr(?e|+Ikw%K`qobF6Go}hS2zve>g+6awr91i9q3$MHNdWDBx#RZsGX3 z3&Y;SLA$P#lIc9Ou?qX<{5l_k<_{ODUlkJ$0i(9~3g?GctPaIU;=?m`+52yqnBYWn zaDmJ#>h07M%u#Vos9BXFNjwspuT(X6pY>>HXZ}@yQ(HD2Dc=ioigvrO!4#It@D4nP zNz8Z1aYiZEIS^9v3$Y0Sn;1w?=cdRS)}04jYO-|yotq#AdQ{KrtF!DX9mq94Cl;WC z)=?^4xKSI<(Pw{e>s=vz#l#MZZp4J%s*`i~d{5OBPrrNF5n@ zC9JfR9yQUn8u%L=YwNS36U`C+}ijM|Lfb>>skZdbxv~@RNp>m2%p^kpcTXE zF7ks^m)^Hi1uZis8M$BjXhbilLvwMO6yHjNjg{xV_-GinunrFHd%uVA*Q=%1>D4oX z1=&qs<+A%f)OWsnB+%RfPi|&@rE>#N`UBH)UArxl*`e+u$81DN%wc=nBn&ZwQ6c_l zu8Qp2IJaJFYdHt6DkCKrW0TKT+B!DL%}NIDVxQzshMDgK4*GdRut%AGi`;>6y3HxY zGPAAyqn1e!+*cH`p2Zk|{?m&Gs~e+?FBxqiOD@_if(e{KQ(I~9FpJFubp->>$UuSnG-F96{$bU5;;aPs5L=_m!Tf3{)y_X{sw6Hyftj8Lr#YWZH32`>+6BPK=IEeiECl+UdRc4ayCw1?>8Km zTI3RRCVk^47Nb5Kibgf6qz4vwbJFdP+)R$x3kY9I2quDdGH%^lk}khM#0tx=e_mRD zUN`&2c}7N6Fky(}w<0^7_aW&&YYfH0t<0uUu z|1S-vWBIt471<2E&YW;zuKS=PVD{O{WVKir9d{iWSspEW{NX^X&6nS@*9TZ*nLa~< zxL~!vlkOaix~+(_fa}(jyH53tH~KsEpN*~bY(y~9qA9P@w{d2Lm* z{}*pXt(Zde!qeJWG)GN1YH@(ie6+Bk71+gR?);lcza{-EY3tNacqaJ_ykH zx+<9kCxN~4FUN$bh^pdn55}TEpm2))w*#AuufkOhiWt9HnSG0y6|3NVQv+sZ740+C z900!Jh5sRm$I=ekjb5DJD=v=Q>$GRiE-_->vuBrsf&Uax1++;W&Bxz;6ms9?H0qzq zcF-7~DQPJU2tUGUBR~@Dbuqj8D(fK~v8Y{l9&Xpc75fhSrt(x!OVZc36~RTtqA!P2 z?7+tmTXlR_h%b)qekkytmS5wQs-(J^Rov=)W8d4!#I6lKpVWzK$7p(y-#!=By)W48 z%UgE=B|%!*nv9VNT`UnTc;xz;h`TVcAn0TC;h1S9KReoIbM8cT*ji}r}?k;>`oTcc_P#s zAXOeAZ)z%Ej6R<`1U!m{Bw_FeQ@iNYqi)whXWRBgL9({p;(|lg)sl8y)h$He z*ouLSUP2?+Tv?gsYC>de{$B2ekFe1n;FrRvqFR`)E{B6dA^3y7+?d?+Zx zXO*&U2G}`;SY8L|eRm3(_u~4USv*<&nlE(eD;W#hDugf!Lw38;woXXxIvwc$hvTbuNsrR0!*t=x6RjSQS?RpNmI7 z)LM&%Y4Ax@Cr(TwD}l=irEP{yza-HjTKt-oHVp$pRsJlhS70FjQ_3~S9~oP?Fxy^N zCtDlAcf-VJ$k0@LwBlNeqVQXaBS`h4Z0`1Ar}Y$kb~2&DpWa%t+uC~MG&x`yEj;v9 zZr7w<2|Gy|Z9>)lz$~JM!%(3_|K_`vMZ1?fFxT?dQfPqpH>Q2wds~J%A=A-OD}Olo zq0b_&9NV4VKJ1Z<<*(0ci8BW#+{R~4O6 zp~|iQoZ{cfyQXPm7Hyh)yvCI~83AS2f5Gek5X&{1aLU5nvnM6hpfo-HB2BR)QWq=q zJwBbR%I~E9IG)s3aSce`az^ucmZ_K9f7ewRJe}D(7C2p91?1{@h>_JmLeP=&@CD|F zBc6ya%Ps(=c}gILcjkcFqZgrLU=hc7*kJE9XB0TgGu|v-45WrNpYk4J!ZUs44*eA7a^mxoI_F{9JqyRvI5Ruf>5 zH1K__PyLs!Q5KePynX^-NY2&a-WN8;^ck)Nq$^GbhEE(bfk~otI3@>XB(p8gbXGyv z^JnEMGTYt=lit|tUtWMie3@~c9v7NSd%P_6orf5m3%t$wcHI>GMxblU)6`oi^|;ul zW!JqnI$j30$M#Hj=KG!Hk+@6srk@iXw4!!pd!f|cV~OFU^gjL}WWf9qlA|&eA)I{- zKN24P$@^LKz7)Vtg_?!={1Y`Debw?ys!{ABQy;{C<<*B2Xr$?hfbhzh-DAuRx&Em->#}sD&Q(Y~7$4MIw}%0oqJO90eKuk8MDaDp^D#X`zOP=; zMddvN%)QsjDsI6`OCIjQBl(?|fX0E;3LOW~q zkrD?%DIAOto1=}Ux>y|t2y-_Lr17*V#lK!8^}toip%&Fx4(O)dsfTAjwcIqWpf`*z z3LgoHu&WZe7P|CBrrUU2ygmtbhKK#(a-?C4J+YGhhJGiEaa07WBCzZ-n5AbAiIw6e z@OWg0AGP^YMlLS}HD?@q#ds$-!!^S>FH+x%&?l<6Kv80o$5Rw!`Hha6E~a?cs@Q`S zqvQrf264>PFVC-}O1Qi!a2|Qv&U~6?Q@`RN8s?Y+HBh8zO&%oORGC+Hv%zKX4vA{W z8aaT_js7mB+9f1sNeS}jrR>F#Oy58kN;THD*sWz&YzaEKh3WBX%CPtx`I%N_l&oS4 z<1-+^8n)7MqfZd|T$~chZofc4k+TA5HEL|mE6HH{V+^mlx^sLm*>B=|(@DASA@!#9 zNjErd5Z61Yh4;6_O%yW9Gs}$QCo$V?;|SR^XV5RTb`5Ka`}ydWfib}1!*TF`@%Uik zb73^*Rf{#+_RH4uBlv9@J;y`Z*9B{##~ks`jo%*P0!1M%fX#WTI|!sCsg~OJQlW5y zqw~PePoE0in8M34RDr7JwT45FT`!@Xo3lR*j93j5peqkWzs3T2oLwgu{J(@pX$gOE zTST()(vIwXO=cHdfYVLF5f7;X^S}|5t}X{diBA3pG+H;m6Oz$|PM@j&?PP0^0zK^= zm32GM<0>x@)ze(K?$xwV9)5N0z>w%czu7iNlg!+fCy5J>D1K_?^Cd)Z>L~66qqaIB z=k2tKjk9|@+)_7JZV%zXMjoD3jU9|N-CA&TPxQZw?L@nxG_^z>#KQHCf(`=vLtn#o(CDWTG!h-A8?ss29?tyGvpX-+0_tejx+y44k zFAP5Fc{YVTFbuKmF$Kyo5ZU$b|%PE2OQu4HdRkRKMM$Fr4vTqw!Vu6w>_Tqb= z@q0eZt#QK#$f6A|XYYZ0z-FCl@LMdiW!|RQ*9T_%AX79QJJ{3dRDv`$YgMNF%&`+U zTPkHN1k6ja1zg$iH7axcWi{i_^(IXz7}W?LDb!RW>4ue$uC~dCG#Oi1cvG@I}wm+7cj3ifm{(090T=b@;ynL%dvq zPD~7BhhT+dez8WMEtNa~m2hx#IQ0SW_eRPM8Zz^bmquS~=zFP|SaR+*pUv`^>5D%u zLvNIEen3+`@R09~A)SrRMTcrXucwZAmM)Lz54go&rUuxq4A8GZo>PTa5P1&b^NgHs z|4UzlTQBIIS@==o`VAIzZ{x?@66l%HxcNqfg(7>@m7xzC7mUJK{L4-on}%Z|P9aI)oewqwD-FB~FH-|K+u@RBC{-DP#o#9S5a8 zIkf%B8EDpUVc*#-{`zfX|7E0~NVNV+k%mq9_`w3)MdSP=e>dPZ*n^yoqa8=Abs(MZ z+3XOWvf|xxYOxw&XEzqpFy8CnDfx&yB?^ya_ccDaBwQSA|89VUoF4*4nbITE;t;eM za9pm>YdsM)zXS>(dbd0Yd|1~43`cq%q6dsOI9EasPU*Qy#FUm8D2~Ez^*P;?Ksug^ z+&g6!ll!Uld$Nj}N4`a+*VjcmoK#HVgz`yY&J_BImm!^Z6263G7q%VqRF6{yMO;lZ6JrlAu0_|!Mg4ZV$Y!rhe}p3jbmLR;HE z2iILEOAr+2^Tw-U-qz#gVqwA#S8GjDbLYR;?`l}6C1l5?V9w?`skC18@&Wz&Ty(ye z5Bu)wjik{#)c0_7g?%*k!d%gSQ9k=O(Vg~5J+A`f{$;V#ejoZCsJR&`lICC=PS%x! z(rU@EOPKt=h|MO2-Orxu6Ln+Lh@Gv0vopu;@Fw$T)XAq}wGQ);SYKC;p*1_QZ*TDk z9_Y&a_0AfFq{yB@EJQBzaL%4S*czny3|9|6E56acTrQ)j%zl-p)H(&1I9IB-WcjhCreO-$ciVE3t3`7s8boHZl=Qz9^zh25*4^XXsh=^`mk5!e zdq$_=$ls-y&UsHFNqte3Y+PdCPg_@-hq`y7n=yDItDe!s93VQ`2$N#&@ z6uT_)V@}05Fx>r~Y(C5}c)U~3)qvueq};t8~G$qVJCSN2zVm;BUVDxhl!bzZp9V^Sr+n z_VQh3(*h*dey&ztnfxi60ptU+9zW&o|G%mq2B3@PVI3{58t}Y{fp0^Gt4Xpd;Haez$*T~lXh*j+y~D> zxEy1>FGTBat%{sY=CUs_G{03Y9L-bj3+v?x2{|Q36(*`pV`1NLelN(~jazKK$}6s~ zNM)6x6 zUckMnh`@#TkXr-mH)W1RhfR8#4g4(qT;yb;jN|zAnPg@+)FG~nTv`;M#T3m6kepQJ z6Gt;!QguGuY*K4c4vdnkvWRQ1WIu+ctf=kDjq*^z#%-xLL`MDai!s%Hys=jQa)Z+# zYYqi3_0zaLawoToqlvfX=hL57UKm0f3>DtDh(7uTndsQ?J2DqIW1)S86(0>e^60q# zLhYYmB{^o6HAKFj5%0aM~m zH*_sO{r9uhC-u8zbg=%uC?S{tJ+o?iGUZjo9m0+t_JKe;wB=!JLM%OWQL0UXsHW{l zRGLg$&4;~U)QZDnpQV6jxODlWU|-(;6g}Pc`VZZh=i+d9&l^VvIox5xYC7fIzPIggvy>E|Kx1E)!PG}$OA=P_#!=xYmR}BDY=)e1w36EbvVn14EK`cKe zkZ;*}aFDPg;@I+FUx))oX9#h{vPa{K{e3=9Lmqa$DCHN@G0BQmc(=Z5KSkdCjVb~w zRVq;BVMrt0ATeNsGGGFt?~Tv*_j%vx>ojlSAbdJ5$0|Oau>Y$u&|T zcGo)LSTtlMXwk%*c7i{)UmBIZy^*8eY5Us$Z%Afp@dZFqI79S;zRCSl_F&$qdAG(a z(p&GJ&S>aEt^KS_HO}YX4!Bu5Y)rSIgTi0!N2w_PMG>bglq5veds6yxynVk^rvN6*D;Y@U@A}#1D8M&7^Twe5&C5DBg8;ByVQW&!-7i zG2o(kx-O+=SyWei=-s$*f6HSJGGyeSnBq+z=ddU}*`&jl{+RXT@KXz-bST_gaYC^B zGGAo%P(YjjP+%J$ep~VJM}4pEC+x_XI6DvQOP?<*Uq9nI9k~K~yNJ5x!!=s@X*1)3 z`sJ-(a$ZKC|C&(QyZ?#F+L0w#_k+t_c@^rut^-799@?wusIrgU7Vibn#5qUUv0-lN zRnvBIo^2sNt%M7F({-U&7zC(F{VF&jL9QLOJi*OHSJ=?XNZl4a{JhdmM ziZrA!#@+OJ^i?6Hz2elIl?BIs0@-*?T^p z34lRr{d`uQk)G=JRHc6U_z!NC#*1ygn7Enx*@Bn@A1qG8<>gpCV6xVcBcKnmCJ>uEYH#!boi)byQR%gO#K?Pl3?zJ2+bFtNwFwuEoOTb`ajqDCE@3r}ko#x+XuXf3I! zUPyO}W2=0(3i2FJ*mEwvmwy$UB`&x8Ht4Mf6P@W-Q>IJY;tzNcMdj2bK4>z16`{V$Pwyr0m?Z!{=pnQK@0(dmJGEuwPi$kp za&f3>HA^33TO6mf?W@CgXD%xI-UpXfU=?=$>@#L>f6R^0!|?x3100yfji?F{+XpZA zJ}Ou62&qe$UJy#qNaNZGen8T0N_OfU|A|q)SyLt7k{*Mye|3^b4~+DK9Vb|P!iIwd zNq=Lc`}2#W^9Kku)qB^Qb77r@nIJi@57%EsQgvR|do3=iGfUDa&%CICh`C}Jm&WZl zO)iWw;M|VIK@@{9`|Nws*z!#ff!!2BnikxnLmqwCE4{rsUWORkga#k{$~Sfl(5>wzHZo~ePMg6rgyj$cb| zLr^x{SyySm1H`xWH+u^HUx}FN#b<|@x$K{?P3yN0RywmywSHLBvonS9YBZW(yqCvL zUCqFmDi)?zl?Vc%ty0plZK+Ztr@l0OG|!#>?e;qe4nLu&O~BYN}#Xpbw>IM%`tg17@|h0HlE)# zei!x6pvz!1xNA$-<(FD`%UHS2Q1Il7$OkNq4FR+QpTnK&wr8A23BvpeR)1snzyHhO zyVE=t>b2C20dkT0i2WbHPG#TCosZb!Pwdb~G!#0U?=RP=R-Q^3XMq!^zWCG&?>&I(H0FMB>n{VW`o;fLBE0B=1{z0mc&Q+APqBL>%J{=t>k+$-g zWM?;z0iuMQjvaV7O8n$KrmN_5cToKi!XOf0Yumh!lA?ATCG*afIe**~$e)Z)*9w~_ zL8j=Z!JqmQV3J6Znn%9s`nCOrVS2qPfuYDrjDrP3b&(fpgKM$_8Y5%WL#RkwX z-7!IE46JlC=V3dC-+AVj@eLzF&$c)%B%AHyB9;qkvQ-WrZUIG)psb?;?-?588-Q*? zv-`(ZwH8^290@_o0%MnnGAyn%^+2g8+F;gYkk7Er`6~wb`IuO7_*MhxI+0eZ1%-j4 zX9b-Q!53dwrkd(B;~FvTUTivr?H7$pY7IYA%T;1Q2$xc|F?P6UL~J0wLni}*wN=@f zsm?_QqEMCO`LSNZR>-df^eR^(7ThJB* zRN3`q3EmBS zp+B&CHxDuh=WL~|u6FR55g1fMm-NEgrn1>rrpiL&%4JXVk*)lq$7uXjL=tla3ps2{ zgWl2;EB^5Z)d+WHOomU7!xl>x+M9RNyH12OsFoqolwy?&=G_4FtqErVZgBZLS*KP2 z;`s|GQ8N0KnDx^h*1Zs|*bqDXX^c=T5xScqNFsUqg`GTSJ5o-9c8It7=d$xz_&hvF za36oRg9@6#@hTqX7EWq9<$4bu8%I9u4&z+nCL+4(wTHMPU99ajUg7^;6WP0ddgu$n zRKiTYuzezbng>Uv5b8d6K1Mu2u^54xK)2~^m>ObaXQs+-3DX?raKMmnbp5PHz zQ=3@b=6>EOW$J5sV2XA*vug=NW&RZ0)}!;NegKNh4D%nfR**yjKr$cp$(}w4AKBs)QLt6rGW&5+x2+pii)%vd94Rs3u zBch*936@gt#K9W3?rB&~`efMkh*pR^E{-V?xLW7oKuGO`?vSonrkV^=@U3$YSY})v zu6Gtx$OnhR7KYxAo%)Dl=Q!<+sD@`Vi0 zO#3YqQy~e@aF%Q-(s$WG-i-Bz)F(#Gp&QhKbt(X69W$S?6iYzQcjM_0tgPSbyLoCf zvzi(40G0}@$n-Hn#+uFhztcUBhJm>P7BDVq7wOlbOOb6fwO54S91H^|rz zGv_!7n^UvEh01X2DC9GUn$D2&< z)vgz=I-!M9RsChE{_yAla*d9>UD6ujRlwx%9iXoi{<7H^f%9VHBjW1eZ%zuKnkOFB ze7v=`I0(?AcPUK>#f}|ZD!_IX1N6&kBErLYIQv?@=Hm7D0=_zV8KaI%S+euNpZO8Q z)v^IUozu)()u%9J2VjIGdUVJpK6}5sZx{cv8Ne2I_qHps3kL|xrHj4&KkRztCzw0w zxX=QK=-pcoo1YSNo^jewOW*6lYPmT7za58YN%Qx@+QpQVlHR0zNOPkKUG5Q|o{JB;rDRXYW zhmx$_4s7Mh1K)fdezJ~re#)IWwpO`t<;{~fjPjml!~VU6>cIZZA6=Nbcz|d`xwduc z=CZAXZ*9q>8nr5Q6X!v$u9)af>wC9uaZ8XqZROe(J6O95-^OP4w}mK&n@n!f?d}8Z zlwr`K`oKZ~xk9YH_Ox1~am|Y(wc}iO!#;msKZDYTF5|}%$73v8u~Z+u2Om^rtLz1H zK5UfF%L;1j-8~&G>V?J#bavbUbCr;*1W&Xlt;(cMyS@Hx*XzzzL>g= z?meK#^tJ}PPJK_f8}cdwr|}|7H*+xR;z!Zhb=2ir`t@t|0F1yyZz&JI|G-m3-4prC zk>Qx-Lfb@Eyx$H-H{1CdSX6L@@jv3mH^XK})ZY8<{sa4(Gzu@}noVNG%XnoZb^g;O z^Ir0(q!w)~vi@7W=IjzCk8ljIj@4B5@1QCU11Ff+L`d`Mb>^})tr%@g{`u=0xDOq+C$_zD<8=x^8! zVI2JMzfxRK$B45gZ-M&j!UItisTa?0&J;B{_Y>7geu3|&8F|lVsZ8nL_yu;fg!@u< zH$rW;K-47NahE-il@!-iM6fZ}guF|sSv#Y%$YRujIPWpmC+@)A{}$P50j%Rkv^00j zb^E=wlBoT5pYNK zeMjQN!{W&o49_CXtTC6m8Q>|Xg%2s+ug^1I;DAzr0fsKwCMVlF0f)rOko z8_uh;6piWGU|es6@)b=L;A^g^F{S#hTh@ui#TUCxX17T!i-Q`{n~R-N0`)^%mK*q! z6Lpgvn(lz?z}LSknDs+j)S?h^pNBhii91^Rvx92(V?q|m%kydzDdC}lcsjGWo3Ci9CQ#xVx^+~9y)6EbH^tpB+`HdXbp#j2 zzP0mR#-g=`lsY-5RJEd841==2180hSUvlUyw;o#&ms0Jmp%(-w3SFAIw;4+Lx3 zA4gb!v@FyeKcf=bv=cV~Dy|UF0Kw^$T#X`cOdqjY%36Z%3I`4|w3L$HQiZ=bSjbZa-kTLfU-@MNA`%fmceC_}dfo>_;`?z9dfszze-CpL}6{Qgvp zfY$tLq36R$=YERc|$Ka0JEB3dg$zE6-Vs%=TUuj^t0w!rgUd5Vs3~rwCOJ?+3x%$oEv(nfpyr zyr8CjAue!)1$XhJT4PJ=-xrH9%-lEwwNt#3s*YsRKIr|b`*rOCyl$5VE-7UwKG`!7 z`y!HW3t?K!Zn7@+b&BTT-I2&@s@bJ>mrk$zicL)i!f$&kYtb2V#<8g`$UEj63vzN$ zzbsmqwUqn0Sb%IuuKzr75>|}f_$s%+WzCRp*YDk54yW-@fW9z>RsGm4^no$3oV*_j zyPx&w{f7Si7emKy!s%Xkb{?~=N4m6CuXjzELO{Gx%vVq|U*TNzJHidt!oy1%z*N=@ zzlm}wrN~$Us)+pFFMo$yh)G9GLt9v4$_bW>Ds0#CZsaVK|BPUdnYJvBZN?eRFBVE@ zw}84Mj@#87`&kUF0C0%&<*$0FJg^ttBP;sbz4 z?h31*7-F;d>am)gI9bR$}XC_qRo-%Tx-PukI3Cwr1~sfXzr&)036;} zODgw2Z9GYQVB!ia4nH(HpMZEB;`NyJe(3eF@oikP;%Vzli=ccw<}7e>;h zf~_^g-UWVH$OGQ3`t@;A*uD(Ct+iOQSevt+_ax{^AER?y3rGlzp4)Y`E|Tx@j^hE? z6jvr)N*^}si+-6fczRM^9HXpvNT0<9r?i|^we)E^gz&b4%?^``2y}W?T~n4Euc}9T zh~v`#SUi;m3730XueDrZ!LB z%+;q9CEwC^k_nW26f@YeoV4fLMbwmwq%23(>m2LBh)`nBp=iiW{(qYWQIP!YN#{G> z{WOR*0Ng-~MWNx_Vw6#Js=KG77A(xH+m>xcdm7Aan;~p|Zeq64qEefY= z&f5B2Xn$m6$+|Vj_`cdGR05z9w;mnxV#v#7sqD zeTO~5%D0-476eCH~UM#oITN2O0agI z;cSy)EJ8&(L0P1S+dwr>f8um{mhQ{eDLBT#YjO8%x8g9raKmhrc(~Ib+nJUWoa?ym)D{aD7(Y#!2NyTXyH1 zc!dqbG_&B?PME)puMdRWo-`B(U7XA1s6nLc+gk8%-=?}O{Tc%EB=EaCs2lN_e z#_gV(*bRcEyv22h-4rNsF;&^KgXd}5NM#2xls&yVNiM>M`3X(a2weDQoz*2r_Pz1V@s99qe4A|6aPIA3CqHtJAqAzCy6}8!-~=0TmO*%7~^U@4x8E8xb4)dG{WAr-~3b4 znQ}2Wf}Oo>%U_yZ&2Y@!jGPZ4NFfL6M4bVM=6Hv#>Uv4)mMizDk5z5-`PKs=_ zG~OH(D>_50-&4nA=&BJ0svN|!6L4uAZ;I;)e{R}wr0v4PE$d8!`#zeDSc&zA8eeGU z@P@Km;-tO4txh+nKb zL551PUd4m|%@dv8X+JtIE+l=sa+>bzzac4onVX}RufxOpX>kmj`%AGS`^K#VXMw;c z%|245x8hWHO(p%%7-Ki60;+v$K2W z9w0yxwMOoxLT-k*3ETlh5=OhWym<<9m%TsR!`|WStrpqYQpyT29>gzupi;GtF;Lp4 z^ZcDZ%pVr|-H6bKktq=R!AolCIl!LVrBpn?mzj!B>=gVv{%N-O-}#C2tJzm{qFo@+dt3X@p&c&%#bE`1>D937_$%z}#O|Q(J9Hsoyu<}?wbEKEXR9!c z^;CgtTa+v2US}`M$70^Ttrl9FS7gEzdrXO84NqykS)0VJ>h$3ht)AG}pbSsrQ6qZ> z0o%7rkh5*%oF30E*o(9)qP{j6yFy?K>kdMM`MIR>-t#N<%ST2C9zRTYY^1-NjWY#M zgta4K-8o)CkW%8S7N;A=F%n>yz{7j?8Z^sQV~dD>byQ1{y-=ip>@rHP`MzWl{yapK zU5)vBuf_Rw@7Z!ciYq!F$W~sw;rcwMkaJq?&Uf5(iZx1CwTZ$^U^xrW(4}0q7g{&^ zi=viJIlHLN!1`&0Z=m+ngpc2KQ)>k{3$-dz60B%iS0r2>scRWEdmpZXh5RQXD7#as z=uh%1O!nxy*${NuH{p~=iY$w>xAwSB<&wsshxft79WjXB9S*E0POKg8YK9z>yUFi8WKvb&J z)tK38bd(z;Z|Bt)s*~+P*I5@8YaajzCDtc#2elID(a~HkOZ%>RFtt|`;ygo~`saK-2 zF`J@b@~9cjhEG>vOZ?1bYl`Z_gw@9VCrNf}M+iySC5^Ca;Uw&j%X)^LGW6m)XvLGy z(gWhAKGrxFW0zmnOxp;}l_=l|ROi~9<>Hd?V0to?g%+sV6d=Duc~qjkM4ec9#Ynp6 zIdg7|$+h!H5EPVk^WLNPhB}{h)VMRn<&w6xG&`+-=;c%|r%X*`QdVjHuw!d}|5GVx z0gPK`ZqbAe+G(o9ml64$AXv4YEGTR#i(hII z?jCiZL96#CH5~*3fF+}Cb8CC$DAJ1nQ6Yv?`y)L~SUB#^f1QpR)0l|j=O#^@kKp9(t=zeoTRxm%5E{n1C2 z#*>`cgS=~boZoo=1o&8yie^8KuhD6j*xn`+Q%8AkY-iFbw_)I$$0J(ycM8}Ovov$4 zZrs*-J{C4&s+fK7_Uok`iWyioTPDTj;h;sjbPfGFsR8wI<89eOu!DG)@Xw?e zhb;9HSl|Z1_b2Dt2fE^ zITSTwQV;)W__&yX>g1jJzwm(i_2NTYj^TBg3tUF8$38e5jH;VCfGjtISK6fS9ewd< z*^F%viL(reLYaev7!E;coyaumEx~clrNrfcH8=2@Z-HbQWACQ#v-u9YQ2+j%iVdw> zQ5mkOcHm1%jZ&=*C6QGkVdzgCE^7c5v9P|?F6E#d>)BY|oNuZ6<3+pOliy|Wy^n~Y zNy!z!F;Nx`t^e|U1f19luV?>vbPLOa^JLHm0kms^%%9P)=s3yalG2X(GZ2Vh#xz6? zV8i$j_vI3oy=`y`v8npT7UtjA_pY<^%nR-Jw0H7&d-(57oWu}+lm zPDY#ut$$H7t{{a(lDH!XcYE_gf^mJ2n{_k^`*MDQ#hf1fP4A1|jXP^-(V1A7*x)Vv z>WOkVjYIKGyB<)Im?>M`Zi!!;zr0ujC_`O})ZEQ|XJ*)8RU-yd+Dv9R9gt2d*vO>M z(CE!^U9E&_zWt~H9H^o6?L{x`^CK2}gZ`X|Qm__lFk|l{RKD&mWPk4E2f8ds?7quh z`TB+hr;T_8!z&NYyyb-rOo0`cY-I$=?p`@ped6TG@4jSM5&6dH&dz2FL%hag7TFZy zUwi7k_nmF8^^ZT|{Y&77UFEv^5%KI9f>%VIA7sj1?N6hA;n#rh%eiY#^6sOOF85ms z%712XU)bHs=px3GqzpjvpX-Ns?Cl$HVj`|@iH#BJgy~AF$$$*mfR^cSFmJIy^ur<~ z2rDm4RTqYnRp&_B|M2VznPFwU9XZ*f6(FU^5HQM;WWd%21yI)s z)e)pbN9FLbZ6TD8KY=riVQ@a~Wty>SZwchZf!JEoVbJ>V*pBb!&wbR#(s#n(++DYI z9>SdDW4nLK(+`#dMnA8~l;NUI+kSYb#~be6{O)(D`0R5FNjkLW_JKa~E&1_a^d2)h zqo)G>WNv0O&-SN1G(*M3pkAXlWhk0VeFD<+-tt3}WfoyNpz*bUlg_gUm2jNXsB@5!*_7jhuBe=V#9~v`!LRLI$to9qWETL}$1wr6*NgA6i{Nqfi zg1%Cs{H`hAwy|HA&6KPnbXAY!wycy(8aq$SOw9v)0ooxkdV2J3)tZbP$Dhhupk0)> z^WzztPPItR_W(a7cxz6M+0U7A$+ztH6~svN@`77w7V}vz)?~h?pij#xSDENP;WRFCB}^p2WSJKUx;CIFZ7KJU*#d^mE)2(i|69ocMx` z@So64ZYa6DTD_5pl+mO7F4FH}(m5gC>u1VArZ{~^e5sgq`UW+^6Tc_2>Fl=f)vKSF z^1Huus2=B*Tpoam8<`|B&Q!{b+$xSFdiDy$IjfXDx6(zEvolioDK9+smc3p>qH#W^R!8MoWX< zp*5UKK@ls)LE|#cXKoMgj(-1K@3OTv^-9D|&@yvUG@IK^=9A;eCs_YRLWs+2BNnbV zuZ=j|EN7K!*To5m>%TugkM-vNt_;EV-SXF*t-2dykUfZwq-sXUWdIi2P z=Q|>T4VDtOTuT{mnvX@EwpE$`8t~&!Q`#`j85dmBIZ7Mk8J(IM^b)jvnzT8W=n66U zV#$#fKiz#eSYEoC8+#Go)%1}EFO@ZWB6XCc>tm(rF(Kbe+L6}r*czII?z9X#bjk~n z>O2BP zH8WV`6|^Ez?!rG)yp^oh;)HTCqwjB;3cj$&Ns)mMgB-$K(vf#!MM5-c5xroUiSBY- zR0E+pF${m;F7YUCMZ7dSez%y~!iclm;Vk^o{83-MX5?gw>x9S?r-?CvW;RmHVRp?C zMT2tlTgO$wn={emVTkJ;V}g)4T7RzDVMMwLY5P==JK=m)xp}Bt?<>Ob)=&afBfOEUdoi^@+=) z;(IE0@YbKuHtfLefJYW-PG7n{V86M$TqXOit9V7+%jRE;!cT$J&&%zAv@qaf{nx%7 z3OdivvHrr>3-%3npILpNGW)QAyq|BA?@aH47NsSEv`2y{ex47PVSJZVe#iCEP|xzO zszAB!v0t^xPtfiyo8A+3?T@X73tI?9RwccTY^}QXE(k)}B`Lj&@4|`{XXC3obo~{? z5ZyMRa`4}pnUYlq!}6tFQ$PW^@p7^xbD(@Cba&~Q97rc^kwANT2P=H~z|f(*mnVw00-n!&lgc3;^2Jiqp(Ea)PTzrZK+ zrLN4Ey!U9EK5102N7^Lud#5y9;deyji_G8n-WulA7A40T_N&<8Vo}5GEbM7{V05yZ z#$aspJwwUv*P5CGP_c+4l!6>JEi%QXbT}LWXVLTy8ez=+)^Rx`dfuE|Q%-f%{;afI z>NL??DUV|EGe~9AAE@CSlHxkc_Q0dK&Nk8YH}zl6V6#g16R$}hOOc1RDT`)=i}Xco zmcAyru+Af8OIO_<4)`nfcuN~>H|H)r?rwtaK04bi+TQbWFxaecSo{2(kVkU1kOBle zT0T40DyaZO%!%Xr?~Ty(n*RhQVg5^YR`?AfF@wr-roy>Voqc-fz)gy7)f7h+Sx|Tis<+T)|qg zPVCaN)KZo;rPy3YNQgw_MyCr~la%fQHa-YUY-lG~sua0LOXh2EIbfmNU>{!oP{}wC z$;-tYe%uJxj62pCY>ovRr?Ln7LS5B84G&nfqX$!Y@IOniu?@v~u??gX zBjo9t06FMTuVO&UmY+*U!%?D6!@qZJVeWkx)b-)%c7&y>KgtLbU2VCOc4H!;xxI7D zw&j+gm@z|Dxrfr1FnWt9v42u*#taQGD@s_WT*cE^09=shzx55evs=o82Z^hEW(HvT z=|N=ihA2dFe~=9|6eq-N#fP6eJuv&@Y$TEQ))dC!uzhC6wJ9U0_(qJ12Ss%Tq94LdiPgh6Gf*c$ z!GO5vRijcrfzdm1& zP=08_7{X!9gGSW%yh+aWx#{}H)nRL}LGG8+0B70@2?cvivD0K} z`avi@k#b!lkH*_ZNIRqSpYEkZaRx+LWVDQ7Bthpf;da`GU)2-WSIS-`@Jv+M25?Q&25#tuM#t}MRzTH2S9_f^l+ zr+uoR@~I7oCVx`y7x05y3HY}6H|}UQvOohd=(~YRbU6ZSu#&D7&02LByxsa2!PmyH z#m#l@SC`s=ui4MsM-ktukOMZ(_q{uM^5TRVf{wo&nD%1_Z$$h!=tCvhUFawK;)Hq* zg$j93v39CtTaF8pX$@X7Yr|b6CA{dG8+s~SV6+AtjI093PD-v>lj<9gN=06RGge#c zUYHMMRgn`5c-RE)SWwY zH7VaJwd*QLI)F-{xY#GzqKPuR5xrH{P*L=hbW56Ie#6R=a3|UcNH)U=Ut|tW%)8@ z5OZk!vu`G67f2E5HOT1SOCb6v1!|?5ypP)9o8?VK(`&O9_!GlK$vtx?BD-(CfCt>S&&- z(-zHn&Ux;&ypaFrwB#=ZiahyC>w;MlxFb(l!jsRRe#7QMZeXV_t`lFSDJ3SIs=`X! z)MLL%Mf>xB%N5bLY+A^x*-1f=SA=WaJy?^^Kx%$=q37ZjMCqh6aLJ-j#Zbx~eihq6 z>*4z|Z+fm1=B(+`tvJ^AIvHe}SSTByDhD)WD(IJr(Ic`;hi2Qg{=!;{+S|8N$S^_%&}z|Fy%ypWlG@ zVw{HYRXB6tH8yZT#9SHG`|2mx(Oo?QTDlXS6d0QjF^7qC$80}WrOOTgy4G$4)~Hh~ zj7|e#26>+C)jI+xBb5+qaq7(Q%q zMTqUuG_~~R1^z=_c%IUHCgL7B{3Op&-2;x-h23A9Lm-v+ljHkbhTaO{FXO_!k+evq ziMkh1HhHh+BfaW^A+YrB=~#4iK+RE5v=NWh>>L6Rc9c{jy}l;{#i>;V~nLl!if-*GLj9NVviF)U>3ELth8LD#HTsBWyjPM-XG zkxp~3$(&oaUD(DoG>w87WBD6_V*vlP@!jwCd{bfi;dP_mPf|u61j;9hW(5fsXNQYs zYs#EY=6AYnb$h+RLW$9zuIVADMkvse?rzR(sTqyBUU$K&ukc6C#R`14J+^#7tx1g# zF^^gEXXKNhdUN_TQj;;4#CEV*s&$m%gTZha+V35yrc34ijJm4-PQFLJ=CBh~hN5Ac z;z_RXqwSsGcnA@LZkT>xxHu=f9f2e#(npUqZ*{VL?YD&2T1eECob?&9EU%~LX`+!x zKOX$a2;Z8n?93dw7)n^2rG|elK1y`;@uAiDV$zAj;9bdS8?yYs_8NCi`}3fL3m z{$id`){S2>0LMoL>x25^-@6`}$7zLsvja|Ry8nV;wwXl40i4mZzvntfUM7P_^y|-* ze@@GW#?lCVq|;Ur1O7Lk+MiHT!x?Gs2!S_6m%j5qxyW@S#i4SA*s}^E?Y&AtmIRxL zEJzzwuG97t3>=VWb-3x8m=t>!^q|OH7sqTF4ZJOFfloF5RRh5jlNyN-dLRBrb)IF% z|BHyGj`^p!Q~#TsaT4t`1>-G=c)7IADr6~62OA9e989_@T;L5#1t=t z;v3QeQ-M&-_}kkHk%ZI62K4&FzrN!c_`m8e{Cip=} zG1+cv3uUsUa*Pt+M=H}eZ%LlKOA-neTAHE7)qzP7>NU2v28TyC| zaY?!Up#@|P5u4m=+Segm@=HV7^_YHMZV>s(FKbw9vr!Doh7b;=azU|ZQGv7>`ys*u z#qcx1Lp=$>eP4r9(=F9`OrN({eTK!oga(qY7fvZc6qToxK2(3`P4F$8{IPnhloV@2 zOY+6};BNYKoIKmTIT2vTQMLeoyt7koIO}WVGoTPMQWH;41I?NNk%0<`gROm8a$_tC8yk$6))d7kT;7z3O7uE%Vo?Q+deZ94wNPja; z0+O+E2=PIA7JI$feRO|7-R(&MGV~h9gn*en#(?X%FM&^XwELGhp@=AgnjjH|WQF)L z4R5vJX@*V`1^cb9PVnsgwDf}}@N5;6vmgaM#U-7|$?lN^33?;sZ=KrBWG*CJa zA~8a_rJpvWWp^ueJ+VQkd2SBTGm;CLY|fc=A<}+rHxD8{n#Wz0P)^IEB^5#t!_N`2 zUrQ;FnAlF}P;-pUA6Je{4*Umt&Th;g;FtA9(V--f%wU&^r!mE{@jsInKRD00-mcfV zZ_wQj#2f?YeludNOx#uoWtwU4+z3$6dE8K$6yz}s}WfDt^El4U>MeshL zTa&o4Kj_CrTk-FUTfx+BW(Nyj2mYYjza6coh~2@PlU6ep1*K9tWrz!H4tIRhrG08r zYahK@sZmx0uekr#<-lh_NO0L~4eOWCG&>gUIJ*nDV0G<-J~ux&ZIE9vC0A-}xm7dd z#PSNuV4mi^HD@J@Ray+qtZ#ZlQc;p^_uFI$xi}#k7bjF`GjTB)K>Zf8s6AK`o=f^OClPvXRXhyx|2+;FE_Iu*gVqK3Rlj+3CY3g8@xU_qHjtFN#SBI3ujt^`LbA^Ap|ue*b0QI z@D8>YydFUv)AagFyW&I!S%cyy?LOZ)ixcX2@4o(4)NN>k4wKzyN8lU8Y(iebT2RjG z-h*xiM=9R9snIYVtM?)qMAPfI&@-WImG$Ggg(QE+T>%2;snSXUp-peHIeR;(I)V@nQ;#F&zn=R}Eh24fE7Of`qZe zsLJ#>UFQ2E$91*%e;>>jtHL+MyEj*z|5z%FJdBYZ`rxQJae1;=#7g>J8V9npj={Bb zIEecxXFHt?p7|V&rMK)5NBa9almB-ZE9RWr-w^{-rou)TGERL zhUpAKN5ook14$zvPupnNj)JPgJRenf93AOSd{2sg+E4BC&V^rbn`3g+`u5Q+M58LT zEpY6!omM@)@&Q}9>@B4OtT&R6&bt^q49aZ(m3>O>&d5-JJq_gN#&dMuXs!9;oTy zGjEaTpXn1;!T(Ga-GkxzQ`pL zQqx3vlTzRsm7WRpia@t@wx))dLm;gK{KWK^TrJ$?Wb2_m)(ocD?Xc_%t|$3Qv?<`j zuHA*pK^?+0XAzwodl)wTYWcqqC?5Zs;27ZWXNE*#?uFZ%>R z85S2@g5)jo%oq7Zxu!DA_gHuf2DUua1l;9>S6X)1tF|X0S`-j z+$+JO@F(%{d;i>R8QL8N8BSiwAc zv;(^&QXFDCaHgDjbJWVLgv*hiFQNLgJQH8{SwYFx#rS55xRV;MGJ#e)>JPn*Q8%us zA0-Qn`cB0DDQ(wZ%0ClUXlkmvAx=R~8oD@&uzqU7b7NGY)yV0Z0DHnqX18$iF;bxYcbVfE!H@L)H`4vRktOL7_I=au+5=R`iVp_C!kszn zz+L;AD|d)^e4C~v@$E7u8;vr`Ce_3mMIHm|%6y467pWaRyt(a*h!=m&k9)##k5IQ^TkLBsx*>_BIQgqN~ahq)BYSjhMw-#&?R69-00r~%gp34+@S8nH*m z43QnZ981a9>5TJHya%butFfqA$?$fKnzP&b#a#aVO1sg>W8*v6SuN#5(~lEL-;lxjdSPP~DcguVXut z*^|gyxOt#lm#9+y;!0%4{FN3lsnnDf8DHQkQTTKDSY?EB^=3M;bU;ahq~fJIR_=U> zvbof~sYtvoUixqE2LDm4Sgy$_9@s+*K>LFBPtDr35GmE(Lf~}SivA#;dKCUJSbQHz znIer1Db#XO0|j9)c2|mLTM}olN#N-RvAmJsgx2w~F8?Bc&AvTK6wze*+REgJF-dFp*~jX1r`T$?Pv_lS)QB)=Ptix~b9 zP~e>VZu?vPF`PWnxtkV;TB@-a+hBq3+x}J(DZ^+@hrPv(2wbI@Y7J6hB^1v@W<1IO z=4h81nRK+b)ZbwBez@GY5~Wt2{-@}Rxcag4qqtGE=rGKZzd#Bed-6eq;A(2fpPyj&F{>M$JQFhr*mX4u9;4$Jy0P z$n-R6l1mfWeQ{BxhU|6xcw3wtRMuutkfibfetCn&&cR62(6dHmY!};A<5~9OV+on@ zJM_5fQj`{%_FymzV?+M(ptP&3g`J=KQ+PmJ9-%YCx!U9qVJ*VI1Nci)o`_J;62&c6 z&-Z7Lq1bSAT>xV!0flajl{W8JA>0(wFThE?`zR7N)ax15O`F8<0@{#09u1T#ojCC2j3BA^iuik;zo9E(pUFbntX*1EC^%Br2z56lH?qH>l z@Rz@gmx2=!D!+r}toXAK!hI4M$k*vwGJhCb|R1@AwTfp_LK2`Bwtbd)e+O@uI*OY*g`-kEUaBENOaS%$!Q{PEp z`zAFimL(+qys}r9kUI(I02A+xrUF8Z&V&1*=6Lz9W*~2TclB4xr+gOpkhmw5lIS}3`*MYY*em;nC(t`K+c9992=SUBXkp>ZBwg6>1FS%%~>oF?{IV}&< zcX`1<|CRCHb@{R<5pqkqz5` zzKpS4%~T+QO#YMC=?`73n9sSXGW-)bb^1-^fs)`rwqdTP!OMlJ^;eO7f9EU&5#D_g zFVTdR?A;poxeA)Xx$jRN)MgwsXpZ}J73+8fhBX{Y_MVVH0EqF}(`#n5nx_(9KckuF zpr2S2Ng+NJX5KcQniSzkLLXqhq+!1s`%~7JN-5VTo#IP(+w%tQ!$AGxD)Zi*&csfJ z?}XBlj@`pzCJG5M}2l!CMAQ6iHND@;=%_@wnq^4nVNl=8VAU{K9&%8z@^F)xQw<`c;O=HeUwHGS8N(_%aJm3IZ* z4)C2JOLT}?Ox`rm^-343x8|u+k2v>^z$c_W)Mk^q-`h^@Y~*2qU$RywcHliJFo~XjwJJTK%>Kk1ZkmEnJfmuE*Ca%3wt; zd*SatPb3d?Y734o2*fFF$h(Y(O<4{gW{w|zbq)7^)K`A2t!DkbS_Fy^vCvU3Zz_(F z@YtH$l5%bNs3)5%%AS78fqY1PWC<|p(9qZUX(x}AesmGKgBD?Zmv9ipnml-`qGVR# z>oxkGgK$b-o$Nx1_QAuOI{i%Fp_D=}?YBt~=iK;6{n@bT8gEwW9T?K~S+sN)k+(Rr zzvnr%R7a4?bPRCB&H!-UQ7g2_eBWqa$lv@!u(AQw7B&E3OwACY)h$*BY4*#?(%)tU2*k!i2^ z-CvKyKXMQYZckWW+Q4T>%EpxO(>ueE4RC;DfWXj{jpU=oM}?k+ABGFvYibu6G;<{* znhQTK8)E)kL?0srABf9zeB5K(l!M7zsh%$AaIU>SsZysD_RY;udF>pGAN7G)&K{s|CCFN{{-9)wx5t~9AonC zzpdjlhYhJ8U>`A`v-`IEsheMR@4HNTICmVb{rN6jVKtxkra_){pCY59lnG?B+vYNB z`5Vk03Bz~NTiKIKUAODZSH8$by=NB&LZgbH2Y>A?=D#w!ne?A-#1&b7if|b0Avyi| zdDE-8t->226Is^`iS4JFo*2BY=zbU%dCFd1w^YU=FUf!9nIu%G2$TL3tAT$N>o4oT zEc{JAFN_zsH%OLaZxv{lLZZalwcaw<;@H5%z`V%R;oK%j3mq*od2qSW@mcF~Q*!>( zEM=6)Z;#17I?hT2;{NlHGg%g`v(`NI>$|*yhFfUthhuJ@HX`+QUzF&1e696UVg{un znyIa2ngmd~xHB0wy1d>fN;J)jM}7ls)-GQ>D1_5y1aa28j}RDnnH-VQUudUZkwK|p z3(~^S+2|S$t3EYGTOdi}zus(bRUhm9n|>CZHTi?`&(wU!I)toLgYo&lWt>xG=r4J? zXGU)LL-vMw%d%#XK+qX&b z4CaZa%2Xn_7ddkl`X21l^dzvMPp%>MON;wc$2Ys}VUdJ&MEGu;E-lZcPkSzi;D~fS zn>Z@}kZO01v9CrEG?r~W`g9^=)ZcMO3r~zvDf(DH)-l z2{AhJdmKXE*EuqYrjy|yg`|B6EP7VISX<`&=!8ci3C>~R`){mkO{qdrkX$IDlE8gex z;#APQ7F0o`guuO0rL&Z<*NwRMJz0L(`1)zqG9#8eo1^@x#{=W~x3;SH!{$%}KTr$O z-!qm|W__KlLS=;Pzfahy>)2}j-yYYWt)B?}xmW5;UPbQfd{b?qT^oV$<)MSKWgl`z zDu3q}dM{R4QlknzWLNW2#XyN)?7Z~Ts*Dd>-1Y84q9$cw7w-pGUlY!ob)snMo@&gN zjxK`-nXX9wwO0@zyNq?LS1${SU6QZX2klCejx429~HVbP`CKEdN_l=lGXEKP)W|eMA94Z|X?|mbV z*?h{jk?`YfnXN;PK_SK>@g_9;gF#uCz=QFUoV(KfI$i#8Wk#D-erSC9N&xjfJ&94# z!;!(+z!FV#Z4?`Y_LD~^E0TtI^U!8<8r?tt_tW0@nwCl1Q|%NV;pyMw@s@YNpWnXX zO98ok@Ld}ThBCPFf-;3v2)Q=St8N;*p=Hax?V0N?{7m7M ze5I_W)(`7)$k8E3LNN$=|5+8R7{cVqNnpNnF%WRdtSE^5z6j%LQ&(y$BH1z1fq(xb}~}o z@44sK6n=PWtG+hK1eV7d$oU$Pe%H{QLp!LVxW+r;aYABSjA*T`_H=I*3<@$+AAyi>U3IKB^;4Ufik z9)*yu8+dCEc2DQ~BMQdWWj?uWE1<~)Y9@TP7T)k3)2-U%)!Wf3$-F)#+RDz1A0<~e zm);xI?KW@fbS}M-RS0nSOZm!qmnbX$naW}O{>w;+O`?awtZa?${kc@zy*Wo%GWIdQ?dS#@Hq1=(a5(5 zWv~y1Y+3s1d&6Bikf@9JvJux3NHcJ;y0W*2OV$75y?A7fTOBwasRC}G%Uc|%PAB?# zZ}$jXw#fOcm9?@!5i#!(zsG%OL!b9qgB_mo`_{z+6PX=xYN={~E?3f4q+Unp!m(Y2 zEPWV25kn{;mZwfxOiT3HJ%FL_j@@mtbff)1!d2P7Ovj%UfoJ&xlY$-l>0vxGVlWz| z9KKKKTBT0FL~{F}nCLqzMcmB^l2yQdw_ zLJbQ}sHs}Tit?C$cRx1mPJpfVS>y>!aH{vW1xrd$#A5i+;_2ae+V$Cqz)`jSYa2C8 z`o=3vRP{C7PsDl|yd?Vg?#%bb5Ty}CPemoM|9J(DXxo_qJAy~X+cvrh@7dTVU2p@` z5(0|D8GU1y@X3A)HLN-pi8wqKk{v5+MxMogYh<_jrDNE;-LkeKfM6k!NgD1{&hvU4 zW!o_x0Z15c8-yL-0 zEn-iB=S7k{{rkvN@}YVgKb8r*zLK2w*WW4xA8Sv}PL>K|7POvnigP*oErNQ`u_Jc! z+ObvgB>>#?u>PDKEqy%(N1oN2fBR2%q43SRxlij4O#GKsK%{GX_`tcMgYs^MH->_kjL+nt7CuM zb|1HZ%=7BtyKXgs`Xr7gMaY)^H zot^QD^f1S&WX?VCYiAhaM4(|%=q(2$> zXc)+7>X48Bkkh&DJa&E1N4hG#^}ii{;h*Mz5fL>3uN4rbk3?mDk$5p>`iG*5aKJYT z{BV~3d!R;+688R)FtBGI^IiS^QbXp zWWuP4+HDzyLg%FtXhvlQyo2)21EccU(~g4Sm!V0X;6}|jkNz!lU}3+UaGHCn!Qxlr$`mV%{C&7qfh1`^3-_A z1X04y@yhs3uB9izbs>CDx^&{~$0hK(Bxy=Ip?vD?a6XqIJ8ZypIolofF z&hmbskat4ph6&278MyuH9y!h~bX72ylSU(ZxN-Q3d=O~U&6JV}NcOPM#gM66+;s(# zeG66m1&nD9%=pxnT#)=qq2BW>fjhvlxFMoy;1cyIYVM-%%Ee` zQIJO6yAIP#rTzn2c<^TT0&ngj338!SE z1!Q;Cm{0Lf45X-T4)z?U%(xPxAJoL@JSDwfd}>GJ{l59SXGcpKfZG_Y7Km4`U^5pH z%+DQio1f*1_SzhVzWqPxs;iL6-QloX4R^}b!4@xz438oFX6I{@TAwAISv%Ora@6LR zK<$Tea=GCTs*74_6UA(+J?Yp5iJ8aU_Prfp!UhhO4`I(@cu(kCKcO9jV`)$2$uA1X z)Xp#h-=&rWSzoO<8)9a^WEugTCaBwINnOn-@W5Q#m~swvR-n+btkIJ*7w(;`+~WDIhWIV$^FI6-y# zm_ERhEKrEj-`s`6llyyO9WA!c3q8!bLQH*A_&|&?Q@ccDZx7G;H%^nT5gmO$c_ClP z@`UZUME@g^ZhZV#6U2ru8+cio)`MrzjvR5bZ;^=ib^{d8@JRTveFz;Z??^972Etot zA1nF#Q7%ERC_Zs=RP&F=_7C94w)lHfTyDd{Bdic)Pv=ZUsG3ZWar2dBaa$8=6tZ|W z45yXD{0VMNVc+|9S>J5#K5Q!M+IB4WCivcmvK+lsHPN1{faNb!u?JyuAPoH;rLZ`l zIva?`NKIO&`OF3q&N9!fjys5y7|OQ}^eFJsBhzm5k6gJV1>eX8&*#340~u zuE5Bg9}jf%r65V-v^uuIMp)`^L8#S5t)hgi_}%mYyvpaor=4%04ygO9kOF4B-o4^` z#jgek!}zMc=dwLn*w5bKOHZE7-G8An{J~_RcPgH;r3x+DQjBOE8W@vgtd1*?diI)< z#-DnOD;lcOuKkt&4&~$j(5fMYB8N3_*sp|yEk>-^&ycmGR@VOTxDTNrN2aL8#q~>% z1q$s+0IYi}K*WVP`@Ht%Si}UG@0LzwfN+orlzBz}zvS;}1_{t@{^oeg0 z7cA_)?(hIR@(}A=ZYat^5a)K|35lyFD6=wqv__skuxvexAp0m;F%{& z(%-6ImB_m*dN8vB%*k~ELkgVIyMZ;4M%eCmZg?V%pm5N%?;;eZ-neX@qbao0N|8GH z0G*T%jX}Ez5tRoO_DlhAvzt@Et%s{3C~!9|cr>-*lF&du-;uRVxiJQDQ_jf zCsd_$j$e8+5qld!IhhB_ZI&Zs5}=NoZQMdDmIL4}PbxI*1tAy>rR4MH*UC$_wbP#W znIr|4E)Qr}Y~fp94QdEUf_L9r5+y`547O4sY`^}7Dxj$olu%|xu4=2!tzC=VUM#q% z3S|YFxsDl^$844#PtZ{PN2utVUHV@;Q*gEE9Y+-_P=@t9RqlD9((IWeZpXwwe{OL> z_u=g5hd&fPlGtzeQg=I15O5VT72LiZgD+W`Gyx<&01+rWk^1%=QOmN@1N<+LF@iRL z?pnRqhWCBDagjQ3-yVXtkPAiO?$8<_Xr z0aos7;-!Gd`Tdl=YJ%D%z`2+D;~zDv7_1I(vx=zHfmOu!_Hkpk4=g9NU!+JmdSSaJc~hr`W^lQL!id*X_Sz}> z_j~IzAjv!Nd?``cg$>MGLm^28A(d?QYubs*^!X>Te1m>m$-xcD2;04`k8#5OpJ3Bf zW=n#}?X4nn#AIHjpB`BQ@=Ih__1^N|`J5XXlB6~I(Lys8aR@(&cCrtVyJNFbE${pY zl;VmOs28AXAGQ(f8w$2brGGr9tu@cu)>0q#G zCKAge0_b3MCiCl6neq=NIm`iW4Sy8&T9fv*5Nuj zecucX1*qUkKGkl)#iuJgPCm=N;jegw^fkh~@T+^8^Gr*uOoHHciQ=Gwfd()MGMwM6 zGJtS2VZY(jT~VU%V%($eh^$}Tt7-s!yS2y_E%xuopfdl1fB>ZRX5AnG?8-19M!~o^ zfdOD5-tCAz5A1rB?2GIv&eXj9JX``@k~V^2`v&fX4n-G)`QaO79?47KA3iL`b%vRa zC&5k|cSiwG^WT(KyQ5UwFhNo*Kz-Co&c5tgb8V73#xyB|BX0Os-3AO4o8ScGmmAo; zv5=rGxFSPocz`=gIp{`S zo!lzfk>MCH)r8X>Jdj(1wbYd~>U?qG!(mV7uUt)Wv)AY!#foD>|2Z)K)jg)c{{ZD{ zvyQD0$7XO?66Zm+A5@NT(x7&*DJ9VW~P4cw=U(DgKfN@Mo@wj~1tID(s} zjq+I$;oS1b0`WD&B-+4ZvN`&BV$YNzRgOV;*Etj0nH~8N&#?;}d60qwB8Fp9m}nKqEny=T*2ykeYo+9d5)lb`zapKPik zEb{m*b?&<(>yG~6bQ=X2L|#eMR*?&kJ^ck#A~3z<;LNwC=kz&hu-)IQ+q6Ye|HK;E-Vr~h{X=kND+E3u$?rJ}K{^bM%zv8YnX#;7Rmv|P6 zlh{Dk8o}7nWwL$JT$Gj?g=+@I6zri`m%0}ut!Po%Ru3R2Z7Sm8%W+AgbR5m` zHM?N-_v-iay7780-=Tpnj1YM#WkH%(5^fXy(brmlXjup4_dPNNXGvz9jI;<9CkbfiKU+<$@$CH zPJ!>+$mmSIf2^H=x#H9)rbtY0A7J)IFrTC|SnEX?+UGms%31ES6J}wSUABq-b)RMp zmc0ziBD#0tAidlYJ=TsnI{5-M4q63V)u!SRib0U(?D%M01VNSbRlnlj>g|2;ApN6u zOqJ9}|727@-1=MhZc6TgN47KRBx{164vV~m5DmeaV%GK*YP2OAa2sY;oP*xeLSt+9 znK$uuJo(0umuw}7jcFaU1sub1FoSA7EK>brq;j0gO@nG{Z74N3Fr+fBLpz;M#|ZjO zKBDktG+Q=i`F*tXok`7+nY~@~?}s6bA2r|Th^hFOhhcgS9PHj;;aPvqDd#v(H#kw- z$hwvbVI9Vhf4ipYIBIvUry*hD8~(tPyC1;LmI)`9vM*>D26;PHOy5;aby@C{+Z{4o z{W4=(s=VGM>lC^8l`-(U1BY=kSWPrwgv@>%;2X>|cl!|gJmQMsk_s3#bD z01kEhJ-US@3d$lUZwaXp`Wqk#qCgC~Co5@$Ln+gemM?nif zGLa0~#{b$!d2c^tC;h77)Kk3WyW=wXbfWuf<%ec?EK1=788SUl zbUm*w<5Oll6V8=OEBt2O4eQYRP-c|5qIIk&O>yOx`*5_+Lc@dG9kBrJk9#R*#W5I-s5p8V0aBh6Z8QK+ zLgE|)?{Y_OHDdD|6QcR1z67<~F%A)YX5A{bg!&i110YZb{MT>pGOQJ0SGGq)c19kH z37j<)YsKe`uM&|2H zM!A5=KqBoiIZ8^Z{*+PC6B%LA>g+Tr$L2QMt`}cGOxe%KcbVK;B1JtkjLmbaqtwsS z@yHZi1udrslt^ds!MA);a1XL;b4ZL=MHhkQNCKgHDOYj=^_~G&2w#S5lvc#SB zSYk{M_jG-*mkhftztO&#Fmx`sFiFxzn?|G3mcMw~Jdg-)Z)TKUmT58`H=Y zQZe7%=*bg4id~zYcio+-98^MB)wynWyFS~_+g+}7>67U29Tgld+1VZ5-Sn>%#4P}c z30eLtw4L7N-Q7jtdu91=MeHtMJL}?dVZoAaLVuQXHt2I2 z{!1EpyMVxOCv=dETRDf$C9Krw-_FCjLNlPFKt8JUY-W;TtPB5qNv(%K3+|nIb-+zyOhQ z0{s;`oTH?m)%`-SZxdhSx3vCF+opwzYOGI1XDcD2KSKa0EHS^(Bpa>mkH{2Ik|2D% zQ}Yx>5}OVgO>W(gYFdab%K;&ql!e^l%v=FUkC;Y0`j4-7x%gmdVj^)gyZU}H%3|!j zW&dl+u{eSxzAtR;fuGg z-8#J0nq|I`X8v?1ac2|QF6Ox1RsUUmk>LXWQJCN8q=)~ihpLCpYzuRBi%(+QZ!fWj zMvr_`?QzHIWccf@!r_BUsPf@W;19nKx8DAADkHXHi*eJu`2zE2Zg-$;72mh?9-ne>bdQqx$Bf>*Bnw1+6l%Vw$NO;)l3w8*JIWs{4?>-S^tHzG`=5x z&hy@5h0C!SHMZPBM@%fh^$P)(U{B7SK-INCM@~7ewd>5Itglt_VGwVf1lLz18!ThV zKT}s?-CQ6DzmVU-J4){pxKJD8aHD#6ninyA|2UzPVaj4OZ?5{%RtMyjig?yNEX}5@ zn)4|Fn{QsL$V=*rfFNh(o5K~(lXb)AQf^S zn{?~)`3;ze-2HarI5_8n9vFZ0309ykvVMQUNoj>T^wspJyW5kE8}dbr^{}Kyck5P2 ztlpLG@_auYi8Ev4CF@zU_#w#;SLk0E>jCRTJ=G@u?e8Cennb=%LjD9&y9RPFXsup2 z5$JsZkYJ|QHn(`@gCk>?`Z$+9fHWJ<=EGR&W_gfDN7*+MeBm0tfG)1UcHdr27e4AY ze%nvQ8~qkmO@Qu!*3T4i8wr)sv{&xJ!Odb{PjA)gZq*h-gL?Q7UKLS)ld9Hsal@-P zBh_UC)#cJ2@OH62g@byoe%^JbwQ?O#+9z6_I3O%W*=29Yu!KuzNfxHvRe1D4QIMyQ zQiHHn>%U^F z>VYpsip+b=a@L0yIL>meP}>VzWQPAJ376*TpIEt&7lC;pJW>>%($h+ETeI6zZo&y} z-%F4Ut5v^!eB>3HVt0TR*4`_b2e}4L47=c#EzUf??YG19-zghbOPl)(QO}zXYBomA z$_GIkGD5lv59yr+jX1@z&aF)vReBd(4riMN_v*=mJgl`$iKijxYsV{1UD{|4TL}rIgC(+!~vDw~%+CcHB6@ zfYhb)j17s{KM_A%N6}@jVfv6uRNyqWq=b zI%ak>;Zz`rjbW!)2+D3uCD}b#jaDo(8W;8fazDcOLfPQDnx7JWOZpmz@rI-bv14Ip z&?H#8lK}4+`NY5X@ zMVxNQyGqQTltrqm4y*aE1^ch{-M%%}&~$H~yn;yy)gPht)fPV-R1a2)c+HS@ z|>k?n|e21Ao~@-j94Nd{aFjUw3yCxcrQmuSg-=xLgto%T6$g*he}Vu3~l& zoFprUe0>&=a7oI^2j6|Ug}eJ;;0#nvqC{8CpX|_Ic7|};w_)DWHDppP;$tbzYt$cd ziwRy65rCYjGB%<@5+r=rM6fI1WE62?p~_2}+v?6{g{Z2ZO-m0qu~De5S452MoB zr>u3}wpjjT%D?R`maoSX%38T^!6Sa2M1Q=`iG;0<3gb}?SB@OpnWsX*Tit-Su5 zlPQ1J?F+}|l#2WA?A=0%RbT$nJg*gk4=)YPDkbUHd3sSGjSAoPfGY#oB9YNJUrSy{|m;zi?Rl;tR`zO|} z>btWqynCN(>uD>xn8h}j;i-(Sh*n$0e6l(atS8+4HNW-H$7uE}{rX_bL3@o8DfhtX zC`OQl&tAw>F zM@RD30~SU01n>aBUNW86A^Z?^?uhu-P{~Jf^jwIq;bQ4k^5LPV8t_|FAY=@sk~+1Y z0LuC?@teQ$ReV;aCm$!1nCH9o zm}x#fAhQVSROP0}?(CO=V}t`|z720KxXgUYF0Bdv3K}a#(tq5*T3OVRpFw38yLYQI z5}gS|_Mda-o*xP<<-NqSUp|6m>nu1_jJ-+^1}w}yETLmd;680vgvgv#O4#Tmm7PY| zj#ev1#VNG93l{z|=Q-)6Qm-X4E{$cbMhDh8JF3{b-flrBSmoRgfSm;A}AlA=v`i-_Tc4Sl}$a!$s9$txf+_bY< zJM5Ths~8MrJ9N^rLLMpHMMybYY7_O%&MG(;5i(2$>hv&&l|ltnVnQwdW?ebxICPv} z&5A4Xh&ny?!}N(1A8@6}ai4hLZ84R+)6h+|E>+2A!U%6vz>tx5esC51Tw(l_|Jk;h zq0)#A_(@WUn~r30-YJ_<;tki?C>a{`sBDRTc35>t zS~-SSs5@L_=n4A`c7Y;~u-{qb)j=2d*rw}&w;D9gQl$HSd0&r4Pah6O=<+iq6YVR4xzqA$HBKO%Vx40&*F?|ZpNLwLFS+uk^Z z`v3-Dgm$mZnC{BGK?EVSK$qDXO^QIKgQkE+>T@2(hmt$>m(c$S&`pioyNdh{GQ&C= zKUZaV-^o4g>{X7|GTE%slwFCF&0sYXqzx0Jb}VM?q48CRu3)D;QwB>1eS~J={|slr zRv(|gcr(N7CP^Qgyqe=6#+YR_{FWYLKa<-`3>?nuayJKiy{_R_o7IYYVb1yr^bn6Y$v<< z$!uueCB0(i=uK5Fo28-bI%zCAhkWX!(A`NJE%~#6jdd~3z2g(A#hQH7WWq)X%|mzp z-jP#qtp}{3od_CKh#enbsIN`NEAcwEI49X45O8Qsm%jPLKHJ}5;C0g-l_%#4$q zUnh)3yt6bFsN9ndPSrlmdAl2VuEL@M2Ss@bQ5humaSP*}G+^$ULR)y8djqkjm0T89 zSIu#{M%GfCWTot?rQb(h|DMpIDJ*om7~7KU<9dB0U!cF)`Xw@^=Pfpa8qhQ247nR~ zM@WUc%3iv$Ow?!D)$O6h^zPmm?a05OlIqSsx~{jv^OyMxyKvq@rdiE%ZC%1b82e}> zsV!iCs`qG#FGJkiD<{YoqCy~gS>~oohr{-d$^}ckIKdM@M3dn+B_HRWMmkMnH>Nx(CHY4+YK09BK>7SD-bjbWgly z*T|TE4Ym6^-sqsUuC$pX?Z|er9E^`HPf8^rx7H2>x!xDDthQ{JQc(^Q4gcp&cp%c$cmYX`VeWR!_axWOOJzsK$MqXY?-#W^s=tu zrf5Ir2>QnxAI&pBWo{Q$v8a$>;Fxh8&F#eau&x%YbRg-EKQ`wNn z&;Zg_R%xK^HqbLg^%E7`Y{i6OjOu2A>W}Ce&rPW6A~fDxvTYXbD>1ZKbzEzy-E2c9 zdHB<)L$g<44Yw`N3toem_@_rgWB|zL0o6TR`M`g3kX(X-LjH#za%tz0_*^=EzbxP7!+r+mbeLu^eu>0z>^s0o3Zi%E} z**CqRt^gL(qo>|-9v#sx%nh0-DLJF+gu#Qa&nsA7Q*x7%+H+kQ(L`fQp5U zA{PtuaL#nIfPz=t-+YTH?qgo=JHB(PeshIUch?_$!HzCV`K3e|hM%p+olOVz_=qjH zHpd6+7@Ey75x)kz^)UB3N6;^SfJ-F@EZXWbwyx@HIKvN0IOzt{N(oYB@kQb6f#MpC z(Mmm$TgOCFeBCy-en)Ko);3R(6_&~waJCrqVqKJJs%`jG4uVg$D5)zHpUy7e)waO5 zNKb7%4CgbTpVJ4CJWm>WUYRJ!3Fq2@G~*RG61Z35rC4d#Ne?>{>OHXO=%a%ZTO9!;LK)yp z_$(zBoX8({$E2xUwO_wj=eT2?d@ywe)0Qd9fN(kwxi<@pfuqqo;6T1Rf1g@6Nikgj zahw}fT0wKL2ms>n``Ax^%0XWPxciCmd)yzt@jr=1pPTK;*?!l4H33nSV~2YMT%WFj zzKD&|*a=0p->?QGdvtg&=MnK}T2zuGfX_Jt5ph{IyQv2l#POJ$p^Qlc%) zpt$Tfq@b!6<`Zk)ZD466Pt{E6>~_1gOz6abJ`8bUY+6ka`Iq{X=6wAUy^|r&_U6~k zJ&hV)_Runb`A^h9(&=GXl-4AfHl*U#3Z&zOWak4xzwS9>-_CRm2^;JV?J&v@Da$L) z6rk>pJ5Cm1dG~m%2X)bvY-y?>)H8dsZM|2%(me5lcp79hgmgQ2^3vU$L&#r;TEMbL z=5Bk#C%3bOi}Tr*>MNJ+Q~cDQbuae*V#W6hkRtF;L{EwJ6ir`5Xe0=@isf-S&QGU# zn!1|+SEF7q%_N)}sjRjG4?hKwaO<&4d5hTM&%YfF8olr;R8hw4@u?PElJo_kQzxf( ze$F;T?Y&91i~GnM31t`D;co9Xiv>8UP*!u{_B?2J{;`+mV(x=EDq%u)9JC27)F01> zisgo@YqT5!_=+sAt&G{zti*4Cdb*4W#_%}9>H0m<%Ca8fgIkpXKpbJ8jR;m-XF^2^ z0J2?bBH^mPJ`H>+>ckAWU4s@FZv3pso_NIEll{RsRNt}LZr>bMH?0vssNXE;*!Dzr ztS4Ro7IVmBjuSD`695~uPEC%K(HNJd#|Ki0Ih|-!Cx>kgl=R-v^O*V0VoVRWWHKlez!~<)$>&Pt!Jhjwm&TXQ8*oVR>KD%B#ORz#DVgOQ4=z>i z;-==*r4FG9R-F~kh1?-S9+*Dl!N3JEjp|w%L#2*2CCR_FyX$&7>Ie8h>fKv!D(BC- zP_oT;p!$g%2BNaZXTOhqCdPP((&3& zC5*SBa*s3Dxx`=K{=A(L^k# zLd^df@XDJjoWX1MbvWOL`B``ZO+BYgT0Hj*YkPKXXO<>!^PUb*rH8mHxR6p&vo8zv zVW5?fZk2{p_Dyh6md&<4^|SKCq0f%Rg_Pg%ldxZ*taGd1H)F~l2+sMC=SC@lIIZ$O z>$qe5cNr>$vt4{z8n({qq-p-4z3mR%hqtTe-ui-mqlU8kws$NJ%sNxAZ?}ju*sN>k zXWBmr1t8rr5e7m61FgE(6E+X1u|Ye3K(i}P?$-UmTWa}4Y82_J6;Wey?BX$}gx)w^ z+2R#l9=z{58+cvw7=_gPs445U^3lq*ca@&uzY~CVuAa0uekWtpsABPBO#}*Z0p-a_ z(NrP%{=cTqJRZvT`~Q`q#S$vppiCtx+09r+qS0arC0nAg%QiD)O(Ildn8-SaVNfFb zk~L+lGxo_&gE7dGegEC#{ds&JKYz?0{+P$y*L_{*KKD82^?Z42?lmgacWqcZcDRIxmkH`y1S<7eJN^XX6W36jW&|ot&S>dU@wk7G4y}xhR@`^muip2j_NUql zy_U0s?2XTAI;`VIw{TTQG>as1*5s z^;@vggqgM;`)Q3@tmZ(JOna;WZ^lAlq(s|vuz@A?{T6XNh^8C>OwBby92=UjLrywv z!N`?nu^;?WQO)>PqC$~ngv3u!77}w%9e4plyS4O_9{S`Yc~nZ74ngy&o~D0UM99MX z%Yq2?iM?M2KY#1WAT*qwa#cv>v7KM=cHjDx1dKopo~yC+8E(%mxz5kKz@ds&j%99z z5Q=n-^VV-v_Qqz5eJ{Fe(Z4l(dR-3oh4^v;Yr{R}mp%Hn+A%BUpS>Q7Fs~$u)uqa7 z?nTb@w+*1{wfAK^MBbsTo?5%Nnn?&zbbFZWNbtvEC6bWcQMx^67yKY0#$+*$F}jw8 z2Tec$YhvFh*L>v@V7OsYF0t5k&mu-i2wy(ej_MW}0ph}2)pz{%sKK~xHp1yuQ|TDq z=GUlt2LS?F`d=yyUH3Lbjs{cPz>BgSBFF8or0#XML*A-d;~^R0A@#Ud(KBD3?#@(e z{c^t!(R3Hv-J$I7w5ytAU2$%|s3k0OP7KYDf-}b2J|%Ca1vtAxZ^&}}T^!HjXlx30 z{%P>+qW*mFSLbRD^*x&U%fIXhU5}3E?OfCvC3WTX>HEcp1AX$X_9y|Av4M`9;DwsJ zRhbXgll(8r-u=?=f)-N`_zSGmS}QAJnK$9Xt|6xy|GLq7j3ysS+LNZ*41+-2r?Ok8P?@t!Arbscms?;x^BO|GHA_A#fn8x;(?j?@7LpIiy?c$PI4=i9Ztd%x-@hF_F2egixU@_lt- zZB^Ni<2m2g(H&5I?PhAlGSlJ&ui4j7G&S63kGoyZXjnfDdklavP#DV7n&o`FlKr*UydIJW3xr`lw~_kk?T$r8|Kk9*^j6IoT|edde%@%C}RNQv?UO zH5U$=y($mpRklJB)iK=KJPdO9xyA2LGS>i9oYk>Wn)GvrTVa`3eTnyR?PgM~k6PTy zzIouR+mrpw8gdnEWZ9iOW-~qn!K&KlHCKerJ>C5Hw89eMslz6MYF9>CHs&_WG{MHq z^uAv55->U*iwqIn2of##y5(!M4rM-t-pc2=RJ{FH-{jJBvZL|Tgav>fHD=#f7jO*L z!ynBM(ai4zz%zWZ3IWr>MaQxzPlVr?(~srh9$HC~cwCw~Md`Q6UubrgWmD&}*yw&| zOZ@mHaUOZO}~`tR$#U(98dsm2FMWeM{}U z;FxO?bisON>b*DdyWB0U2A>%+tm?9?s2nxY0&d7ypbA6yHZvYa;Zg{pg55JYpKYM3HuRfYC&cdht=s{QTn0m?AxX< zSc4^MCq;iaRL0HES#;e+rb3kVr$u)OUlz7&7Pc)~10dZspICSONG+?!_5+@@46cUqEJ3S>EE<L7i=7TpN1G^13&P)>})qfF0q^vvWf;}uFTmD%6IPn@h^+-h+ znVat}g5f^!T!rDoV{_ub-1)?1sPz$5?YMvC~z34VU~9+ zHb4`=`5h!U-rjZn6g{0b8DpCZJpA31`IX=5^rN(%*RLCP176?(yz|&vefQAK?|<-{ z8gOmF+Ewyf^j+{cJQ^#wZ zid8S>w_b3MTTW5QhuoBH@BcF4Id?d(#Nr%%q#|D#Y^5{?d9K zp?c2Lc&BU5dl|0uE0dUxjyg((EJw1-$VVq#VZ0n%(S-r$tZph0QT9YT{SI@!J8XHw zh2P3VeC1PMrjY&N%H*du&{WPd!eNrb%1{&i#&Nt~jYJ$UX!=fmOCqc2=x|@LN4~q% zEV$iMrVBodl>mCshpF#DvVES0WvD`B(b>kAle@#B7gg8wY=jdtQUR4q%Go(jv7(`( z?s3%B%p}h2+!LNLg4IAo9Xe|ilhRP31Rj1gpI4Zv3g6I6PB`{z;k}RABi%XAYe42TqKax=AL$USt;*XNV^sozP8tq$yaB=-dc z{^lPj@|SVT3Y~@exch{=xn~inA6=zyKOx?s`OLr{&zwt_m3t;o1mM2u)WLAM4* zmq41g0?BdC9~ci_`J_kcaZ}HGcD`saJ;es?{w1SdlwAl+w3Shv-zlv41nfjw9zUIUvG5$`)Tg3Iktn>@k>3fqt^G_{>=2oBIk7~$i*eEYeFq=PvIVP;E z``=jRg*PTdZWco@jx#rg%8@f^S6OKoBB%;6p?DTDbB1Q-=rLa-bMC=Hh)ZbIkbE1A z7TkaAV*2|D4H7Tg^6X!e$r%wAMPLZAw_ls4K=G8nVxKH*RPYtu%|LV%2`ny<2FA2HoKLmSV0DM3*xxGw&Spf=9@DME z!+jhS|0}ff?`kW6o6QHqWEF%^iIoX_3j?Vfhk$#{M`pgeWma+g8_ zRyz~%9qpiw%W~~QvGblzKBaM$XdVmgba)f#Og#);E^Hm{v?6ZMoM$F!oK6IEL)l?28=xo)-X%*mzy z@=3yR%YC+kJ$9Ad7VfNm*V5#0Hi7$rq-hGh+&^X48%DSFtm%bh&G+AMo}XjD6y`zB zd+OV{Hg$LKy%nW4W$5HT(iGU?*gI2|AA9Xt?R|2Go*=hUd| z&H>Y~h45?OqTmOQ()g?I6!GdHrQ3;c7reUMk)KzD1{BP?8=r0qNJKY!cWXMH(H23h z<$8Xo6#iZ*0A}?S@qsy~O~kLII~sSMVep$kPso2>NE@;oRU7_-@T-h$`n%eX0z69n z0@fP8CsI*UT>;^NXjnv5nF?t(|2qfI6Uq-z`#CQ$lhJ{4; zCO-Po#H4ipZ$|VkQx^9xynaa|gdLa)ZRSsom>UnobOOWCdbF{-hziF(=@3A(c6LJA z82ld8XwUH%;^&X&RaqgbdpJl*`VDKq7x>r|Zcc%=y+ zx{GzDfYK8oMR)*F+Dgy{TdJlaExvEpL7z6~3@WY%>A@RkU}N6%X9rvmZ2)dm8buxs zhR^+uU2a{KxxC_|Hg`(+F1$U1(7mNS%_@8qp9E8lA?T{LEFB`a#Q+@_{MwRo6wMnz z)OZt3OB4NJhkYnv|2iWYPe0Ss}gBGl$Rc+eSN%Jm)3w zJU1fuJSx>_>5SDoi?-_MOM6y%t;wU)9*dgMz{>EirVRniU^Vr9%8EPIPydDTt(YRa z2*7H>bFw5i&uzw-Y7y5nschShua;@^fxZx(KGf_XXbV7O0a*|T5QRcqeizL@#b0Rp zHV?TVP_%p$5`jMV-%(=TzN)W7dG|bk+xT81>ljXvzexr!#ArYb$V_*K7Jx{n|7yW) zK3`#<(RyH0DUU|@>r2;U5gMk`(a!)AJDzmGt^!%WbE|DOfhrEy$-o;(8M*40G0F>B z-_ukxlb{KXrN))rhc$!@?k)Q-Z^e)Hw9E8e>dp|*{Xho`ihBwz#W*XFa))pMQSO-R z?&w4>hoNlb_rNHf9dsxzZ$4)GISI*ynAWm4J>D>_Fp=<>+OJL^;PsJ3_0J}IYj zYBP&wCrkNdqN5gwGZO4Q>ZWso{&| zfof%r3p!uyk_>MCf4@fVK<~_VGSod?z`f1kG&M~#3oqGGLWz z^^oh=oJ^$=g>BgJ3PteRv|>Q)?SnObnZr;km;gbKmsH)A?4mW7G1TKC+D%~0N#9OD8kHerR}(ld&yG!J6mV^y z_dHBNk-v6k%=g9{atas~3*dr5^gtuf}diEF_vE!E z8fZ8gQxy4T!N^$ikc;w3RoCGJNB*WJK2mX4az}~_l$fK!agu*PPK=Z-vh7Va4b;}| zi=D?*8PrO&7Q(QVAB*x%2cj%YACs2#k+5o3y8f`7phKS{vPyzpk~8Qz#2l#xzC-hi z2W7W)BzgOVvwl|1`e@*OV@{JLRVI`-yaJp&9O7l^m;0XELn3S>VJb?|2IG$0QSOOq zNR#Wna*}*)_H6s{Z@|S*b~P>Jd|OphP)~X+>#w+N+8l8X68vup%REXkNZ7$s=+w{S zpqK2tj41VZ8Ifg#AfeFU5PWNqkf4ZN+Gi8>cfURxX+IG~hcvoI^wd>k=if@Qx*T+z(CY$}-E-j^Iwe(oB*0J)7Jt01VPh$EQ{_DFS4(>j@+C z*&tbEJxpQ(os^BMG!^Po6h6P~pL@zcEJq0H)RPhIK%7MAv_%8RWukUcrRk`A9WZl2 zzBvionkG=@MEjyETFjJD`R=ZH`lPqWT*rBtsgT(QYZk4giM`vAIJFw%4jdq+~?Gx~7XJAXFT)3KS@@-|mnAM&CF+L5YxYgIOFZGYP z`j2gs`|K}uGW;nf0mcWEh!|RNC{R$g;NO{65dOWx&B33u8Kefb-xdA?>B z-D`i1Qqg~O%KrJmBM=(NRK&Nuu|Cs)F}btB?V>BRkX{^nYM&-8R(YgBDPX#Ff4aEw zIC4elk>GS&LA&S#<3ZtNEaS^R?eC5?7XzpLusMT*>T-Xz0mcKPl!8{x7`pcYo|M62 zM-*tC)g2a5vVGk0)$n6ZtD>;6(SEFJUPF&7Bfit)k3UiKG6{zye+Lw`KzfLr(TAq` z4Q&n$NE!k10yAy{now+X)6WjY`-~N2UAU@YhqE0 z_+=0O8N~>pcplw`V2Kt0m_78+qj(aOtulEh!Ole(tlJ+fmU^TYSPT(f_?JAqV&S{I%vvR(ufHoD?NSC8{9gu|CVv6Cxqzthzzqgz z{k-=?|Bvri6s8bbeT%u>hY_${>1({ZRxx2Y`L7hoq)5i27!2g{ASSoz45--Jomy{g zKC`5~6{GnWdsw`#C)gEjtM;jvf2!Q5%+ozSPJRak^PH8Br@qF)CL!3p+z8aY7i+B^ z`onpxBbzZv&T+q@dNVbzQUaYsbH(070l-=XXCwGOAqg0Q=!M$0!9f!#|4P2AqR z?)>Re^68DlAJ()IQ}Zie$MC%7M3#|=ToBF6(vWi)k9gEtw`I0ttD4nSs_=u!E4zf6 zUw=4`0-3_t9;bc;(YBk7i?8tuOUivHV_tUVf5#u>r|{T#QIn5F{)OtZsKzMWB%HYF z22MAr^FndEJV>xq&V`@VEB(R;#vKh;xXGgCli;eh@Js0Y2|L|{O-;)zjkV4b@}!Ea z!Ei#(=w=(Nd(rCRyIiNCTr{O>^^4$LqxHVZw(Qe{Z$}9yoK*=1QxJP=o3&BZR8$<2 zsYYp=eVQD()TT%X2Po2k<|_$o``tv;olQ)aHJk_tASyG_H zTClQui9GwG4r?)E3H?5``M9#Ps4Gxw{dp=S%N1a~1v|>VKPz-eURVL3DYfqt_4}g{ zf9(=w`ykYo8ox^W7%cr6CBrq{X$lrUD;sgk-0%53OCF*mu%CueN`71X6|ak8mt?d0 zQ_*cu{9*83Z6m(`%kl@@V{C!rATv4qyVyT#KelD#o;AOi0X2YwTS%3rvqrhfl&&Dq|frJbSvj$&c zjzOJ=79U9Ezkxw`-JNWnh|ba%<58bno5Igc@v0HQsF#jLi32>#HK-yCNvsHGJN3S}%=xHX8~AE-_(VF^1R!EwBYY z+{z~7ZK!_%>xnU&j-Vj!(K{^cfBV$x>+-mj0l*u3Gs>|el~FG%2#4;?939uFjgd<> zCf+eBWA%)bgXbqB1TF`BnqezO{8NS?-nwk`DOL!~{}v2PUz?L!P_y!6)AG-gsOQKB{z@y?mu zSJv|zMF;=sSsB$-bCzGm+kJT`PrPoE3$d0#kAHG1W_EZO*R!ipGetaMTuKi% zl1mQmI9{JgGirH*g9k2=zHvni78^w#4TiAVzHbvU&?xYJsVZa}giBUr-@Ea&rm8O} zZTR66twSCoxqi1E9@+1<<2biHJ*J_Tbvi(RK<{?Ec{Ggku;()2DYVh1ItHDws49G7 zdOY!Ou#}i;R7oV#uM$Taa3~W!z5A#9quh}uHY8@$r+%ZJAE3K~JeRG=@#0gGlYk>_ zp&k!%=QeirVWfmXPsBBpqfLYhgs-loJK>q=d+==bAE@8e^&sZF04E?UfiWcDEM4MIcCNZc}#tl z{5C{w%e2|UP3Pc&FHuHdS~XTkqo;Cb{xr3Ct2y`DJdD_6vtYoGano}}pFN6YML^Xos}E~U)sIiD<~5=RRjfMIY#)1i>oKS@G0r7st-Y(s zEorq~E)$d#S2AF0UDWQN5SjY9p}6vL0V_pbL>EdLgSvOr`3vhoNnTEB`0cNPPk?RM zf~cePqH3~IXrTW9k}qf~BZ2$7gQgk4HpNG%zgkacD?jzY;TU@p01h!(8;9)X=G=-o z>Y!RCg)ulwWC4r4u3Z7!hUS!a-Oa$kIL3DJrS3q%>e5l&VYLZ0&jB08^zp&)I2~R) zU+E>2mQG3&kML2!;lH$a;ARYbAOyJSFs9u(dkQiKo#82)vOj*!KHvnuV?E=Ur5BG) z#fy5Y9aSC9K}%U9_w?3F9| z9{&;Mr^@x}OD0m>1ex`iGHXv>%Ej6&*Gvh8nOF+ah@Cg$`}(jkbY&sHca2Drnxkjg-Z++xvE^YS9;vTPpBZDzKQ=CN$2le|LbOel9%PWH4Bm+n zKO5_qxq;KUC-X9DJ6KpvRq115sLxw50bSz!^#hyvrM>K*|v*O z+y)dyEW%s_zeAPuf`AJ1V`RTJ&`oNKKw6$cEN?-`&~>z&2!}|q%u{m&a=14cRR!GpeeKdL%vVC=PgH3YeVPq zPJjg>;irK`so?MrT@?N(bY`t9a;v{;U9C3>yi+x?+`DkqJoRHs@>XserHc7j2ds_{ zc#rwvFGhUmm%pA-w~K(8j1Nb@N`rM9F0lv_AnNg+H?8LSnl;tVMAY!-DC9Xe5!;Kc z`@#=n`ghKgu1J*%oINVo-J8X2LHiD%KMb)Rc4pTnFu*%4^$iZT{dHmrlAJ34fd6`Q z<%LP~NCsZP)sXBfS64M|C4KASAaOodB10GZrqttL?&T@LWe^*^ zN^|33h%oJsM;;z~F`u-%psZYGbc6a~n`KTV;z{2^qO>AAdhIUB3|IiX{N8GY?w;dW*m^ zPO{xl50UwdsG6#ed^W(_ZNpeht7XV-h&HJ03!T*vVx2)BIlNC1U7zlg5KAcJz`VR$ zxac~QSQ){3uM6@i@8dl5Y0;?a{=K+Pu_FDJB@5Cq{-79Y(Ywz#*Q;Wo`hwSp^Zj8y zEf$+!%pic}L&#Dfu_vj-t|NK&ZXhAnCguGeYF}CpuYH1=iXs#tW!Dc=XDsdVD+4!E z6@}r-%8m#(x`lf(=|=S zq~sLLUM}>{Ea zu)|&TTC@uO!Q}pJC>T_?B@TDmpbdT(|42y1iS0zu*}Mez6|(j1j^66~c^It&o&91$ zvOOjCia2CbnnqEUo=N!?WStT?GtM7i*E#O^`)TvvOy#@7MI)TlBvjn~sY?2)bZt>y z=e-x$WW_!RWqe3?xPnV3AU1dE#mvY686_x z{k>j*fr7k3s?7)EGqffWq!x~2xHUf-Xp>L;Gbg8Sm&^6TM^hhE1Mw9mocdkQ{ zVf3CJgUjlYsE?vxP?AhP{1-hNebi)+`o5~W6m-OR7pC_^v&4c1}&+55$xdErDDJL32Kh-qO` zT}4;?Ptfz>+ZdK+g=8dVHoRf&k@e?0v!cw1>UQ;Ip3)mf;7Sc!6c37aV3KH!GP}-j zs7A7)Fdxx_Hh*W2^hx*W_A71yIEN4EGOO#t=M|6<`Jo#;oqt%`=v@%v2ql`H)Ok%3 zV5QYUr3k)2^_6U<1sJ`0CV6QMTV`?cZzWo4kzNI0hz4aSdI89OW=&bQRf+B|S)Ee3 zJDR9M-b}H`%R-iB*66&5^Rq4CLh4v{gQB;Psa>%OzFj9mJi?%9?Z>YY`by`o61m8E z0y&{WmRjscWe6|GC~ji$!t1xtA(a2YH60n5h*ElWkQ>EN{=IP%*g1e+*z&Pciq@K+ zx6*eayMGls3RXve>a3m*+z{j2So#cpb?1bQu3HcYfTyH>Y&a1lHIWV+tbomk<7O1ps;Ip_KEvOxG<4u^0BOG+M7D2BqHFI7AMp+l)_Q>S-&Joo&@+^w#8;->?@} zae7OaJ_>oysfwPW#iSjFf?NN2T%2tC65=77XS8~bc>qY*l1n!jjqeXm!+io1zdw0Y z*-?7TT>QXfSMiyBy%|Vq=k%{dy+EV8))u5}EP^y}gGrb!85g3z=ROM8nU4Avne*k4 za7IkJF1W^k_t}gjMPGfu9UniVLpOp4SUIR?h3bi@_u9W{+_iZmX*Xk zwbpSSWC#3LnXfBtYt_nk%%|hyORz+o7G0->fhi17NWpX&t~*&y#p^LfJ`COxpG7y- zT$hhHKwZD-`+UF(f$9RvF~gPBj)pgG^Dek8c z1G)_ea;MZ76aDu*?PnB|qh}PI?mWT1rB(ISp?DaYXFmSJbRN$|z0>(Wr{&D5|3FO7 z0ZUm%hO{zmvEKT%fdEYw$3sl`6FA@*^*S zv@yltjPz{b^R%Iur>o8Ty#ZRTlNn}=7%-5eXrr_C)TTV=S51MD(Hl8_c@6hO!oYs| zBmi;i$$9|vPv;E31vYChMmI&1BX==~Ujg^kCv*;LPw)qzOXFFi6pbpDd}Xc+S5{o! zjz6L|47nVkObbk>@~gP)D7?9lFFMc>bj<}5?KOaw{VyqF?v1MU1A`BtC`ArBN2o_S zm-H3$^T~=pkExhJ+UKu)`=G-LyChg4AD?tY4*@~)|7GYWDOh0ez`v!CvCa-<^KTjL zhGi}@eG-{6DFuE~82U^p?3A+mX&Vj^=YPLRGPa`VPf4|X85cN2=nu&<)viJw;avN^=Y~?Nxd3Gs-7^8R(wVm5 zL@O39lpB*GK-4+arJG@Tyd6HT@trb#6l*S%z!q3v^^$MLSHiK~>6`m8gIz8{zWuz# zopCe)&y4P?$;wR(%>Ota%ph~nT}T>}mpOKplb4-LtSxM+mLN*Enah!mtSX!tdgw>566VWu~LQ9OqB+&xf{4$D8t;basM!Ep1 zp@?RbZQ_l59~f05cKQ7^PV8J9z3VQHp5#0RCDV^1WVJZC&1@jtW)4`%%wx<9^_NGP=pWm+ROt z9e-+xmh^=E#Sj-Q_YA_}1POa#-g?uUgXj!?9~^UiJx*RE9^u6Ua^Fta34^o!Y#qsZ z>}bmJg*d9p_Idpzy?9WA&TcHCaIaOzC-zN%Zk*j`xj~F?0?=*p%ai%WnP5qoCiMJ* z#na^kwcT5C*EEPYxv!&4#>3ME&2&G!_&U+x=De=c9RX{=C-2~Q10N%*fQBVAhSyzJym_S|8E(6ikL>@ErhV+Aoj%`4XAAhA4p79c9M@QB&OY?p>^~VpY+dK zAk->(S|1|7JOgseZpj}r;JYaw=2#BlqDyDSmUv5(lYB9BczyhlG3SZ8!Qx&3kXTOWSm zwl;Ng0`m|h$^f-cf1GUmscbK(;wARMcXaF#L+{#wE^;$~8try-Gf2J&y$>)Gzz zTDBvjy&JHCk0<*UM*J6=nx>ftA5ge#GEKx)k@Df9zj~Z^jw>qgseA3>04mE4Nr_u^ z57O6cy%J&|0Do+g^cN#ZumB41?V!L1DAz69tKV|zA1ZkWdjIerxPGsA>pvs~E zKoJCQtNMlH>TYaCp5`IGD&n=mm2!#7{K+mlo zk`?t|tS@OuTYZhip%R>%EDB)|c6;BS5_G{URD~;mUjmow!+)VMJI{#`LPs}rQgJmS z`@t>OYU8e@s7!f5!D(=9morGMRAVVf=T|&CYGI%7R4z(_ z<*j#-HS}@d%CiTz`P5S!X@LV{v`F=uw~40*HpZW8v8jJ{1Pk72s3m7S5*0RE8OQU# ze&gKifcxnBvW_++yLH?f+Xm!|)9~0zX~1wwE)Jz5S%JCOFUSi}c5_cT6G4r~Y$ECk zxv1422D{tKEA}iT`+Tr|Edg7MEUGM&j=!Iucu&&rl@X%;GML;K$Uz}^D4bdjK1#yFaau1WH{z$GBxb&!RN=nwV>m$t^MWNK(eI z<$l?ahMAblv|%p4Ip_Pk{ef*hkH_Ax>-+h7y`Hb<_e>4=kBJ`Jw{IW+-8;7|_U$_y zxo_Y8k4FykK8a&@#q<6g4Z33+vTxs+i+ex&?^;|~=6$$7#KPdlz7HgE2Jg*Z(Ca4G z_wB1pKECC8Xy5)s{=2uX-w)rvkfZzZs$(#YP8r+@u8_v29=(*&aq5yvimb6ikj9N6 zu!~UT8KJ5mkH^ou%`RnpweQ3jE1jh~dBHr~fwW@T|#R`iF#AF^D;s)nZlyDNaDy4IT2$?Z=uVb-|-(&<^#uUnhR zyDRz=dHS=4B*2(fo>keec&!~=K&wG-kkv4ENhAHPkhI2- zJh}!3LR#LP5Qlu~9vrRxWvMTRv2c>f8=SJ-(+ezXIp}EK*N@hQvNMRd{pQlYLtuV$ z&)kd^?)}tV6u!ON6|f zk+8#peOML=dD_C$;_ebR8W;orbv`cc6`5fGm^}$YhIB*FlD+27v)^bZ7eb)+8xu4+ z)GIxZs)!)r{ESs&3WN(f_!8n!oE0_I+&I;frODyuixXm_u#NPLmt5lyFC+*V-9ZIQb?Y89kAAe*hey9_i&)m z1fEtbEq`D8*MX8O49sK;Pay)(xvFJW)fC){ep0dMuClloe|~J5-rDy!T}E+o!-i|i zW3MRv{sX6W3;3ipVB$-vkY6z<;)0m}+VCAsF)74?7Z$VMIOfBr5z3RS#Y`5!wB;H~wN6cydCc7GBn_H}idx z;^&Jom7M|Jle@kr*T2#6;YE8GiVZS=pA#N;F;qak`;ecP0`!hFx!FQW^KKga7y$Z+ zF_O8pqd$XVstrNyWD2~|@S3dtJVpoA$w{I+>x_7zg6X4SwHVmiR z0U`~UC>7CzDsC5NU}D)VsOUve`x|O5*7fD2T(aM^Zd9#0WJUKV z)Ry+HoyG;A|M;ouP7LVw*PTxnI9t#OQ}~g zD)nO^cwurr45hI-vm{J1@!IULAX@fe0{*v*h7DJQZ!7y`WgbTfbdH6HhKH`Z`+(rW zJ@dpEipoFdeBZuv0AI~GaMd?*xgmaBcidL>Qh_~=xe#|1Ep4f1TXz%sq!C)4UW}}1 zW+;u$L$WsU$&~(|dJ-V-Q_hUsntPbM8uwW(YY3*y{1t>mhGoe$l+U5kNLzm3TjlLF z21E4G`A z^&YSw4Fvmj-G2fqM3GeaUBD-<6fx7XQ{rz;Ij(A38Ooa7mC*aYGJ+UEqrOIJbCM!9 zlg&s@t5P;BaPsr^4+B~`OcbtuB9PJkH_BBj=U#`0Bf2AzE^tUaT2IEy4(kkGf!KQAp{1|DA@ zg9UXR$ue&COcE=&xS%N=umBOG1REoTGy@bvJ;t+)reVhHF4lXh_$!)mgI^Ye2zNx3 zp%#c7gt3k(t6n%XElRwuJuSdx)TaFH|%1@s(Lf-QLMTKP99+K2cpMK%T+z)(U^ zGZM1pcsJ5lcXVc&zMDeyk+0KpbT{+UIX4_hECjcw-%&YjN9>6Jic(nNAK*o* zH{!N*1VfOZj~5D}zEvZhlRggU))he@rO6DA=i=*)TxEI&CQG(M$C`bYFWH}Qt9wrZ zdjB@IF?qHX6NhrU+kiL$Ge(B^k>W<7#PZqLMb@XerXt6L;>pAZ`~|!WG5l5_Z!b|$ zPY65RnX0;CW4~vE^tkvnwQk=9ryB2Pc`=sh{_}Snk&XWSE7QJ4b)lrM;~JHeQKH?M4jd58Z^@N$a*4<)x)zIXn5dazf;Qt`P{*k z92iK5Q(M#545G^sh*-qSxkxMx%lg7DMn-=I5lGyvfb|v@01nr+f}7=?<{d|NeD6%K zo6GxTumv$sOM{@I$E+?gb=~#uf7r`%TpR6g17>fok3^_|2ksf%qTz=<63gRi!mBRp z#Iwu3Lomrg0KdryY1y!MS>zPyG1s9NotcXEur=jA8Q<=?j33J%0>;!!vLcKN^tf&> z6s2Y1pq{md#8^mXqwcJ#Ne(5%7*}OP+rH8~o)Yj;!-QEO`vs$V$O+Vka~QH8?aSFl zsbz-Rp)OO#a_NRZLVaHj?;@Xf$}vkuphM=ZNYy?-!N@#H9t|FVqxzs1dwR0@aB9>{ z&is@xofF|^cblF@zZ41x?!@1aEo{2)Q*)W;R>Yn!ZMla$Im_2oEj`!ICB40P{ECeC zv(B^zqDSTIp4qY!d{u`nl8Cl|Z)*2M<5;S@!#{N-j^V9L*qx^yL~Hardfd7(pR2;Q z<%OFDo_uA-dML89+TOnR)UW1l^9wH`ppA7X0o&X0>w1KizVd=|$(+~Oi)<_*2HfG7 zBpccjHPNqI5N`!Tnwx|AW-Hh5gL;M_YArhuJQ1F2MNs7W^~CvQgMxh4@`4#U!X!S!kTsSq2)%ke z1oUuKRs43;v#UJ8721AR9GXz4!u&%Y#3*!p`I7iH-M6M!bN<@I>0JjFYqKm^D|E3F zq5sBV;-K+(!<#2}^2_9^i|m1KdbUrm*`Gb4rLo4EI0(NiYXF!=-K!F$1=;_s=fK5W zYh>yQv#fFCzMr{`-dRy)br<|5z23+J3%*#O^}xUUlDsbxK2Iavv-uECS`&y5Jaai~ zeFj&}2&1Gd%)q<*Lavaze2|vRZiirJNfm-slojhs?O>C2GD%f>$x}@-ubhd;?>so` zlx9IxF8>dUoqY;E4EQ1=id}sxrslK!5(u~yRsZxs^q)N&`nCN@`&~5L?@*ZM&$zt2 zbfrqlx4LY;>0RVb9;j$%R7T%E$(23XpChCh(j*xt@;p^Y?PH0iD%bCicAqY{Y)y-# zJ5DqiFXdKBHLC?1OP)dV8w13oGQeE{5 zE!&FvVXN5*Pv$8c?fry@fOwf$-ky|Z+@ccv^n+aBMe9qV``2cBvIO(UgY|M&vX}Sb zuqt`j^9-c^kz1t+S1kAHp*cb9-x=(hg#-9bo1SmHoyMOeRKwd(3r5_}kHU5wrGC|LNV?qxcdMx!7 z3g%2#QW{%gI{u9#cxLjuy$nHqZLFKJPzYac)d0X%Pd`o3-*}WEIF0-hyZO_GCzOM! z=;ONO&8`|in?j<>!qWCNQKa&|EJNae4_*+4d)4>SL|?+p9)?S8+gE-wp%z=qzjtGr z7HDxKC6D*_co3Dwen7Ikdm@upB8im}GdiZCKhu}QP$dKjeu7}K;iWM=#I(4gKKRD}vo#6f(x@(h#Rl*LCy)+2 zRgq+Nvwo5E=EqXI?!y|IvmvDj7f`d&?1+!#v~mYR5a%_`Rf*xV63~T@1?ZaU8%eH~ z-7}O`%mJ_ODPd+bRo4DXLT__Iz1o+3f;)3>TS^0?{*LCd7oz|>1_84t758!u0di{5 zA*bc(VFy%$C^D&iS#Mw2(Hox*$0YU1Li5tH8TlB>{K2{YFJ;u+fD=E#*XIT@ihsL2 zP&7#By;9{~A*h(6Q`_@Qn9@Z4wbK!N++X#^9_|am#7XmDk@0rTUX~%ek@lajO-_7d zMaiP&!qDEirM&+(-VInPV`928LA)wRP<&YDA&c6BP@-p0vZ7{nets(IKVnO77I+|m zU?CSb)||$-v!YYGJd? z>gUp1$e}j*81<5hv1g(`T2q(s$zT@>O6M*xsatLw4E!;y9Ntn{q&>4xSE8)N-w%eC z&3|_XOwa0e`-M2;n6`YK&(a2K7gR(0p+pk{;%lbJ%v5EU9;@D+SSde{6Y371?G9!# zG_LRj8-*5TZRf}i%uc2;5y_2)e?0FeX$g8pG!-cGZse+lW(3LFA2h!eAS^K(b`8q! zA1#PFWw5&y3%Hwav}H-8lh5&6e&-l$>~Y1%6`g>Zq@! zLe2@x^j+34@`-9=QoxieC;mEZGXW{+}klY{O)J+rfTO^KmFfL?~%1V+$_d@ zY_G;axwEs) z<#N!^^@d8Yjh4*uPhkM|MQJg$aC`D0$DzBfyP?E4WkA`(Q1e z;?NmOdeTJi98+TcMqRTYY3Osd!l_l{TxL^+oqr&h;J%n4a!BRRv~p+g70rSNR*iV4 zr0(~!+{<;TSo%DEw<0Dt9l?^~+IyCycq*C&zsjxc= zW=_((r66p6{cU(bypkz^pP`Q(4(Xme01;O9&A34ocLSG20|uj1%AFv{$POq6WtLqpTF@vqL&> zbX&woNa?8`w2|K7XB!rV2pyl+f6-RrFTBm^Oj(1}GzcAU6Kl8UslTWGtS=luEoc`A zovRou9aFR~o1UH29Y=0j)2L%ZFPdVM-Mql7-FkWQQVDw6cOakoqQC)z1m&{Y-~p%# zVOmSkBNV0jm_C->yZsW;@_h(c-_BEcwl`%{VPE~PB#?i+4cS}ed*Q5-2EBF)mDw(1ucKv*}O{p zclWuXR#9EXU%^}0f8=K9wOb4LI|xn6YQ}PUr9Z=}LY8Qu7fRO<=TJW^Fi2z^bwHj7 ztQ}-qaG)uh{y5Ptf4cJhFtp~(YQ4#LgCbr&v|A6!`m$}`>9GqGoLw=_fzI0Gwq%=y zAd4xWYe2xd!n&i?1lO;{89jY3b+t+ z_Nm~aUVUmr+uAAI%MP90e4zxsfrb}XXd?=j`E)X{hy2EJ){YQ3Skm~ub#+AhXu9CYa=z1h1@ZPTnl zejIm=_PzP6KV$9AxMbjrPBb&mnD?T83(-A3F@W#OsmT$4MZd<=OKo9D61o4bS6(rN zmIVXiECHEHG&o0!N4y-F}Xo@Hk3)EVGTz8(P_BTg$cn? zktawyXda|2|8eBsf=$QX;gHG(2#aJ||km*$hb z08{N5xwHY<6m+gE0U0V+6dPj}MvBvU2%TPC2gM@xhE#{JWfBTrYR=Z90+BO^KQbI z4x4+ek-BUDQ%d+v?Z0=^Q14~t*m>vF(vXu$O33zN^2(9CFKntl? zMAK%x{xpA|2&ri~>}J_qEG->gFHj_X+m>?mmf0k{)*Vm>5gSI#7@K+IQ6~m+H~?ag za$&&CYBU&X;P&p>8|kE3MECb2SdkQ$TX%_NaI)R){*D|*8w_a~1}=Rh@Vr3Tq~U0k z3W!h(B+ph3q$pcrdZJ4Y0WIq|m=NAWL`3#%Lng0Yx?tI{5smg%7qsHMVcCc-hMekE znc)270eAyW_N20At z+L3oD=X`hk{IisyAJ}^s;iB6ubUc-p6LR#h5uqO6G(FM|2XIAiyV!#c`KgXwM{wQ6 zD0maX;XDzMciEhSqqDnc1g~GhwFRrqd`>jQ>6n7A8xxH4Z^}}NT#-aShF+>_rgyD} z+L3palX@cj`Ape5H;^>E%EXZsHI!k?xa(+3_5_K+-7kc2OUZTF$1OQNk{4Lwt@HJ~ zD`mj{l;gZpPh1)k$R724QM-`?o8U^A(Ffr5!MifK?6|u+KkuRRi89QSA!X z$aE`260vOAe%%$PqT$y8mJej1Yf3hP7o}spx*GKt0Glc|S~~y}zVC)cF|Yu$o4c==6Mu7IHUN}!YgxGxdvmx!vO=r(`|(`mT-7Q zT7>v6CS=m{Ne`xLaoRcb#=I@VY0(+%R?0hAcPKA>l#?hzteX3*0YFv zhn2Eh5UkmMvE8O{YifMZW{`2;BXo3r-nUb5ko&-5{b0`sK3tdkO17sK-k+>|B%r1t&&e-;@yLE0T4T&y`Jkt_cR|mD8$uRaJ8)pLpCr z5AdTEx@!ll9ts<<)jry8>`t%uy1G!x0OBE+_kEJd z|J7>$e*cWE%M~jrg)$R29wzqiQeCveRjIsy5=RqSv|Nop&9cAPT^?$w96BEF(|^xn z`VMaEAA%;uGor+TRAm^bsZYKSzl$^Ox*s-Ao6*UYowiVzv_E;r@pIXvw3bE^PIX&s z(zeA2hvrEOixT}0u>LDHH1_E)b#T^UVzrfM9zMK@Bq1S3?3MA|?v~;-8JFHRyn^c8 z@~~f%UOclDI+k(3v>+60uNAM>sLf7urEF`REQc3UOEicB*j0OTbELTiw4iKtUFTLn zbZuWSm@`2~Hd^kAj6>1ehMb|13`qBNC)<;R2CTZQ$@z?>yIGz9%Tf=qWjzUvckTu9 zoZAg$ly6AO{+X~V1(RC}o{o}xuvAB&JpAAM@ZXX5$3st0y#H?Brzwd0V4 zUSzJhAa=H=`oSpfy6$8aTF%mEv{t4_l~{{<_K(ELd8bYf%)o0ZR(Vu0*%xflgK@Pa zK|a^CNR}eH>6J#~#P`}WFnfG5!F!0GIN)vHXw6NhIpo9*>U_ET_~tW>{G3d%Ob;8~lF<%D?&eh@d6G`&&`ZoGAa=E%*=5oIKPOmDC$^6|GKc3yHFyaM?oF zWYeR{wf9516tI-v7)CvYVd!gXrHxSq|3>|XXWBX=6s5?-;Qstre@^j! zyfaR%|LCj6^{kp)ST?VTypc`2&*{}s0-=C(Dx6BXNyiD@sV38$d723|Pxu!s{~N1L z>bPn{=_X#IVgZz}plaEHB^jgc0ZaD3LJQ2Oj9sD>F$-$Fx11S6uEF=6q4T-iB{nRk z4o;5BjZ*2m$nCCW9HI0zi~h#g=a4)7?2|$yi%!dpvzo%ia}uy%lLYDzwMj$k)kI57 zOrB3*=v5=069O{(csavRHtz&01A2_#Iw3&!O=i0kYvxmgs!?&;@=xgN8{i@rED@i@Bl`3Nh*l$?*+_gy`ilFL`#kf~Z0Db~)&giDE?>-f(a;%He=Gi>q@VmThdoV83D>LtS{e^?zkdrP zckcH@S$>3Plw@ygN|fq97kodvXI99n{-(`|gI?USz3sxQ8n!#u+(WnlM)VikI0v*h z&pS;U(wJ#fA7l24x^$`)3^?RhCx2GLU!toV@iBA@V??)`CxP^cKx;ZMvzX}#PhlK$ zjXrA(2%lba6_+Fz%oXx9Yi7j5fE!0_W>&kLcUGC4=p_!*nJ323+?y%a)YH!zuH1_| zk>?uOnQ#Yi&sy$i=($Rj;MrKkLaGAQdB%s=KySdPawMpMkqjO|AZT(b>d5lsY#tHkqy#Vvy(p=az8<+5 zt%r;`r5DrZVQZZiZg=; zhlRbQZuS;@rn;DkAh)SUm zD}xl2!?bFhcQ=OtYMy9WZZ@ln7JM{>D{e%;M&dRjmMeoCqE`}~9pI6|0F_teOYQ-Q z5Du3|WC)8{m5HfZXyd$uJW`m2TW`LGed>;6%Axu?`ONthKDZl4;a*+K^VX=99B|ZS z`1Dy2Sx=GYnDSPf4tw!&G2&2^5=V?078G-U8uB990er{rlu6@5 zO*9upIH&BR>g$$wuF(@}?l;vbt&S{C-TI|^g1$zN!U0r?ZEJxOTzB{5?%z;RDEM9a zej#zyr&x16x$y};kx`65nfS@w0^~(#^SL|F44MnFIH6@BBp{jQwmX=y-lZ}7I7gN+ zDgG)ka%+D2FS6yzw*O*s6Y3X!~dXqU?c{#h#hx5QBbe$CTnYG}L(S-cDBfWOa?CLS6jHBT96TCk>ET`CmAK|s=uxr%d^%L z-D?i`9=IJ2scPcDc5Px9-)QmfS)UxcY2TP)l#pR6&(GPC6dC;1b>H_*!G56lK4LjM zYb}km5&m+DhZZ9Y;-md-sB(H2p^Hg! z_F@|3yq&co&MqYRp>wtBYM9(3m#+36sFtl2rwh8va#1xC_temfxJQIns1^jn+wWzJ$?40lI; zV~?*jvAfOE-(`Iw+<*#7c4d2k9*^jM#*`}lbCT5YQkQSI=4Zyi!%?5l0Zq}G&YubE z|M*G7kjYP!qjomvoLyBMBPp!A8?Y&{{Ub3&o@G-Zg&JuWj9!l8Hgt(k#8n1KVh^H1 zK{ht##Fd%#z}u>h2SB0h1&O>Z*BoOYx)6QeT~Rr_UbletK_tb>5FttucCs>-5fE(B zsoxCxkTQG6Kz8P#l3^xy|B@oPD#COm4tbgx_!4{ke!a|e2=i0@S=({K@)u6?Qq)oa zdXoN+yR{&R*I@h@nlyRELBH1~SJthZ-^=8>gkrTfe0Yw$eMjMHY#EEDVGJmezHyL? zfoP8!I1a^QVZ2#>VSnop+^7si=@-6*0aqFvHVi{|(k_6`iqm;@(GS{2m4FFz(vX9J z7+Y$(|CI#eHQBfEY{BrGkb2g|^&Tqd>YwAf7I`>D3hW!EeHM#{Zw>;8p~N(a2; zJlcxBtvN=v;`+~9)=d4dohrF?Y3_triw2JvvY|xMQf9IWBNgY>q1T_ zd%X?p-mgwig3OF4zeb!GJ)=+Rw%&2_%?g4?Dm1)Nk`V?>ny~4q4qH#|%&$cf?~Pgz z|Ey;;&3KmutCxg6a_DR@IOB_pvAl;_U0WzWRUIX#`yqt@IL@h>$SccFY2cfRZcpgK zpQGt=FTx5j5Y(>@WbEluy9>f48+w8Ar+S~eoJt`brl8)nej(8(UKtmq_DTWIoS>^l zjh4J7VpNlc#pwgOZ{?SosXS8A(3MPCxOJ!(E@0ER!T5Mxk$sV6Z4W18*VtQ=YcdX^ zQFn$KGT#Lhq|P=FIrfdJ$Ht>sONJb(vt>7so}KlRs`igjLSgT%hUNs9E1u4R!J=uf zqYC1B+(xjxzh3}!%?lFc^J(SgN^V%q`^>1XJBQP$pQH%eDi2$XmeK(S=*MKxoYC%B z-_g&Ni(e=7{@#BmPwLAr(WVS%zZN(vk?8(o&JUB|Rc*iqPLFDke-7D<2wIZ-b^l^r z?BN?Bd{rFuc}fU5?yt>i>&~dtX_He^b3jgL4HYQ$ifpiywbI#Ey;bE2TF&tL&9?9- zf0Bi}Z0Yv0Gc&1Rf!)0J9915mgtN3gU%a#+_J7qC>1}GN^1S%+jPR<{Fw%ZAL_fxR zntUw!q|J}22O%e$0G|fl{9Jc9_rS10(xGc($CU4@B=x43urn}H?Zu~;7bN!MO{D94 zulJuM9M$p$cL6ETtNSw@61e*J)2Unbe;~WduwOb6-E&9KX9>N}F!sx^SIOIU zO6enX--K15CSX;XD_+-`90bl;bQH(d35THEt`uV46^|MsfWo@n&Gm|s*NQ7?ZR(th zLv!%AJ;sR0q~L7ZCYExdUqI+ZFImN-C>qGisy(RRCFP8fL7)Csn||c83kTdMTVi%w zr!b6R)a*yLz^)ttxh58zT|C5lo7+`31yM5?I`K<&%|;G9E=%Zof8zI{6U@5qAnk0$8yeQ0H?Rl)nse!5riMUVH%@K|YkDGW2G{ z2K6xlr3li0Ipn4?{u4smY8hI=uHS5+FG4A0BZW&>%Ks}Y&p5D5ERR#O?ArwEHGj5_ zaz~9UmYj}TZ#Zu5^WF5w)#ufJxes0_o|xJr&VW0_ zu96Q$QqxXOR>Kx9RQ&|HKh#qnxtSd2fu_9cNd5JqYnq;}Ves8=7L zqbnZxe6nyluKHDG@x9363e{)bL2R+tU^M=c+3Ah^p5@Hr!$~l^+x!w9(-G*VXU-2l zhl3<)QOmbJ1wBTs_GXaUXpq(mw%fvGH@?B1e#Zh{>e3p7OcrR6*)!8x7OKy;znQ6U!Pld=@np`7U-f4Z~x%4&(&xm zJUkK9(vS`^wVx2FpByALoK1T&uDMjOvF(0hqBO?Pe&Wh$XV`tK8(g2S&Dxyh()Z^j zV(Tng_yR~%ZN!$lV2+>2l>CjS=3){Z%ZENcH2g4~+L7*iI`e=G6RTziI0%l2J`r_? zPWaYohRl`A*T`K>biJY<{bt>DdW+W(S7eP2M2lNz-%kDmY0tjU(`gp7+0O;Y5=vgB z((2O#cg`<2U(X{zowO8ydg)&deO;3N==eFkZcWE>48m3bWrkf7MV3R!Fn>(1qoq;V++oS1|VSYMmXK4M}QM zl;LMDjo!2fi4`NO`l6 zNmr53+#2s^D09}a4=XUMw>{5X^b2|&_+={2{}tE3=+?qGC78TfEOqUp5Oc7iH9Bl) zs%;yuv8pSQbK|)!E|;RKNIr!WsC=L+O#(g)C_vnzfCS#!|C$xoD@_zlIg*`GM#euT zW8Xyh0r2hoe?O=a6@2v+fF?XqEKxU?gy?Tv|JfCHGD-0$7@2PobpM^@Bi7dqgn+r& z&id+Yb$K!RV*uQ8OQP^(NKFyLK=OFBd&?f+b1iEUmZNP=3C4u$5BbI$M?{Y3x2e!q zrna0|3Dl*0LjPsyT1#GP&#)YS{IN74%=&t&&&5RY>@frBr$J}3$UCSunST4}wm{h# zhBAG_>WW)`PwsQ#WFzM_o+Np;ASkAa?&r4uWy82-F87k8FoHR!Ya&bW8$T)D`L505 zV&GH+uTL}27Je|*e8?v7sRq*s<@Gj+E0C|cZglFf|1GyUj8aXykTk>P-27MM`OOU? zJaFrbXlsFZs4cYx^@GQ8^#5G|3=GzKPFWj ziMdH0SPV8-AYfplGE17^VXl@7=J9sXsu^)=sgjWK0C0iBjMdjrUx2f-8|YXH zOY%k9n+a7;E)JvkHFOg026{jejZ+;Tbc&5&3eFkqA{L>aCbYw2ZisCz7>KpQJesXn za>2UuKYHIdE!nCxXBCtBTK}@e$7|#qC8iR9 zv%>3jQzfHx4udqp1AWw!yIwOfG+hcWUo5mm^E%LeMuZo|g9G2WI$`tqCO~xmfQcCQ z6)g8GJj>3c2*oX80tE+dI@5^*IrQ&p{%b{oigcX6pAj&0WuuJnie$FgEo!A&NUfO~ z3BPKm_+H0A6*=T&j{+(! zjMw!^U!*4LPp^N>@C8L03x@e(pE>1xZ#%jrZh3XxW7KHrwct18GVtVSM|-(TfEN=c zC;qq*6@OQ1k?6n1$Kz=&kOH}~-B$vK zB#tn|-zJ-1;F0x5tU&4(q>kib%Cl7XXJH}#cZNif%69=ypyN1)`JvJ8PEu-qX_KRo7W;KMre^rPJ*ztGZt-GUa7@Q$^Odw#G7}u z%Q$|b>`GVf1$s!%Y@Go2tFAgpa;a6n9a~twWI1~I{Ml!YuNc$HTp@0_@1OSHPBCDm z*lc6_lbuZ|P;uGtx5_^tIx^Xdc79Qn;Yyy7TVC~ob*Z1Wy3Y<{r1GvbLKAgx$+iWu zKpM)SRVV1;H=pc&F>#1ERN44nlJov_l?id?QL`2@*m#DCRhL- zEyf(h7PT-g7$PF-NxOUNSj@ASAm=pB5v{O#0NY8^lC*m6?tn6E*tqoCU!3HaEgCo2 zp_KWKJ82{*mz>s%J z3IXivPVvc8wYv>G!F}gsu@dkU zosZEjQOB6RFOLe&#J?Ahiu?595nI zavO!W$ILZ{r27yv*)9rH(H`$rRL}wc+ve+Ud`q55&$S5-LJ+prAX}kg+WgprnfTo; zrE;m)Y)M=aXpCk&eTqJ_P#JT1wo-o#p!97GqD-Ha`~V+0mQMYeACSJK^-F7w?_tFe z$Gr$TBGIqz8Wi+>p`@k#v^CYq@Jx-m2d^FC?Rx$n?@a4In$30C#4Inu%FX$ozTlU5 zrDIUR&5D_Y{YyCk=f|2cX8glpA9g4BvQ26-k86?M#rIW)z$d4gANO|5k&t}S`tW-m zYxhJ~%dNGPK{8l@N7&rgJNPpsL(;Riqp!QUGCB5^984CaD!1ExUK8YHrXXK@$ z(&b81UEt)-P}mFP!?9#1Wbx_VsfT1OZ=;QY>0h4tp!z`8!~nV4D5w0;h6A=Zv0{oR z34(l;SCp(&I$hEMJ4zh9q_s3g4=j%sRQpO7X}x(>Fvpl`>q6Xm5p=g&AZlaPJG^B` z%l7DV5?0Pp=4FGzXu9w1Z*z__ih|P{H{DF$J!n+_O*f+OjhKfnNazhy zU(0^)yWFFjz?h)2xtygXi96M+zi*igRE59jJi@?OD)0xEajgg&XlCG$!b zS?IfDQnLKG%Z2-3c}9JwUVx%yXD^w9>YPjEG59P=-?bt?K>UpA8g(8{05XsH^EM-* zNRWVU4W@dbh0OBB6*~rd-IE_cf5A;pO!nl@D@V9k2`)XyX4$q88lH8V6N`)L&oZ~e zfXCV2jm}IsbeTSptUB$=C4MKOzatw9xVJ10W-T6}&_e9iAU^J2J|IlA%h_M0#b)+e zeS)p~1$Fg?g!vZgl2bgB5YL(^c6!Op%e$5D+jv$=K5;kN zT!HC3-v}&rt|?<3NZK1~0J0yTQUKZ~*pbgGR&FMkifhl>KtEA`{Co<%D&CTokO}yw z{kgcl68fxGEeZ>eZLbgY1IRf9eHE-gmp4~B&EFbrqqXstHvRhV=6cl-Oa zYSY&W^}phz-F3R1eYty^oF6{)sGWjg4!7?(KCmJBzeMya&RovV8aUl>Ll7z$)B?NE zr90M?H#ISw099V(`}k;PXf-N*HM@5zWbv6JKLZ>-ceVFT;Mx1!z1JKqvKUx(x^uCOR_GqE^n`2S zE0|`XhgN&yJLe?N?uZ80c!~3!m;*;;9590Dr2IpLEa%_^^Tb?T4Q)4<|3ny)F zNRH_dUn5fVNv1PmlvBBA-G5lqc936Nn$P~Ch!v;FTal`*2O?A1wosdZlM<*T2(r4l z0Ld+<(H>q+K2VoI;@9I2C;ka!67k<2b6z4Y?;qsys z{j?TgOS+io<#=69BmB>7?Grq-={I^l`}7dngK08 z7Sb+B-(tfye`K%d#{3@{NCT zc~g(QUG#tH9R$9(=1|A0Cn~12bFOJA)aL732^^R%E0)3v9Jew}HKtny94}~@ZD8pf zq-$7qVjFupWVzQsmVGJdja7M#s{UEBbc^8yzHV27ccW%b{0(~?s0`2Jl{slPAH!4~ zoIprr)LK0H@5^}eZb{*0`5#!cUxts;W&C5@&P-XL-Bl zwXduFFtgwcK}*%(?8#Dt`c1!iYJYQ)>TUo7gx_xV_w!%s9$~ku=u3b7-XKK+NCz3m zfU{ORri|~C;33tvl%p9COU)>YI)7}m)=X8hH+$ixn5hIOiPKcpj6uJ*uknjdeM0)$Vd4`5=T zq1xo|7J7AO!~^7iXAb>$pXOf^&e*=})f8qG?bqqIcAeH}+^@6-?ZK8IUlrHQK2++q z*L=Ez`$3EVmSO@>@}cDWK>_*{aq9pw28Jh@ph69 zHoKzJ$1hTo?~u=AT+X7<;0ZuQelb|O+oC-3H$Wzp3SF1#{!%2Rel-P*ryH;x}1BV20czCiiZ zq0R{ZzKIb@jX&kUlB1SIKWhq&zb0c2-TfEOF8_+^}F}FC{!WdujmX;$0}!mzkc3cFhP* zyCbeQa1uyBZ68I9a>BPb^A9$cvWL%K3``*YDC2edKi!Si$t~j-riyGX0Qwr0L!p1h?DJEtbuV}!5O=!adjBPY4ee|TN-7i**CUwR`9;ZV5V*7_2cvGr4B^XDAz ztg+eTp`!*lHJoad@;8Dao5=Mn=0YzXz!m|k0{KtO9=*d1okblTR&=8RD}wu#-%}zA zfVL$qE;cSZGyk+!N6^zzk0;Ni#zR+o*TYJq-Agt+fO?>?MS_P;*{n!Oc>>rGKDT98 zTdi7nYlhfBHtqkEkPZO;t@Ug<@dMG<)Dve{wYIW3`Biql&nqVg^EY-IWe-TsC%@rT z<|gIsrAEf0w!zNW~gW8~eN81>t5>8Ks7_Uuh|_RyA9661da zhzu$FdjYz?rk8OFT5ix#S2gn=JIXcd^6pTwRFD~Sdeg6Oi1w& zlma71_F>@nmHbA9PkVGe54qZ5ouJ{0x+r`N;C;^<5#Qjekok(tcD83K(pD=RP7`6K zTMV-6MpWX>z!f--o8q9u{27iC^Vga_C2p+a^N99$mnqdR=f{cRNtQCw6+}pqkii#K zE664xV=2mBB6#z@t2Qex{*psw)2ei=7V9>l798?Jyck+JQ63Dg)F@FV1ea-q13bPx z8a`2rpL-v9jEN2ZX~3MPOJtnlp_Ed72OcTfsjd6RO#NU;P}YI4)Dz@VjDjQe&?@Vsn_rD_qYa&DrE~?eQ(gku@ z&by_}JKwU(j6rk_P#&-xuOH4|tOr0lLrwUyy(~uW)qrIU(WqmAjHVI38UENp>QB2V zjzO^;??i$aofyVMIg9$-tNXpvMf!{E4CEQ_?HB)KRG)CYzxD7DNItS%dO$IC^BR25 ze4*^S#7CN$8nG4;T%u$>Cd!f@uZ@BV&)x*RN@9wf8wYfFu0_?X z$u|Om;znu~n=7}sRyI|vuT)unW?NeXsZk|?$z3I9gJuV@~(c}soPH|LI>DU>mIPh z9cSlpLG)R6*8EHm!m|df>CVoDJ1;MsC2@ng%Wk&mx~QpPYFO z;FkLDW=ChQkI8?^&IX;2m5@sNaejD}9-wdAEjz=>wZ33wQMkQU(dTe5nclND{ix%- zrMvUsJUF)?{$f}|^^y|3{T?&4GCMQqb-$MxaeFlCks^Xq_Vt$v}El~){L9#vS zxZhrjL4v+v!!jJ!*CMKCtMyAS?n3t_AWCw!QfF@#A4h9^Vxcv726JZVE7^U@ZHNWv z9SnE_Ss(0A>pB3%+#Jyrh_wuP)4161v>asG78`nXE?=QmFes=SQ| z)DxNwj#0(@^EXwbMc@>Vw#IBHB)de$(|yWQi1Hqt`}Sfs)1Dpr$arl9z2klLIi0Vv zI@)CNB0}d^1)e>j@{IUJv>}oJu8Fg%YCx4jtM*@Yj#sr;WC= zDK5%OpWDlrt67M-J)o*x9@bWW#= z;tT{78<*pHI#$vV`Q6U(4!j5>-?NQDOKd2Sv-6}D} zq=({t&P|C`)SL0|RKdS2oPTS08R9pZYC}&El7aPI_mJbBN}(h(+v{98=QBaesz&`l zxyFeyc(M;^E>e+5IXw>aW#uwu&>6_ka(p_*l8ki*>Sk4A zM-b5>$a+*z5%RK?+g(Veq%q-KK(r=!r?DU%lp(5pFUoF&BO>2+){m;R^ul%h=TI-- z3`+#gkhrwjLv2iQj47#f`v;Az!IciNswOKn_J#Jd$Mj7MPfFX)Ofy6FF6{0n!mxy|a4xivd zDMib-f9oaymzlha{89O>_k`FHWmHium7O--8{5#$txo`S*Vy=eO;OE_<1@)! zhV!UnFzyEi`*w@C+Wm((A-Rey<+&5 zHDLRHs>~M_)W4V%o6|Sn$f`zWp@rL~L!*14~1FWKEtV#X@>QGhZo3VBFk^ z)G?bn1PCte;XmS$->NbK+#(9|Iq&%Gvg^UU!U~S^+k`}b{w zyhniMR(ZN|_Z}&NMwwi!K#I8oVPSZWT-}!NCb%PtEW+q_ z`HlNz_g*DM9xPs;1M;|k#C5a7H&-`yJ;(K7HEps!TRm7z92}PFz-|2C*Z;`9y)|2l zi8^uL@^J3g2S1Zem%^{bu}=Tk2Ttx+>YRTxOy0gOL-q@fXuE_(b@{mMyg9^(9CGez zuBQkx!ClW_DM~iQd(yWPUv;0CjIGKOw*y;Aq(dB`)gkD=%5v>OcUfbTnQAF-Hg!kHTKNQRH6CMg7uGdd7bGEkXiQg*G8u7j zZ!08RCyTAVnBmCZ6r5}+)eiY~rx4`nnGh1CtM>i-n3A6{D`T7*8y>e+u6z{ z9>|`1GWO7|b^oqUt3WVb9dSg;iB5VzkY_Q|PQz=5gFG-&LD`jcO&W3Ec$dlHKDqno z&)o~5vHuAdFh53jMQ(%zR$>xhyCt8EbW|;ocP*J)a(KI6M*%36F!a@>~LO|h*vya_PUY0m2RCd^Rfp8eCRg}=NYX+LQu$s zqZ6rWHW7?K=;5x6mNkRM@mv0xN6F!3&)Q5mw`PK|D*$(;B#jQ{+?I$?sHCV|3Rr1+ z02Q?u-K(tJK_1=wa%=PBaCz?NSWERpm5L?m>Kwc2n_0?0|HQ6>WbpeWo3B?9+GkCM zNqYod@}S-vg?5uw64KwZKQAy$9Fk0W8y{${yL-8iv^_#Y`=8m)*!`K=;BqY1wj=qA z_PTg9o3n=GGpfZ|j&&fidR=%CUqTWuVy93X>*;1jPjc11ZoVhIU83A8$pp4Z-zV9o zU4;L?2S*WLd1a(UL4&KRzJ{hYEu^pTH9c0dYb4Q)PPQvlPb0{I{kQEf`ZI&)j zpi-zrc3T) z0tC&6J}0xLgZ}*CI%P@z7atSdEFYu_R_L@z=AwA3p4Lq5)4Akzuh<~-=sBBulKF^{ z?$I9)zPvjD`Ue(}dXbKD7Af@4Hs5*o`M}KRN=OttgM7)7A4VhBR%QFvtBn^Sm0#f~ z?9u8JWTUWd0)q;I0{)Nao7W?KL+SlN;d2(I0jc7Z1l>^#L@lD zv^>uB?bm)Ko;NU@91xovf3>bAcge$yLzI3Zfqz6oeQJ|ubP-3(I}ntLB=D_B60it- zgNt@}oXbsL;;Gx9eNhSs-csZx97qqhj}5{Bpre^PwUz(qALwE}TX5!YG!@`Oi&8^A zp27z`fS&KT?Edu`EHq<}@F-LJ_N7>)NK66}dm%DPAe|WMAp`4vbKwCYGBaMZfJD?v zL_nFPi1`hd{#**ZF$0l4Z!ZLfkI_k9O6f|tLLVH2aJ(RxlB>8CP{CsJ;NNUK_V zpWVjG1-=y4cnf}dMnKvn5G%a#I+&k`DUBvH?b|P|CDMB{=9S2s&nq4K%cJ{J<3R;y z#BKA(Lpc!Y2V{3ra89t7#OgWD%O^UwFn34hQ@4je!`of zcNq?R{N9*!_L(bjo~`NEP{vScZxrplKua`H2^`X@SAdu|$^t0<3_Uwe79g*+D#0Jc z>R9!-bj%X!H!!K*?(mkc4dt`^d8bKu=EJIKCy$_1pmopQ~2#kNeBwe%~ooeyM?`1EpDP5620EHE7a|jf*!5MRuS5DXh98 z4e4JQ)1GMbjFGN{BV<-2jbk+8RvJ7VtGdV?y+2cZn$Zu%RalQkJ9dt3wm&OE4LICY z;F?1+<7sS@fy6RK5+AktY3v7J7{@hi{*PUWG!(|%M2H<^!BB0_@TZt|H(PpA=`T3z zttf|H`Ek^aKfCZ@*!3oLSBLsvX2-EKM&c+f( z?zINNZ-IY%_G3)}FqpQ8kw%>16g@Z*5i6D|rX54P`()G@euUM7Ne>=x%->$-tjkAJ zw&|3-Rj>6V_84~QQitc1rnugvz)6$Wg0s-u>)Cn)De&XnH=u|9xXM4$ut9QR@Q3lj zWp|p*wY+bY05|sBvd^jnTPeI@0s#K*M4+q_=ItrIWw3TY*rO~?;FZoDHqnM7estq` z-DS8P;cHo(Z(o8=%@oTkQ_i*sB1j~wv$nNW0}_>cd7?4A9cUx5A3F)Nc^NzHm`^~p z$do-3^u%N*nNcI+&$6$U1VmfQvInkrWjJ)TH|;xlS-#=bfa#XMQ|@dU#V+L0K+2ej z73`$N#`B738%y|rOXi#W^Y|Cu+)mxNdH-PLdqqq08T|C*41V6%k(K@uPSM{|mmUyY zZ-z{E*VmB8Z~Q(`RCS~90k0PB0zQ!wNh~RIpBDAAI1#hn{nI+7U6g(0qM*u)p6q04 zO2ooh_@Qj`qf{0N(PiJnfr5xZiSgPiWfLt)!LD}5FnTrrs6*FX9Hp$a)7w@c6VQYb zpKb#Rd%5SwtE^0Q1BS~H{(wYQSn^Ue_ftnE5T4A?Esy7{q;%jqI(B-3QO53So|@Uj%$$j{P$c~YgaSy=(NI!g+ZUB z>S^g7yAGo7cdfNAoe1HU>IV8%FEohJnBq|Eo&57(u4iW?Vl%s4Z7SVbhODw0-aT>| z1WxYDMM7PW;da)#Q^0jyoOdsDveqnzSlU3LFXXA(ty{+(k`P0Ag{a~cX^t$H zfqrSNN00Cv0;f?Jqw^cXG<1E&injOH6iW+ntB^I`4ENxLcq&#j#V7p!b~B4@nTk56 zgDV-4cb96*q=F}+dW0X|Jdnwo9Z1}>pd!2jQx>F$j?u8;i)v`U@JOO)5H=Y&II-4R zku^=>>{xDp1RPU-dZhseoR=SAe+~8N_j;FO=i@CP_?xBK`RuRzes;D7y|!90v|s5> z2#){f7i6^KO-XM0=v%`8zffDc`U8bLTZ9!ygj}eHRbU+FHUtHJjqRf4g9RSsD6uRQ;E}*Vm{1Ju$kQ5&%ICcV%Ql)0ED&_AHQ(Zs z6FF4YGAY(SanBpo8to7l#VMO(I1Cm%a0>of>lE+wV_|eNFgf;0UYhU3k$Gu*Yn>sj zqA}jSSq%IuI#8u{FKVl2dTV3r_E43BsH6J9v50C#9kdT){SWzlXIC2W*MKQw#MH~a zQ!~aG_`{U1-Cy`^OA3FjHH8SV=&xLC-G!{*lsNN0t8gSD@Io%so#E_yje#`Pm7vcJ z=F?u8spit8sRA4~S+fU!1R_LwD=o4uzox!~M zU%ltJE$V^xYSGzLw1efFW2C?;p(l0^A;*XvZ+L^Ovgbgj)ylzP7mrHui>o3%S2}#g zcO7Jsf@UjP{g!#^PTHZ9^&x3)KvB$ovo3{<`sCo!&5qX+@{5)g*5h!%i-Y?}trvO`Wz zWJNK|A@C_3ZX2&?`#W_y17OPHI8FuVmj~`3tp#&Dd=G#u(ern`E$_DT$o2n|hNx0= z4nq4Df({wO_V~)EN$Tg6c!?f-GAR|aH&hWoJLV=i$=G_X>iJC)&s}uCChg@X2K7*% zm~Q;w9nE$?j8go^_V%Da2NmFw(pNgYa;#uKTA=F6GEEQ4PQ+nKTPG8p52`V7Xsb5? zCkf^dyxl+zRgFn$)tiFi&-c%yXoL_lsQas9Pvf&l4LJjy$w(&*YOXa@DHABB3Kt9Y zXh%-y{7Pk>GzNvk5ysqNsfR%H`6SQN6Q%uTBcp-AA5UIr(_w=#&-dI{755R=UNW!> zx8E-&bd|R+j(yZbW-f)uMc;JsVEFTm>OQ-3Xcg*qPvp&8+eXrihvxwVEXysYXCxw# z7A1UemHm}Ac{s?GBXwbAETL=T(v+rdKLA1l^rG3GwydlBsRo&O|WlLO^0k;J-oUKi5ZsUH<)f;aTXXt_5H$0iaf1^S|4> zu{UO>HdmCfZctk7Bajf@wX?m33E;2 zdDhqHd<--_yBht2gmp>l2juOx9|6_b#|t4zFPc!>B}=lNvtJ=P@i5{-`CjYeoz6S4 z>z7=A4QWb;5}O~t$%;BSW-D+55Q17;l;D5Jp1@wW(ZUdiJ;c6Gtbi@VDW81~Pj{I^ z`s^rO-|i)Wl``8ERvg$Q*Y2MS0Cp9;(Mz081g6^=`2CNlki`}@ZBb`>pyWhcycS`? z&{95$Qur-VBP?mj8Lb1-I>iB$W4O!y5W&e51Vpf~;A<-Lvq#e5B^2TB{fBvFJC9kU zy-NgW^+1h?C}n`!5tZLxcP5iK=zg`qF5OyG1n0g6=?}~P?OtlxV(#%O#MeJt=oF2P z@+9Ar@f(<7yRg4FsM`J%`BtVOmnp4KDH;)*J(B`l<3Nf1u1zA(%ks{L6b>oo*}`cT z2z{gDRjEsLqZ!r)ZZs`%3-IycSXpsBwhz*IJ5DVB%~q?_iWYVhoqoOA%iBNG@eL~u z^Dw@e*i&mqFnpK1gwgIGiMJXr<^S1jyzAM$zL|)ur|M))G5{5c;Df>(S)_!A zw5I{f6o_|h?7;gtmMLoN-sblcqn=LMw=xu+mg;6_b4N8Ex1cBV4CasX9?r__Xdy5E zDn2Or)gC>}NsX1VU!N;PZg<~Rdt6LPI>2~0?4O7Dwew37Zm_kCWT$u`os`DRn}F&k zNq;%D7(l{h#FFCMO=`5x!p%6j2oc$&vFd>#o$u%63mEi)+ub6(jp&@s03O>TgB zWRn9n=iC?Xr}4)_F~r<@R(EHUszcuPJ&ByDlw%a-!zDW~K}D`oK`UvqUXKuAliiVKhM}D|pLR zxnCy>z-4>^NLq`uw962CfH8kRpZg?(6Rucgd`Uikc;G}SOtG*=3nm{l{4w|ZyqK;P z9LHw!c2bW)aTsrxE6QYQ2W#Ygi-55-WDNE< z`-*{_pWqv+9#rL{YhaKG;W^Xchi+r%>`F)PcxqBG*Iznh`fA&wmm0n{cVqWgm*?_D zlDambaxP)9n^p2}l}^_Gf~bV#IV(RK!O(i;afrDW9A9V?jFyB9e%Nsb=Kn72%5w? z`yKr8pJOX_FL>*Uu}9kD^mID$x=1NHZl?|qd9QqJbf~)$;9A_=ef#tm>ONt=k=Mp} z5`)EL38l5piag4Q zecU@COrNBydS1OUb$Jl#FbT$ACCm*BnFc6VwZBOaIN9H!kRM?h=?42TrgP;s(0+i+ z#E#PTsWE`wK1vLFD@o&@rqPclj|)8D#Maz>{^G@$j~H+I%-){hJ^XlbLV>r%2;q@i z#r;nHkTrUeObVgrp}H{d#Ao2tPe|rUb&Vvd1X@2WcIf~5?j-2Eb~tK>*Vlud>Mwh| z#;XWovh`c#K`~lJxcS-oEn5Dt&na6>>nvR6pr`1EnM(N-c7Fo)hjqXdjPbtaN0@%U zHeI1Idh=ZgOcXU$wSMoVY4;B;;9!ZOTv{?_DY_Q?z-HT`X*mnV_{LpO)g5 zxhEuNfi;>O)MR-*59EQs){gdIPn|3}&g_G-i%ZI&%T$*^@zN#!=cR;k)4YcYbnJ4_ zh|$VrxcQ1}?ob+iA83CQiXi+=&2OOPK>?}^z%Ta9z&o!@SrV_68N*J=!hA1x&s-)y zr^m4WHT6z2SQGOtlV_!tV&<|fRTzb%dTIQ&kxMF^1uWR8H?s3*)0tv6YM`ES;ei!t z&W{(MQcV6z6pc$w&_=?d8hk!DjwleGev(n*rHnS4hl+D?1ls-kxU*f2gFM-lH-gs3 zp~cwl*Ks|;C+@g;a-gjw^$anP$5}G=mFn3`qnqYdDM$xCdHf4DegIG-6~?*K%TX)V z$^c@Jnd-Is)u`nS_?VrCjXjLH z9Hce`jB2hpbKkapqw|x3XW%W0crH08dBVDu_YqMQVGj!z{v3}$7gp?zwtP5)$ID6w zhJ;P(oa^|KrUKoAEp0mU&&j7z8s2K(UinUR87DHZU->@P79kLE*xiInNXdvF|U?&+Ny`)kU2eSKFmE9(8urzW;ONMnljO zp)8+MH_b)9@imTz+Kzgqa}#`9eaws_si(%jpY)^qHx;7F!k3%M(UVq?hD_FF2q~K` zyCR>dj(yI-tzh4Y#M(k_bnHVZ@u9%!AE^f=Bg5?}BK11mDIckvQI7ZHN@!lUdh)f2y7TcsDAx2X2+*La5quBNoSOL=>qh2wYAo%v@I z_pmf#nFL$8@zN;WS!Pt+h-fb=;a+Rk1vf{M0`(8GSM|`Awn$rMyW~3K`z-vQ52!2W zCQu2JJ{_NP28b4k71v4;Ln=f74KuZ74oJj@VB`vBb#oXFu^CTDH{Lfl%51s34eff> zZpjS7_1_Orm#PBx9694Jkjeg%sCmb!bGDT}-yKA@(OphAU4W6lQ2YoDS}wz-wbVkx z0Kbm>^Zfuw)V~>Fe&aGhHCVsW=9z2($`2fqYJKT4G(9ODAySgipH6{8zxTqsNFA9% z5T^}03hN_We|o58bnc>XlcPQ$86urR1>-Z}lKpKKNtT4N{)F@wzMaYWoVFB=Kw)`n zeb^(1;HG_L%5>gF3P|~zR=MmyvC{SN>wDMWHTc<=sI^pXHSZNF=)VnJOrwUp z)UQso!^_Br&H-@@l*#vo74>B?g!^E|%xKN`NQUlS z5;_BW=S`d?AG0Gr)GDB&y6Pm3o(!2wo=d{Vc)Xei-|{k}&jz)G?1&Z+j(e^!r^653 zrK^(PzXnsFZYt*08&m(uUI+(>wPlT@&J<)X6@%RT7{mTL0?vdzez4rx%UdP`djFlZ z`$Z$o7vAn{ac`~Tt5t-nI_B);RpQCVt0qKle%7#J)mI5j9aMdP4dQ|>R8N!d4?Oc- zpZU!nT{}h>W>=#n9De{v)a^I zX?$lgn=zpshhnIHPy$_S;mfpz2v+IS(61wQ>%!tQaUN^{0m=JrO^X(uqH@&{^}tl< z*Q=+COvZEHJZ7Lv-riB!06s`s6mM^1Xv9rtz7TeE;olhWIn4AzD=j-Vv6jKe$Xdb| zwfC1MvlYG=z}wC5zCwn*QuyKt-H$p3Vt1oYYbyXHQG`T9ST-f(VM|b9$EU(E?^pW( zUcX);Ti~cIf=Jw$`2EM^F02~>nUnx0F?c0CHvckAwh83}RGu2h9ko-zIiY?T3M_P| zLsG>7U%)zJNO4>opkEX~wp9%mh1GMNc%x!krw}o6F=FptLFBKpj%(6S6|WTD2!z4A zB~7F+1OEZ}L`cy21>O1Xq+ez_j?xU3sr%h3s`YRro75HZQqQH9?yOiiZJ6FJ)}5+K zd!~oAjy$aGow>8d3jPQ|p8O&Trr~V-W%E3Cs{KwK)$2f{K}`l>&69OFWVezjIjp$8 zaSbB!*+bvDhESmu^Ssc|q)BySW*0r<-Hf>Av`PQ!>2irpc-+ zgl|86s$;e_qKXq_UJzOcp-xmE5AK^cpiS?9e%iM!yt?Oq z)h8_N^Fue~aO|PFv)87Nd_X2|`JP9v1COX6c)^2{QnQ?Eh$r=^6x}FDgFqwHeqP;J z)|$GgyV5*;YSdu9yW+@3Y_jIsg8l}!V+ZPWwqJhiUTMvN6YtJTp9l2EMZ#$%D(uPY zzb|O1;N$F&1*+}x(ine_N7VQ^Y4SBmX+)`{huV9%S*!M!ln63bH zX!1^H;P|^Y$*9;z8pkpXS3!-8m%z9J!)KWCocD;uQRK(>NQ`SGO8)`}-8kf>kf`Xw zQS47}aw_s=yBZiNSNy1eK|+lWL$X8^5`n@K6$YyHbmC{vGr$7 zdlTkxa$X&axNbBw@CWxEam_?@yGTtFA%GhiUjX+{u-B`0b*FX#Se__m7u2fF!vgfX zJ#ybaco)>O46W zu5i!;-jFG@ZMzZB4(v31A|S~el@abTkH7~#)?_BViy%2G=vJ1zuP_+iK7+*{d3YW# ze5p_=b7%y*gQ!rZ_AnIF5zj{$yto&B*fOn3AWf~=Z-~c?tMvQ&w1;Ni^K_>qWR0xE z*$?4Q~&^mcvxe{adg;@L7EEgX7NGv(|^qC-U-&8^o6;BVgya z`5q_UcE{%k@v0%c?#iM+MBQVOu0635t-6u)`hxC-NXwmvRtx-GNN?(SQ4XpC^d*d; z$Er?<_KwzgF{_My-s$Dp93Rj> z6IleA>jGppIb)rOoEFo7*igcybPS3nqEMZtxRmw0hHygXJXJ02P}S|`r&`;yBxyE( zmbcVSUW9r(W72%CcKmn^=8t%y=oZu2^o2=)SZ`Nx&VbV{z@H1e(EUgfiNASYt1bU= zfHb7j@9F{J{Xaw6&WK9u4D2mka`fH3A8>xd8(sH|x7?F?9rkD+g-|aKQdo~G0t9F< zll5@hfNnyGRRE(gmz@-(5Ah>>SSg_Z{!p*78r}hrFj!7~ zYa;9{F)^WC{l{;FOIcOcxCR3dY(2F88~Sb?2zs;0&bw9pT4h{}%O22C#8h`B?hoNq z1dKf;bB^|n1MX|kW9GZX;B@X3TrCXFu(j$IHidV2j(1)MMI>)_R(E7uL!B^oltSw> zS;ovEukzNZEMIy=m$)s!g+-J=CE?qZcbnILJ+LG6u=`X@U6T-Sm>77xcq;l=FIB#lI&nx-E0=C-+<^ipg2(I2Ybj zVFMWkpBOi1CnI2wg&}?@09Lh;9CC-~S|$tcyi8M-U}lSWCHPJe0&IKp0rA-Zg6xuT zOVqn-POvZj>^n1xkYTuF2%7#GRc^~Ltwf+(LL|J;4uF>)>P?o=lY(0)FbLJow?Bis zREC{PAYiuJN)Gp_fWr+hsYpoe`+DuYgZ`-)h{MU(z*L}3&2zn~lP^*E!-J}>v-p8S zdtZ}Z7WLR(To~~IeR&z}28x4|cq`aK4q((nKfq0hjY;b7n1!Swfh(*u z=HW(b@HZCrktXVN83nGEaE7&$>n=HtjBPh2bLNM`Z^ky6LsEjnlI4ndkLDGp+`HXf z6arYoq}#uN`=Cu$npv@NXvGb?-|p+_TesQHY1T zfE1T;Ml2*F-s9g(!9GNI7%sLIb$ia1WMO=`XM*i-nisc`x1Kep^Qt`8_H@WnZBHmQ zU4V#sKqQ?9Nc(`(o!Q2wJ|GB;4nz9)Qdg89wk5q(iaFs4;GlNRjedN*st5V0QDk*= zmA*=eUK5gf(}uoUFV84mV|+l`ZC8Xye;u_JFV>whpd5C==^6Rd8+b|FKOhcA@NMR~ zo`~e}QRokEit$?#_&=Qx{R9T}e)W^YkZXXLQ0_wVJ;q66g}mg5a;xq7jLB6G-aGN{ zc!tTea8G~D$M-;Vb2hPI&D=0=X$QGV^ER6>cwb8q5&}2X9EusTC35i zPzv+;&2$XX)!PZ$q_!uWb!iaynC|h~S;BSN&>=#89=Dh=J@6JmS7q7K95`oK*CkGJ ziF5t*?)eLq!=I9~l>XHG4E$N6YCFV3dyN0THw!#|=DO9XrfW^h%v0Z*o!3P53`Qei z$NC9xEb6~ITU1r-`UJ#~=H2xrF!ZgIj7QU^ur`@V)wfdI$1jdx&y6@H3GB-}Cfd4` zmeO;D?hU~+g4x=17M#a+VnJ-jFo4{lHldgw0dUTk~^4`#^&Fd2|IkW>ei$pV1Uwys! zO?aO=#fKOu`(ZvWLY_N8vt9FaT51Q_Ow&>^OY9uT;~MB5yW-uWWNT3u{5jM#vGGi- z@4dWYOOfITnBUk6>LRfy85*tj6o(AXj&aAmkU1Ot%ZNAoGcSAfIKs!J8N3!U<4f9` zVtyC@=IilNW-9W|w>!Y+Jw~v1&bLrCGNn5PVLmPQRebAK(%`Os@6PD~X~1!{(u*L1 z($bnwW=fUa*}Rem?z{cF-{JDh>?{vS``cPZ8bVFIm0n+4D~1#~Xu)N*q}~0`Pt|kT z&bR0ZPo^ry*KZx7Mn!L-M0&cP!x> z1?KjZMliPXE)Ht7`Y*}v{~cTTcg&r3oj5>WmL%+foXxrcyqpZdslIJP+~z(K1FjZx zGs%lt@HL>`G=LUX30RV={bctB7ZreWUxhef=h}o`hAd%kb*$b@`#9rqHI5Qrat9lm zp6>)VBuD^$775mOyJwkf4QAEb^B@t$!6`uH?w_*cIbt*ZXbYNG4D{_J<|mGp#~~F5 zMG6zS{J4MaYJ`7`>q}QGfRNJkdm64rSKs9wQUCl0e2`7mqylnM0m$6jqQR6Y00c*K zz^;6h$?W&|sSTV>V~vxqyF%JHPCYd2N|T@LFNwT*tlj5F@$H7}j2-yH4w4}Dq>1nC)!h|=mPH-?+j}~sW4kIjo_sUj#Xg;~cFY+xb;}D2 zDsMfu9rOi!_toYo4NqTbYpjulgT#yUMZ6vd=>ttj;^C*CLoSom-%VdPA!B!6p!;RT z8?Rekjnl9(ziBFV-Rdca@EBZ}(nAyJt*>eKu09FSjavD2-KtMWseKK~tKS8|Yw8fN zgR^}9**h>We9Jkux6HI=VWanSmr;P?O9m_M|43oAx|h*H^EZ=@v;^peUb zi~$wm)SONyJMb!(f3SxlkE1A)wP;ZV*b}tcl&N)LtmSrpdwu6TFMbzkfo#0kEJ zkGb*x+VbETX!PVjNubW;z-9TDLh>-$cK~%YH@UlXZojaqs`Pn)Gw#puk-)Xf7BmV- zt9PK|0W4L!Iw@D;5MXA^{ze*eQH1Kp_SG%Lv%DCWzpR%jNhhGbd*0IffXQX5V|WD$ z?2$6dBll;ht~H9d(zbo4*ZNs4)ppWB+o2;BrC`DfA*Sb^#wuP=z15;=Z=MdQqXHud z>W9daAAP=WlK>kKn3ui5(2)NBwW+)p|07yn7cMm;Lz@V}KENGm? z8dy^U$hu{M{l7B6RP$zdVGhpH>IN)T!8m;F*U3R}jOcyT*r`Z5AmH*qm|4Xcsjf(? zD-Z0Q*z{JCJlUFa^wy9cZ^h^8$o;QYR=e6t7CppUBznSKXfIu%m<8C(4k4&88GMnS zPcy%#>VYTdW3sd8jB0~e=9{A?5gY!^8Adl()Ay@5T-M*jC#9ate zJd_LzKhOto%*L^MdlQ)Kg#0Ri4&y5#avF9pSG#yS+#{f4~yO2y@=r}_!v**H-Z95+M5cLl|O0$%Tc zDG!Z3^HXP0ZI{n&i8cnQ8q(l8j@(W~a+4ze&j6yz21_x)*RqQ{+P|=HdS-A7!naZj z^p>kpYu)?U7+=atszNDN;If^DKT$CWV;)2L_G&KQPeaa+EmMYwjc3?tMA-R$1`H|t z)7Aj<5Qg!Do>OttRUZj3{*_u+Uk1NZ@Qlx<^U;-b^@u7vY9%i#9?xytW~b8*)Ey^* zjhbB?kJ(SVoCWTA<4o1?VU2|O4NGRvmu1}00g)Is%;t)gk%zvT@LJgkK@I!Ti5J!q zwy_9@h&}I`A3qwtuO)tDSR7^-JSMsa$78iNICD+IcWNa)7$MIfx%OJ8-US*oT9cUCV>CpJUnpmAyxsqY=W+ZWFlvjtT;chAG1J1V2XF|7FJ1Cm#!NdHV? zY$W^26=lDfmZ&4s11(8D1yRSjIkxZ>Tt1y=Yteg~=B1P|gSWhH)aB0}VkU+>kO}E$ zY<%y35D+?j8zu=j+BW6`xy{^!&i6F^rHyv+^k7kVl;t~O_SaR`H_neUXU|X0%$v4#>yX|W{UjBMyC*G-uve%w+>yHzL#G@Q7 z`Zf-8e1H8e>zY@O*Z81zB=m+s!&S$E;jp*oqHG%dcHb{FtC!lTm*)yJWc6$<2j9*S zd%t{)8QXzJ0B*se+^11Or10nB7-2v@U0AzAcO0(7LDiCe zK|(F{C4$#v#wR^8Gj;B`fh6W3c1v)21OSThj0^r3k3fZut>4UOIZZOE1xQKaW8h_p z++AVjNXg2Y;)2i$@bHq(U%Pu_6pj~$k@Y^;9gmZ{10ODUPWNsw*K`Xp<7{u1I&GrFopv+0%`)YgPS!G?Rc8H|`!z{mrV0|Z09weKz%+;;i zpG23aQ}~*pX*6q_Fgn1kp>s>B;`$Suj2><;BmeflSp_UegYBYx-@bO@EW*ASDAYU4 z5(jYVz=PV*AC&-8hqoeOx8M(k?G-*^iKj$Q#ZY^-q#v43`}Qewrve*mL$h1U5sI0B zZFddx`|a?|Bj_7_rkv!_X3gL4oa)h2bagLw>f(H7rf(Zy_FjoFQ>KbcI7B^xCRqi`6V<> zWKWst{xkXEf}qRv>_YCFLe&<%C7sOY?_8R;-)zSE0MD!oiT8xQQtJ39CHlgK-g%am zY6`p(?e~vL&6s|t+KPf%Ftc%R&Ur`5+Jx0@6 zItBta=zJ&R!~rszxtA8m66&;4!w=0?b9}x9PQHQE+z{ik#K*UkA{o>$S4k;exhkpj zugw=NM$P_QajIhI&7!m2bzVi`_og}l0QBM!humVvpa~AfEL=27qbOaJmUR0eU){Tt znPBLX$%r@UoNnuvF#v)KyNm878Im~xYPowdng<|76>Pkg>G6z@#R z9UvM4#;xSXL;g$Oa{+n7g?K=NV#*TI-|^hjvjyy3?_5(Ik8(AarDX!v$HrpRc1 z8(k;nB`T>daC05EH|AOZrv31fM@D&8yb|~L+Vw~o&`hY#*AZz#dB^GcI~t8Itc77} zlc(y=S&D_j(>MNnl7)+X2fD=6kJ0`=*1&#$T52b87;g*8wY5s%F7cgMQ2IVMp)K13 zGCk8$eyg$7Z?1E^#06aMXdi0rLbNbOCBRs}TJV!eryf`u#BbB{z~nrB*g! z;6#i4TyUus?6;>FH?7!gA@n`i?}aYBO+ql4ceOC>{STOYVCU$|f?(Aro`aG2pfqt3x988hf9<9<-9=#i@1G&y(xGuu_w87Kk|S@o|MS1%sQO;> z`esj2NxOpAz;smkV?Ul6fAw?%9an-L*0Cj9WiO&INF{sr-Gnms zvCh~hSq6i_V2m;Rp6UC(@AdoZ=_=Qi&-0w+KKD7Fa|5wKwfM2I4KJb1ahr+QY|9<^ znRE;F);BE0C~?l0Bb@crjI;3@DYDnath_m4X#X;I7nGYdif1{(TDt?#Op=-39dQdw z#HPsgS*-Z!T0HEi(S4ZaU9<)?KxzY5x9W7K6GFbdvDz_=!DC3Di}h{{Zx-~>x+!zY z{;T~Fnfji70O9MKP2#(c(!<<)2V}-L3CsVDUjGInz4J0j)fTlc6-@&c z|4|J~B8@tyEon6V_$kyi8y50U3w$2{&w-3KQ4b#b0bE7 za-TPc6xp|q)^*ms9Z#(-?f_56U#}pq9RHg9_tMrfef>?I7d%l8Nz{Jn=*E^OU-9iM za#$PAJ>D9tu5G_zCK@4LeE@|^b1`mUCzQ0G2i)x3mk3=vWVd*~<&GY)3tbFColr5a zKtJf8ONj>7!G|pWu;f{lo1WC2TQvWsbwwEB-E_U)=V|&ikAxQq{@ui7M1eI44&2dD zH$`>T6vMt8WHJ`jzk~G#Mup=0Tn^_$P%G-!HU+Nb4c17%>ZE4N&A&>&nLjj6B*cYQ zDhz$3*5y(E;r809Q6Q}ayqd&^O(~aO((Jgw<@J85ysX^w>Mt6!b@L@0; zys_bAV1Yzq(LN;$bLM44=)2|Kp?hk8Aq_x%bP}V3;t#A&?Ul}D{`R$SR>92^9lGYGR z+eZ!=m~OYsH=b$Omy8*>u=gJCe%R|d|U_hogb-u z1}0F87r7^^YzI<$f;hPHzOO^)SI^1N{Sjvb%Yj83_o`*4(e zoO1$rL5YAK#b-Fl_6L{;(LFvXsNj!m|W6%$H8mVude;!86bGvGKC7{lTHyF z-H?%W>=uC?KS|7YPq^+T=k2&+tIX+R{iPQ;XeR6^{?-F!l={MAIj{)r-jl)Q>U;oO zUmg;2n83=BZpHj|N$9Kpdw?J*3MY=_MMwy@E_(SiwoGN0?4~A^IH+!_zOYnTY=(tt zo4Iujn$>?SrOO|SFWj)XLigJ#CD3U(^g%L-;p7|f2hTtmmCvQ&#qvNgyEXLl2XuRZ zN2?S`tVHyExRK3s{|}Km1Mq^K-x>LjQOuf`mo}P1ULMK(BHXwoso{?sPL|HP7Q_(H zwZv5(sw>bK=qkG}vLHXy^T2;s=E}9nihlHm%!CBT^&&%gnC`lrK;vkO?z0EddD@T3 zfEbCSu)Z##<`W|VCj2YY3aBs+`}0$*rp>r{=IRn!w3KRQ05D3Hsk@n%laRw!9nd5= zoV?I91_E4vjsNZmdY9p=?*H5d`|8+`Q!i^FJSXtwn&sCxdTmq1&2oxFp8kG3cABoP z+K#v7lvY0{Ub6M+iO=0j9~IX|KV%l%5h83YJ(Nh0v48VzEd> zwP4h`n0T|!@+dnVrPL<6soXFvK!39qz8B{393_Zs; zJOTv6(mmYsr#m^oFy`oi%;yH9-6i)fKYtKI*t@z|RBPoB5l{@K}&y2~}Ac#wG$ z+$0RR!($6_4zsGf8QVc{EH{8WIfb^orZNHC+Dzg;a{@Eo>Zw=N!883N>w;s_S2m8T znDa7iC#Ny5PR8NB`OH;gQNNGzv0Y*uSWJ%-@XAy{oSK7UXfj!RZm-tk3Jv?0I2NXm zkm)LA?H`iUDH#nfHF&?itFfC&Ax%Wl5egCF-jEp)9Q9D`8 z`A*ymow|OuA&r5x}mzt_>LU{v;Pxfnk;1i2VYBSpY$0q?4&pd=$ zlH-ro=J35uAH;gx-TvZ1Ej`$Dc!Fz>=2i!vzpLK_W1dH@J{SdH0(1O=g~KnL4a-g_ zB3b6J&&TTX-0x4~%U3)15cKG_`` zu2$5e65~U@2I=FcaB>ZtS^Syj@cQ3|c-Hai zhD7|Qg1NB|;=4W%fII1+$?khHeBf_>C-dU?Ilbc`)bz(vgug!^+cnpK^+mt|P)7d& zLx(4st>$_5cjj~#o3KjnmuG-blZjvTC<5z#Z+y4oA^pVRmSV+S2eoM5i8xTX?c0!I z?9*QiOP7x=G%+jI@^T6}-Vv0g3|w^{$-OBY z{MbDf$2U^ma0l3!MF(Or|3wwv_KPTt=|DhwQK-#VD1>QWkjEYP=U|RJQSeKL6td!& zr2-E`D}#ZeyLnf`$n`#Gs&=9{t>#?@?b$E%14SwNatVIZWX&g6-!(jQj1O7Ocb~~% z)wQ`^KV=KtX}zc153Io&l`|UWS!?jMHbq?}JLxCR^@>?$X)pPgF7=XBR%^Ttm848z zy(*6mM#~wN9*F+Wn%Dd9=jg#&F*^FD>A_R!q34mgovDkZ=8IAtLKBIPSAc_1u23es zJqnN|+8?>cpYopbf*WZ}F(#zzf)BdeR9%73zgy;e_;r?M%}n;g-&$8SKuojJbG|fIO2|n;=8`F9X?4L zKS54K6`!(X$wus;^f2m6&tPo6U>PXNr5}VpF*k&ap}G4V2DpbLSfGOM`X5T36+h!1Hd6oBdV)Km>Oc{kLInqa-J})1M#h5y$*J z@?16Vw+E%(5_9e4H_&P|evWsa6_{bLkYSHv?>~c4yGUx>N_$ii#ytdW;Z&1enRpu< z_du-O#%iZ(q|+F-XCC7xF=Vopq5rLP5+umH6E(GRM$X0gdwBuh4bWBQbIu=$ct@-s zylSrnzGG}r%`eM?oN&JyG@@T>-c2OwWD=*gm-A_lo5MN9KMO~Vo zcmzTHd+%|tWAuUZdOrKk1@$z@EiFS6z$fVw}q+`A5uG+1h=DSTZ5 zEuxt2W!7|`=r$M|(pFNJN^Q<*Ylia=mSS_87QJMC#&j>_vOjx%I9ExdG{>^5J;Os2|8_(J^sCW@fvGxVR5l z_0>t}xJn`$05s~PAB{ThAlm}Q8Km;&wR#m`W1$Tf%BGk0NBHy<-KWN0{5S`gpXN)~ zNfzMQpCY3AI|Sz+-q;v8|J&jFmG*hSHhsgveV)+bFq80!i-hTij@z|C-FqKx`KoE> zo!oY~3uqI+-_6}LxkMaxzn^884M(PqHiyBpMB+NU3-x1?aLr*WxO%kXI@L=4)lTL^ zIL-LvwUNLX$cMI3qq6Bv?wI3caOgiXxgjK={?8k7E6%&@T|O){_!}0dvVN&d$aYF- z)qS4BNGKF|#l}lQ9bZcQ`Tcv%*boV}3B`$}`J>bba8+pu7}y;tOV(qXJe{{w4Nth` zfx-z$7J^Q=X!v!Rw%{GIl3iJ3!Ew($%y3rD7rcwRGi2XBib4?98dmGQKE8*zn4vr_ zsFy@r6k*M!Bquldi)vk)C9QQJ6)RH~a;R<16ZoQ;7U6F#!})QyOb#Wtt3G=ep^%(o zsCFIwR^>z&$a#FJ2i>(bMU;c-h9h@!AwhMJ68kRqx^(=cN894t#yj|@+oJyZOtT{e zx%CpT?qLx^HUq5v?Wn;+zOu3siK#R7j@)3D)1c9UJdT&upx=$N80OX}=G6UaR)#20 zXuqFH4MV&wqcSa^rZRi?&2F?nWkT0{vYivJdT~z;>zpa%eyT%gokU|zk^Mwn^Z~JM zth8shp^oQsO(m|TsG{$<{Ag)U=~^bQ_4N+4%pWOK5w5S(t90Z?*kb02vZXc-*Mwi- z;ziNr{D#T-((-tR2Wl8wG=~e53`gkz{>}!AgL_d)@$S0@6d611G zP3{Mz7K6`jOWT7C)6@l*Mz8p9!G5;@0+8H^-g`GTkDa9-Zpks@-hVOc>Ye)r{uy~2 zvtg;)5)CV?%MaSBfq=||QM$O;^Z|a=Sl1=-vF`=bM_)tjtolxW5xSR`}%NUgf=j9&V*>}E`zIl9t_U7k}t zd-P4`oiwJ35S=(v+Jo7{!j!ypkr_LDTdHG3`<{Ro0|jgQWdAG&kfZ$NQLphB_|c8# z7zud!a_WaiR|zu4yjY$H4g!bNp|j1Wb4Xsg6-r;xcl_sBPlLlQ8cOUHzI%8&K{d<% zfwKGqChN&4z{~TZ2`kFp4Kep^tiXs7@M9@vtu|jN?)D^;eYk7?2l%S{u?pL-*aC`Q z!>Y};bl~*+2bAh;qmWgU)sVhcMBgAu(U&ORv%lG}`ib|24=b#Ky5pm_H(jh_LKCu)ZsVgEFYQR#T!04pdYK*Phv~Yi5GK&iRt($8hdjGjidy>%l-kox- zdt52;U{vc|qDBkL@e28>*Y&&-59jt`*xQuucqP#Y_%7wrAiPx#~fx#IzFhUWy>Eikq@_lkI7FgQ%>5{ticid zkU-|_2del)*jKb55?NpbW7ve);nPubw0A_G1jxQ#zFQn){%JxKIhT^1S!NAWS40_? z+R)>}2lfacB~G;-(DjEEvMIgJ3Tzq&8;kUX%8P?Kg3}*NT9z|fUXbudfX%7_8ZeDJ z4G&gHMA{6|EtFat7F2_7T5lkf_C2)Sde`UMHjR*|H&)`g)RBe76e%<2L|-o)NfPqK z1~Ca)o0*FO>o4lZdxLGUrtO{KKr*ti_Mli3SuX61#zrCYs#7cKRn`y61VA79s^t_P zfu|CiB36+VMU0PF?6H%|*P8Wrg1#X#97fvlJL)ft3)a-q3b#%D)}So*6R@kk!8s{U_vVeb0kqJG&h5?LfuW>>`FYsAETNiy@2IyAnmCXl6X(*cof z6yfZNKm~4Ey&@m*8)o;>+&Ji8zn$~n%dy|kTBUF0UDP;;Irs8oC)o?ytEa#* zr<}y1r^b5-We2H9*&^w}=sX9a*uunA*byy*&?|)R5ehh>;*fz0*X@+8Vh)FhA$x6H zEkCl*P;+>bvpVTxMvMS_>HY$+#sH>({}sWeUe}CO73;R$d~4>acNzn?ZB%-OB!DOf zc#Sa9UoK<-)qjmIqVRiKBe5l@s5oVC-z;@=D1Q0FD42w%)oaw!dOjTvrM38w)^LYw z8O~~RJd?6o_T>?F=C~c{<0%Kl3z*y~zwG^yd zTL_KrgnU~mc)Ky1(07DFHNWqYBKhY~3pq5g-(e*)ZG@tKw5&1h2id9HPZp#k_i-Wj ze*dmm!+xr-fF|q^XKhWL8fzMtwWKc{{9!x%vseTu(L77&*}J(Z*xd zWw0MfX;BCln9$~i0b$0=tgi*V&|Es#pBXY*WLsU&6vB^W%ENo_2NvTX&}=(_!1?69 zyJPr|DbQd0=Yc$+_PSLxl6{?h<8>f02-isYYPbKj@9rNRMXC9XIedQDetzQO?K!sY zL|}Wpl|CZ&PvTJ62HRn44Vnvl(7X0T?Sg(_w^7a8N1>;rmOV^f#vc~`x*fikS{CdC zld%5gy--*eN2!PwArIf(?+pneHj_(TV1qI$UpJe@@_i(yBfJxOmi$c~mrJ(HvUr&9 z@XJ4*5+ohYH*%>TQP8-@o*LwO^mNn0O^@+i>SW8>q(XDp^!I^w7fXCON`o<6^nl!`f#<8QfL%r^xSxM+&&xM)&rMBZItf@Idi2^ve0V&rBYGQ zO2;`Jz!iptZd0_FW?5e{Qn{M`oaR#4_1SAh_4m{Q0`;{iS~0KGE9Y2F_T7z#TnsfH zv~v_}K*vOrwCi7lHHWTmJCfz4{K6`RK~WcN)dI*lm*tVih&LnV=g*)P4Z3sK7oR+u zSAD(XwcNk{$z!4Lr^7t)a2nZ2IV2t(_GuiVj`nJ%ZZ94d%v@OnCX3I*<928jq`)UP z_U1)3>UY>_s$qDdYs+qR+4Kr0ZBvy|NwoiKOm2~{-Wjcm@L7UnP;g?D(4tAxP+6;BIAhGgu<)idq_$n5A`8s-keP zKI=bfIVPsKb&nM&AR6w>acVMQxkGa{=i&rk#K?aF-bT9@tJAGqBx+qw;|9g>jcA*) z0gH*<{!m(tw&2_W=_GD`a*^=|^Y5JUBd3&fwMea3noBByQ<1~b^&Q`$Mc&@PYQPzUKDRFB@g`NqVPQKDOwUg#CeGafg#(K_vRS9Q(I#e{nzw z=Q2}pcJ68VulgSz#ZLNao4g$N|yKhaKCF z4U;ndo!-&T;9mwRcbl_Wmzz7~Am|0N@^CG!!vc-GVg0QP+6o|Fv6#~Ox@K49?`Q;o zn}s4t!VEw;Ru}zeoCJtj><$61V`M493~dtm>aWf~eZW3bbYV8-V|M+`Dz*p5At7Rl z%F4uizr<+I8<=aSSZCSUy;pUBedx6W+Yl3G-xmQ@MjMisttaTA&n>-bLJ;y)CI8FM zBl`MR${0%BFGDeIMt%C+eRQ@_UZ@6U!yV5=;&%v-KHXfTcV@B7!F8|AD4I&r37yxu zv>@*gT3M>wykE&J;AJh`k!Pz4@!gBtadD4ZfqQfy ztCd0nH(D8M17m^omnkT-2h?5Q$e8`2vk^bpwB8w(MG5+(Esx8o9E!&zaOb{baXNOE z!T)99JufpUsqXiUqSn`@^#6efA!`Nhki%sST7E_bu!#WfyZvf}bL+yb0^Oy|nQVl< zcGQ;m=6emw`-~XD(7l?9WN&Jr*5IQ-)Pc3)y+6&*W?DWCmo09pUR=eAPe;I#f@0(E z8+o$&_I-qV_46a6!u8k&qf`m#M#?>Jyb36W18me zCIPEa$HbV@0x~{-fry+u75zAlvbv9t3XjY>-fhEpeTEo*WicaE1h z7YH!l8ZU6am6IKf{p+-Zgtf;D;Gf*d&Bn`js5uD2gd+mE$@QTl8Y5u5n!Y%jU~~+9 zhiwMzCGLEF%5V(M3|hAE4?{JRXBy7{zjVugPR0~>>ESz5bT~m>qgZmKO<&_fWXsD~ zkmV}ruK(xU=c@U^>YChV&hHd{*W~$bmY6$pzW=86>Fm82baT`?@JU%HlmDueBCT!ZR7>1iB2n3uhHbrX`EWofRsZ$xFuA47ZYB-O4o zzy@*WV2^8OL}$S|aEcqIiUS1o#2;B-;*kwbMZq%R93Xy|!Mz zAF)Emj*GKnqJyFu0UKN6)mpB&>30X0>6oc}4W_vLr0({hu6a~7?HMz$GTz_)AIgN? zv)w5)d(`bHdO74-6FD4qwQ5qIHlpv=48K(-z!{R~C_I8vUN>!FrGuqO>|^OyrDyD3 zxoY0d0`)#x_rRpHO9W%E;Rfhet}!9K4(sZP}sAnUu^rp3;~x zxI&r`eX(+Wu1j6u*mhc|{$>*%;z7OA#5^Mf^(Nf_8<#}2tUhKP(C=`~Cfrl)I4vc( z)Ga?_ch&!dz#XC0liG7V25~k%3F>%dw8htX_)pGmDMJE*V&R4p^Z5jE_HSmK@POMzumr=Hy`j_209Gj|g8GpQnRb2bFPOpEmO z+#Wnk=KeBbFH(*l9`)f4`rOoW83h8KR9>1G^w?MEj;Le{W)tGn7s|!$K=5tB`{*Nz zhKKq_I9sv8FfjZl?1`pTC#lKq zzvi7~yb5*br5NS!30(!nUQmk)fzO?y_zP$&sv2xlH`oTyXH!d)L(A;y1!UNZZ6w0bkKg!?3A{J69rrU#v~~NBpQQB>hU?7t zpxHRKcvvLvJXeS$Qg?S;t%G8J3SjmA&%Om|OFCww_!!J%heU&Hn_%cqcJOa?udi76 z%#TWUL9J1l_gm{vaqO3RkEh&`h%<=ZOta|_i|H2%ht-8z@6awJ#0IvTJ7aR}Q5)|A zK0W8Vb;(Jr)?~#fy7lO;6nyYgyDN)&q!}T1GO2+4%Tmd1@`d?QG>gW`I8iEhQOib@ z)RbT5KKY6dk5L8X@Yj>O+;!kTZ%mwahyv})CATBkI@k_fz7Jo1WvCN?mT^T*eP;F$ z>Al zP4B^AsbWG%9w&MY8s@>r$*iH4RxAf}sfbGl`FY!F7QPpS#qqT32L3%05&upQvyWunUpt*ej3GV@Y zD98li(n5OyrB`~ACzd7dH1y|5Ji8EfMOzfHL#D+8W31yo&sy?(=IQI(SEjW7Wo&FB zH$YgAvenEdgK3(yU7eVKzbT#UkrWK7U%`UAQRZ z^DbD$TI3ADFT^msMZqVPfjLeE6la{Cksqm&QlDUd5CAA~AuY}k>T_$E+MN(wkh_@Z zykYb3m?Zn=q`Sye8-hVc|MI`$8l0rVs0>#Tib;!(tafnM;IYyQz2bazQYDiUcNa>T z25Nt+3>LnV5a@QKg_a`wPCRpP|5U-w_q^mz63VlpX8L>o_ZuDQq|@m5YG{x8jC6kg z1b(X;I>C3)@>7^Jpe)aJCi;6ddLgZT)=5%y=mM3yf}Ty)|HE5P))L>uM&CF8H1J;V z?tv1BCk?a96E%GIeD+Wbcuil#8fB?LLIxq3g-o5WbDQJpymvZp8^>S!H@-me`-* z*&nY0W$!}aep>bHX<{*5f2(LhdS=m@?)T0A<+bC`iv@IPFGViW~#qA$WSSxK?QEYbA84eIArUoJA z26CTz$H&3+pyCkx116N?+PBX(9URP~^l}GtPMX)fl*7GVv;X%Q`!lOGYR0;JlLww}(aDEhr)e~ZLihhM8zRXt$CWp?GM>xFxc|g$EiQKZnFs)e3&zF z5_EA!Ry1M6zcYiN& zvYw6x5i4yN^zh#pc2x4g#&#W3*1V77@qMbBL9`Twq&3d&c$_g*OFIT=>q%|h0XS%9 zRm?k~;T$5xY^&3wJDMLPUE2nHb2rBT{1 zQT6gO`H9L%gU5g4TP@qpMJW+?%m=L^u@ijiaO4k#+3^Vc=`H1JPQ_Nf{CTXXKYP%N z*^!U6l3mmZbt|wX`0lbeb<~@VC)6VzK>zG*H^VtD7xi=q zqf}CeTe{p{!0kadLFI1_32KgV$lXoQ3CE?>U)Hw-Xhk!{!cx-s>vQ)Zw*Ag!_?8)m z*?vc?oKqGQ2K@kgAJ~~$44Vkb4qB82;K`wzN6@4#dI#St?shq-$7-g+qK8JtW&eYn zeQ)SA82!6mVV#|Z8I~5Jsoafvt$!+OaPxZ7Bd;GcejR>-%`g zlk)uDt>rO@8netPlNU&0!w~lCO2}Vl_`G>bPe$>a|2+s-^V?m+4KpIb5>rq?2`hQL z&4Ui;kPg#NYfecX3cT8wwgy8dwA2!Irnp#QjbOu`zO?-@_j&Q~8zikYPCqGYw$kqB zty9GWm#DxuUcj{i;9@${Pnayl0TU^p?vFW?RK|F`NerGBF478`8`laQ09ruUjDKmP z*P`gP1#jsrcQI`imKvfSWfM!~ZW0JuEiXBL+$p^Aj*0j0Kb#52DNTN@@F+&hI#4gT za-{L8iy7Rcioo+(wEr>l*WVL&tWvVJ6TO??nj?GD^3n$Bnl+=iAlxQD&Z}o>O?i_` z|8t1u2Od3U=5rl&80n|JaV6B4u)UZJ@blHOie*IycY$p1z_;D$P>jrNza7lyRV1zU zsK(-4hz{#qY4AlX$b9#9Vxfv+QMis&p~|5|Pv0Ba6J>9C72SK`_RBAF8LjJVi*3vr z(qe?hw9CYM-A3^X&-Ls&GOZc{^V(rFE8IS&4~8IRuGzI^+2H&5q1in=v090YNd3;~ zN(N>)c_xT>4e;L`QF;S#wpUqaVHu!Kl(5nl0f|XueINjr8%(bFoW`iDrel9e*gf=a zux7h=OqY*h^MIwTVd0bD2N809?hnWQTM^;M4_C8kmF)vy`19vU<2oGodE4vC^$K(q zznI^Y;{)x4tzkpmDnEEoYdjh+zKWlF;W{){j@iqZ?fl`Ez!ma^nD8cAVh^C0s{;3C zV-%tEbR5>xcz--D3N@LJ1M4CJKPC0mKRGlahqx?3Y1r++QAo_74QtX_);Mdmc0PWr3ffk9~@S z_FpwnZmPjaAow3T?Sz`;ofp#7pmgcGV_xc9+)C;THoW8wRsRewe)OP)AteXO!tSqG znhg+C)fo=A6H1MqW>ZGnpUU7GIWW|)v)L&5moD;!(THlwpk((@AMZoyNEn-H^k58E zhsb)f>TKXk;)>QnUu*1J=K?T$_szf{z@GYrgr0`xhzP{MI~HdJ&~m(}cKqp#tmHQAKU#pX}>&YC4EUvqSvdTBU* z{&~J4(^6EM3=+^(bB||@+`6I+uJ6KpCL8tPgh447O;s3KtTBOub^w%bHI!9njYgK+ zWI%TgSQp;ph}evCo_eOV5@P-k`9YYQNC#0?`j9wdD&Q71Gdjq`2BD?G0s)itva)rutwf?avRv+&ev!TvA^dqU2oLh z!p~WXr!zK@Bf!{&YUIBN8mDYVd=ESO-mlcwSgeeRpuNYZc_qq|hr1{Yt7qd!t_T$= zo_rB8G{~n45^%BQPr(H&=2Te|yk5QA>4@jeaCo(~5$_Q^=Lea0It0Bh3KD=`EDQi` zs$3JZ?qhVE0j2%~BT=AGy3Q9B_{$5~JH^h^XK9R?G1@X}zxMPdP+H68(unApwv4|O z5Q#Q><=uu8k*J3Ljp^Vc8rj44a4XG2k`qyHxABV06^jgMdlDVE@htXVSBLrh&`lt# zrNdYiFD1m<2Nu4o3BA--e#@}(9Oh++=DWzAsOq*%$sGS^ZB7;rqcdG)pXj9$bgTfO z#4RLNg!gd)$XqRrZLQjf3w!?1sSyuen6yrk{fr)qR&~^mQ%y$1NNceG z8JpC>(}{Y_8kA;F^RegU*U?V_LX2>m`QHQy_}74(*w~n1-}-{Ub@fPxTVfwX5UO2s zu$JeiWUqqk$0b$E_aqTO*VWyYPBO^`WEe%LTSe!eA^a_fst*P@Dc_>RI62xjgr-=A zQn#N@=%Q=I^$lkqZd=jh+1@zx+by1@4>OwukkSiu-6BdbC-wfw7rKUZD zA85bNS6dLzU=$4AxW7=1-mYDoRlc|(a5BkPN^GcZU~_LICE)NSBjIwu?heCMpUoc zQ&X&#PUj!G2~BPf`Al~_@vzM{T2`eUnjNj!xivSrXe{U1K8fa8povEtSgqW2QWt}1 z@@E)r-)b~!%?W&-7ekIEhzoe;aPg7hENe>`~T6=un1X2R~v%0f$7c{mEH*(|d*w?WA>vWX7dntGrE&DEDFVaD4^$4h1TDTK> z*k9zI?`LU030tX0hpg{Hv>BKUL0krfTL?27M*UVMz3i|Bvrs2eJZ>+3lDuo=gtS+I za6wW^KXElL-OaG0R@+S`G%LfGL}{bu;o&G)fp)G@t0(N?3Wq={)`@#ci2;4QNl*OL zOcn!qK1O{zw=a=4mgvSB5Bm;(0z*n;rS~`ZVmR*QEno0;7l1()8~NMO!ij1X^+$)) z+K%j=0KFDg`%b+Vm6K`6gN42rje}V_sY`hH>LM`Szys4m$X?v71DWV62CZ9$j|sYzx9NsFpLpEIy$kuC#%GvdsH#~A&6HV}`&>wSa@V%TKs zAFm~+L6Vznf!P@EzM{P2wnNo{ew3cwe^4sa(Y#wAksP6oI8G3&Xxg= zS)CJ-2kXcf-0adaLGgY)C@*lhgOi%P{?>Ov&n`pe`5~QD^Se0(b|ye93&=0){9HP7 zvt}T@H{;bytr|;1vNF1ruT8}^1uM*dJS2w_$u&Y_dq=Y|f-{FlOL>XztjE!311L@N zB2wd-*FzQgPqv)ICV&w}#9+KC>EI%OM^pZbruSL1=U^AL!J%VV{%z_@?-O@#o7}2< z=p#7RHGbQx@WiQw-%esYZIoM6MC8%*T0lc@+nnkUtF=?o%k(DY+P@E65_Y%L~E`0 z*6YT7LV9BV0(YRwhYg@b;MPJ8Liz^@n7nxuwz9VsMn()}gx6OP{dwJ#C1?A&W55+k z>bMdRVn4VAxMSiWOO&4DiL`-^%g!1<^Uy5v2JMZwLGN zKNh#N*pX&T=o398i5xz&Ew9UDjeA=3_Oc02 ze&N$_X&z`GFhJ50PfculjV*tDUZS`BTCtUqB!~$Edgd1urggu-E0BfTWrjLKp4lpu zUIm&glrFb~*I$GGoD>{uqH~?QoQeF9d%YJUf+76*E5$Y_B>|iR0>+kV#v&y4#PC}P z0U#_FRa@p%YaTdix<5Aa;Ecbt%gM9NDedaHmXz1}YswvpI#_Qc&O|2~iMugX3Lef1 z&Val>{A_-!!!tWoSbos0Z2`_=o51i4eQQi)BI%`L+7U&{5L!UoAK*iBT!x z%#3+eKL{ISd*FTd2CK#U%2RjicsUY6SeSh~GX(-UKO&(CM&Lakb43e{y`Fs}gXXWS z>%okC?cdv!4!8A>wo8s=4vJ;Il_QYAXpQZ>2p@nuoBm@Z`25ZuVLWJnv)enD;i+cL$jT2o`}JsI!}{k0 z(4cSeDa!fcu^kIO=d=%sK;t!zC~L9PecYObC)*2)f)tS*KRj#P(;M>@2dn?PRwDe(v)U_5J55<^xUCKasPSHw?dTJ=Fr zM0*Z5#vGA9%6-mHsDCMW1uEXpx%i^xp?-#dDYJCdAzjb@Fa8!n)i5)0i%TG)Ub*>d zN@ie5zmxmZFF#*K#1KJslKJedQa*bOW|>qQfprr5t@)iB;~31o0Dx2#xYR=t6k*0qYD$6Gev4|Eu$;vw_T zFB|TI4retEVrt`t-v?FGw;9%tDKf`)zt!M{yhm>7BItTj^mPY&(eE=do{dW zrS_fMOcgUAZrmqACrqem>Qm(3;51;?fg%+XQW%)BVL6avhPEjC8vA!oW_QQ;MpCmp zPG9Nfp1>8KQ4kZvZ#-^sTQX6$c}8-Ww93B9*}Y?Y1ymd&si9qUEKZfCc(x^=Np44;XnLDc~&cj*Vr|-Fo(BPQ>Wdbb00V*UVLGSYZbLV z9qBuHnoO>b`lbe!{>0uf$p07QC;i1(izVAWvpk`z4ZQR{j$9_|8pG^_@q;!$%BdNa zi$s#AU}%ucBzUVbo3>g)7G`^Ac(l8@{_(S*2M!!?HJ|K-s}3&I7i*{J*|qCv><@|p zQUeV5vk!J)TRBYn3@6(^{jh{nGF9*@iaH2$eA@($)74Sw>On#S5He%3OS14k{g>$c z^uOG!g)j%EaeBv5VqQ$YC87nMW^!T{U+4!-ES{DMXf?IJLy?ra68c(=K2cOWOV3-@ zDKPL}@tUGgP;U%}uzsBj6X8-qqIS69>+29piH9ubraAMla)SMqNt5kGFShMjtOyIk z?LTKn%?HQ8X3pY^103=8sqUwSCo8baYy0U-kE)BN&-Yr5B*uIWC~3uCx1)3~+8xA( zd0l6GS7D+?=+d$)(NdCMnT_{csn>4XiEu`X@Ulyo%`U)1z0S^#@7g~S18QzBLMx+S z=7FoAheD?{8vr}*(xJ2G;;Mt11wm#=h~h?GX%%bLyT^PB9lBfT!Shm#m**wsa8LP8 z1*W%}V^S)iC?oubgu{dcz``vhpAVa{_zP z;I@7vXsCEG`8XuVMKzwk+NPv38Xk4MQ=k1s{112Mkms< znssnzQg6SfWzk3b6V&7C%(Dgk80eC7h-7fWg3q38WjoqnD>F5x<%Ml0y34r_+mSkr z#}VhAL~a~`J((Rhy_eH+x0CG64Tp4d!|;`vfEBT?y8&cxU=S| zlp;7$13%`e?4@Tf5TS~sKYgM3uds}~bqUEw@13`Rz6MmWj{l@LYw4^>8GLlHVjSCp zr&E#t=%~y8MrIg_!H89d1NPAEHHXNhjl7_E*~CLzNBp>Yh;5OpnmjcQ-1v7qJaH(V ze^hMOfPu*AEgq@m)nC4^&!4g^wkEUfna%q+_UH`tH{3wWbyU`N{?DNBYjSXZ>~67e zlM9cp(zP{fGvHP{NK4fTT2-N+(hML?3lX-vQ(-h<*7bvHoX8^gXS9ie_H~xqkdaAA z`QFR1(ryW54hgH4F|s7r0j?ewrK*YkP_yx9uc9@~qM#-#1J}fIL6p6A1T%Tr(y7k= zr8e)m09^cIt{sE3v!9bzLs?v(G;l%$>uQ0ri0sbN2sE~O*xUgmOyeggZI&%80GLymJ@`k*mL8{ai|%pMvOy>9$9QOea*)ulQ)|3-aKZL2 zlc1|l{`_U!wFE{jTL`A-{j{#;-n(1x|9yU5s8|H33}ft(@|_z<0p8CX-{FU&Nw(Dp zgEaC;!J4$>j-So$rxvVVz)RzC0BL6^0>uWd&Z3m`%;Z_h^Am zVoG_H zDUJb|jIq?A6Z@*QB|>v-MibQj=!kS6s_TPZKhnod(^$Y3e%^bLMOT3%#v(w%Xtwqr zCeoLD+8-%iHrBtGb0}tqR@Z)?oUhX-cZxomso)Vtom7NgPD7gk%!_E?+BRw7C^YmT zPvEKe4w$@Nb8!!7l&7oZ^>I6`8L<((diMr*a9h0$*;VCf_QAEOynn4BBVwk)6uTy6 znixuc-z{_E;FtcvF9l=LU4SxVsQ~^^ubyTnqUK*R?b_~}KnHZ08iNPGNx}AOiDq@w z^~TyutdD!?K49qG4O2wf0j1 z$KNtsh-%WGiS!(`uKqh`{zoKSlL*{v!nM>9nbF|W*&G$I4K;GxW0px#wG09`rwH3I zX+ky3j2-8IQU3s%y=zX^+c2#*%Fww}QWx4`o3?DANueM&gf!;bJXT$3QvJnG_;AKd z)xSPK*!685Z~0e3lT%vJWf9f(9ZGgi1d+%a9XjK-4+*zQ^3n|WVUx=;cT_tHYUP4) zmJS!)(w#e-z2-VLJ`Lt$n-;+t;H%^QN{Sl|=G4sEU7qxvIBMFCeb>Yc^5I?>*1s!v z)*{SIfD2IoBt>VU+g|IKob3N2>dNDxY`=HqO)65MG#E)`scf07Ly;wwZS1>{vNO#v z!)T$=Vo8yGOV(j5Wj7RM>_g0qU6L6LCXKN#zlZnzet!Qnefp>8zVCD2=bYaWe}n)e<=e0{(# z^VRRlhG6jfxyvpq*EB)YC%qA(Ig)Sm)M8a+xi4;JjsS&MBd&1!H@3faJ@B7TdZL&| z!$#dNcUC44CBdV#BvJ^?TW!hYIOWZ)(`{*gQt9gM@XK!8~+(Nv2Gi})Oe6!iAShln=;Us?I( zdSe#sp~#`Gwgm?R&)(Lne|;2;dK`Bck1;|9On~Y;eEGS1ct!dR&!53NiOvHSFdc)*)Unx#$Y6RH%uR+@2)*Mn6dJBGK zv0)yI4UjKU6#ilz^*rx z0N>R8?%!Jc*Dw{$T*^ZGUp*nskkzjjH&<=zvWv^V`8_jvA!_f*bCo#9k`K)kx%!)D z3quMXgI^L;Y2UAoHa;$B8cvcNwv-Q!l^;EbEo2;P(TfwgZ5_;8Vva4hu>0;~&Cg5y z{xdu8=!%79%Zyvt>ANd7& zA+{)tda@-2!YR6t5%YL+GDUQwOtelw;Vwr|{CrIjWP2KwZNlj$V_?IB$~3 zmf3T?efgE2qL2J^i1=&rphjisxM@w1gn*xV$@h%4tB>!qvH`4G&m3EF@Zem7(7C2i zyA>wpn(Bmn18oBt<@_$#EQXt=#1D_U-De-<&`Tn+1Ci9PS?q9EBg{4CN zyb;F@yipz&8x}jknUiL)F?*}bv+CNBRrt?yV5qsSTW`4H$TPdjR}1ubnKW> z{0a2&`N^5S4UP6P7gWh7Mv(Ymc1^$u-V0M#^&qQ)p$3!WviJ!xJIIFmRng|sHUbek z76pCM+gh5sK@+w;kn;8zJ2GI}UE~@z>fG^E1zwHSpR~9EV#lFBe=q=Uc5T;qVt()D zx1OBX_c)8{qS3(?-V>pZ93kPSla4U`3jGLc@^^eVug7*Cz3@~897O8w0oO`}cW@pY zMwoJ?1iFQ*AZF>Hm%7elW^}^M0^dFZH#+{48@~S$d71sYihmL`(BB7f+?}Q5_Sy%bX=Yyjxb+(I4uR= z$obU%2a?IX3m}e<|2=zTqJPl+9Vt$!c!fF*(HZAII~vwgOKfs)gN2Rr5xG8v+=&*D z`uSn*YIGY3ph44b?}e&7Yik)hYnL|4o_=-BNb?2=avS(ZheS2Q<(rM#sr^8{y%>>Ux z(`RbT4Nn@|%)by-yCDKE6@h3uF{3B%qXg@cV345i|1b!0Otgs%qL0Px`C ziQV29JMC5fN9LMuem_7W|k@m02fPMwNr&=-j#y zoY^EPbzb5CTzKGk_4{4Kya{!3Z<)X(#OdakPp=n_eI_N$%)otGz%6H*1u@tBYbTyB z&1P}yoIS$P{4z5#DoY~u09C4J7!($xV(A4VsL8Ene$%T7^bi|G;|14kHiCNXlm+TB zg%O7px+4DBO*$mtfA1`o#b5wIIF}e`Td>aHM$v1u357KcHp~{*f$BwYW*lK<0ui|b zV{~%yK}R5VT%?D7-z`J#I*@-H@RShu6I(qN&J3kUe8v^9leK6gF0_95q?~Fm{nEI(uNOz z`yoU5h?pKFc$oRJd~)JOt|@%oN{=c0#cGvO)qwcKSs!A>;3>0k^AvQvy;5`rb)T)S zC)YmJJB%0vMX%Ra>pw7Tlvp1TV$biALuucE!qh^@{H`gR`|Oz7 zD=Xx4Q|ynQyV005Ur^)u&-z>m-w{U`NQo!@XPOlZ^eJZ|c^0l8YA!4O8Uk&8OJ*O$dgywvLd%c`g`#7Ct2yU0e|j2nz- zDISM-^VDm2@dq4UT=vT4#KmK0u$v=@^!}Yi(VfLEo3|@sseBQC|JE4(*}Ro_KmGe! zH*Jk&bv9$NerJoRIqQFHKPx zPmV)-eQMHQmY<5M&GkrRvE(05Ppdq7p&``ra~_DIZ*41Q8_iWW`z`O{vm2)merwft zH#`~`Z%G2Tk68Oa1K;3;)!lfX`MEn;RlzOak4lXNh{v3Yyb2NSZE(`?H^#_t zq{*i0#nfO!($wa%iV_EjOTFOFfVIn)EE(_aEA)pzr(?n9ONsQLbN==~(sk^)s8{`7 z6XV9&7=?(&?H7FmrQf*xlQ6lBo1i`31?cPccyf(2km}Wr ztYDPu&0Fz$PFEDDre1ZCqA_OX(IONleA=IMR{qv~JG7d^md(SFa--H+#2d?w)I)KL zXE002S0mnJ=jFk5V#Mh8(_F;=fJV(FfK zN1qafzH>Rh$6ohdK6~dkLM|1!He7iIipoIDawu$(mio&u40AuwX0@^3ei;!FR5FQ2 z@;{aoG(Pt&k*^8;enfjzJ11iNFD600HZZ}Mf#7|Efoi=EdUtt#T)!KyK=dn?h~HXp z(2J~b6Cd>K&MB$NhR^(cANh4UWMgEI_{mFAvrxW$(FQFe7XJF`y2H=9oUw>JG&60| z_XY4N6Ndlw<{vhVQWima!tj4jy2;o5G6&%#uRr`L1LuJn6GDMrBYE`(2hKWmK^f3J z$#7V++)KD0Fj^Uh?nW#LPk>Dw#tHM7+`Nc%k@|d>XrXrY0LM;=8~#ucZ+h68(=5hA zQZ{}A!tYw#*Wo$pBPZBaSubQ!E7r1&7#vOfF-(5r#ZI;!hvUmVM0TQw$np$?M_mD2 zs3K*(6AAg8R=y#)+(1@`GKBx<$)4HE2m7$W?TEAQI~ zYd{A0r$rQ-;;?fkLN{53Yl3pCiQk5M zbg;S~qFcZ}cWm6xKfa}LOzU9Qm)s0m0oO$8M5v2l_D4pIn>5HcZy^iRU36)g;o}|0 zSeU-%Wy@o&dxqUb)Hy?(eB8l3I7RT45!8NBaMmoEQ*y&3{zY7ttJ&HE5dcA&t{#eZ zp{mxejvR-Bu1Ml^e~(GHsa=b<^>t4x99arN)T4asV&_cMhPS8dVt}^?^^i9O*HRds9S_)>nU)Z-IL(XPL#e!#0=@8r4iuwmxC-*V6D6^VXiu|lGw;A5ssN7#L@A1m7I8J3q)O&Rjfuk$*E#gMNH79Y zmx$9X0*888W+*;;F=;jx=?bgFrH#SNZ+T|aDw%YB&lbyVUs!ulNVSL`C7xDKXQ-8@ zUh3qD(m_9=AjX){9LH0X21HkeLY=#&UlVj(RQ-fR&5c8T~ykvipJyjtb>vf8d`I()@l;t$@35S zQyvKEnZ$USE=qo<-~7z1BrCMuCJ(zgOE+e)%YJlxtYWMM0FCrs&4P%ScVl@zi9&6& zE|GVlj0qX>pV zVHY1u39++a%{5mF97#Isc03c(GjRB^jH=nA)e>kFzU z6Jt04URVK{;_!#?2fx@jsX(k%Pl%>;k1Yh$nzWzisVJ|$ z4k)?Ex|X2LgL`M6A(na!yE8K;jow;C@jT4cdy$R;o%S#U^ZY||G%T=`Yt zpo|z2h}V^B~+T=r=rw(Bg5{w7iHyh@PP0B=+$RQX7K!dCEV!Z=^QB!VpjQvyfr#C*jbMs(p0E)FGp4Wb)DoHl6?piU8 zsp2K15r;1LT8hSx5)5;@OJGDidLVMPyDbSf9z!JtMHPWgdi;Jk>3)0TQ=B0B-%qSY z|C#`>ZL!odSU-hF@0^EcqkZ`sBzSRY6cl_Z?rWdc^D32- zg{Qx_ZafPvMt{76ax@F$jjX?xZ|P>qD_W4%5W-X;#Xpx97wRN+E zdAGW5D<>4WC_`EO{l_1Ic&)>De5u1{bh}jhmFiQl?Ix=gGQqAt`-6)?Y?afI@36>E z%+_+F-Gc_cnxVJb#R|xC-IF;Qm=LC$mOOqAo9-tfA7|U8{o$9bj&lA@VjuC3C+JD% zW0=4eHZK^|#CdFx;~ zWy#=v3Ae5aA@;+5UpKaA&s2~|QQp@s$d4K=M+Ru7OkT#^#dhyL0cOf^cm&`U0Ol%< z8LWsgHU0jvu5a{U$vKc)t^=o-orI!>Tw@ZwJ2-B0FXawWVP6K$t(*IYdO`V; z@X6+J^Fcy%3!t)vr_Nx??FkmxcAV#V7b;bs+NJvV-!0>su=~$$Vcb-gfs26+8wYln z>Bq$EPS2)hq^y8+J5fKFhoJYR$xi#A!tZs%$9&96gwEH_&HA4ot#&5VtiTZH!MC9+ z^1U1dF{5}^v4aVGzBA)9&fd+;y|7cognF0$f_X#RvL0af?wK83SF3hc4$GahM$*`D zR_w`-I0f$OXraXMaQg-GSnI4bwb5X%3-DXvekLA<0&+1O_-l2vi&LG!t_6vDZ83SA zVD)ZC!q3h+7sHIg%@t+ob)LhAD7_C%hsCPUO@N&kRYYS75noFEun(5D?9?{)p+EN{ zVdYn{p_4VZvk>3MQcSAi=7HGD+LY?8wMdctE1`CpsWxc{33L!=JDL^L(m)M+kW%1t9 zuwtW`w2JA8SdRu?hM6&v@{J~4VXkbJgW}rAlsC=UdRzLe;%-_B=(MDz7;|%O&0g27 zo2iAWjBa3vvVh&FD-?`;e4NELJyW66mjk z&Xg^rY?PX@%mx|4gGQ3u9R5Ls(`(ZB!3#TEbECfN3L%=WYe{z%{gPErr` zAe3)5OEUkJe*8)Csj!UR^lQMf&7(izlBjP{&wr&-ANc$d`P%)^HESPBxigryqZHDt zG}1nyZJoAKIkh@+b(zO(tWVb?qu3AeDWyV3h5(l=;26{>-Nr-$GpY7}+l1y;FVfLMQJ}QBF!{Uld=M4Qp z)W=SjnMEDj-)C(VhpK57G@5rjRiLVp;rR&Q_T-Q2V50IfYL@lwIcSuK+EaU~Y@M;* z=k^{!h4vJacQx9hB908)b-{T>^E2}@8^Jo5e9B;c*X)oN!6j`liBjgWyrZm_1C&?bynyGvNo=A*j;3nT1a}SYH6pI zM~mILs>Cx&ac)omdNd3bJ))2^!#;6Tsc=6Hp!D4EspJF*o*68$9_oXc9!uK0G4TIR zLcSAq0OTkQnW)ctZuZua#1a3FR%IORpox({kBXEi{d45Sc^O{MUcL|AWf#(2(6mUT zo_1Qw95OdFZ3P`V{W9CXY2&7LtihT|^=Ai4bB#5nIY%s5+Rl#Ps7L%{sH7-3)iaJ0{u(eruS*+YY^1*kM2$8gt!-gBBW5sOmz2_U;wm}t}9Kbo}aOm4S}uL4T%=(vBk|4n}L@x#eCDnnnv zO{R$vST$SiF6Xn*m6r-qlMV$fVjX6$!r&B+=oOh(i zj+zXtoFD@-mYjr-!MXX~rgZ2IqWk-i4fId3Uc)GvxSETqob@G)`}X2Ed4G@5qLxdp zlz`zSJH3k07xw9PSjJL_7+`#P+7Q!{8Y<&rS`MJ12&@~q2Xlw}HANyHQBu!K@|h%l z=)}88LQHH-@B8owWQ^M0$SGF2?Zp3HGCU_S!|e+BHHR6ET2pYMDV1~6{42Bm5InbE z*pl|=Y2i)k3m6XwVi~y-=^!}k13DR&yK4lUCo zLcay?_mms1lphhZ(_AKyK56U*5fg&H+s^GeU3ufPg%5Pw9VQlX#yidiDpvp{|91}vLts)v*acibaiUreUCIm>F z{h85AP+^;K!YGu<{hSgXDjrs%o44LTWsFI+>}xLJYUseVzPJB@Ff-~V2Njcu(_8Oj;wncMgY&7|5jd13u*=H9u_ zotxh~4O(l-?prYNEx!#zmos|V-d&5cf1dwptVT|pQj#HI5u$vMJIi7Q=!El3t3j3Q zzdmWCG?w{OiTV1GcC)^UyI{t;wbBvx3ZbDqL2^eIGyB(5Cbf4_FW~*Mt@bUY+((0K z)uf30j#)YbGJvR;ad$mF`?5EU4yxzPbz+ z-p_yUlDu`?6|ihdx^eHP2fxNh?kFM%OQ$w4;P&ixmc&PXL^-{i_`k(oSnB#;IL zpQ8QpAG=BiZhbXM_W1H`l326wUllhRtsv|86`X?@x-^mXT@`)mX}TN@_f;^H80m14 zY}?}J^nM2MVa`TR+_&qK_8BI0TxD?Sooe(`<_s*}p0IO0<_6SIn6G(3g|kw-vgHIk zhKz(^6k^^`b&NoSYVL9OjLz>@J@R6|^~6JVVp+r*EfM(Y5(3^e!VSP~PC@NQJT247 zyIcPMd7j&+S7!0aSo2?Qh9?CIGCu&I_=IYvo^9HS`Bz6e0egy|z)d6*KYA9u;SS3F~^V=e{|g|MB&L2=A6Z~fcVjk!}gV8oq$}bD5FM27n1P9tno~pNnLG& z*`R6j?dW=V;hZ!MT+)tr-lwPXsNMonlvd7On1O#^{4{sYmB2Hx4x{#Ch7g4bfsi+Q z4*jy&E~^MgrTwa)>D&vC0wthso8MEurY-%>x?b=lnjIUEMW5%I;2+45EE$u6vC?bq zo?$Pw+{hvkzR;!FSG1!AwQw~5i7{=YcSOW1grpL06j-Yg*YZLp1=(Mau9J;yr6pDv zjk<6uJ5Jqc16O1_6o(0OD^whtyp>V7m=6?Zke%Ln`*S-eefoo2Hc>-t)k+5S9da%; zFCG4U%_T+Sv2MDCXQVP&|Fl+hx?O+iaK=}U)s`ZWUBj`u9rA1!^YgsPzWAh;@u)q2 za$z$)`&@WOF7s_mb(yP=VHdSf61SqO6d;qvB)b^C4|)|=zH<^zd0M^b<6(;xsszo=M-P;)QOvV*!(Y;$m z`3oT8zg})O?LK&hkv^pbiS#Dpn}Af^&I|9m$Y{OmY~4}9d@CC>%M5%(%@z zrhWH0%h@No%S6Bi5fWgh2Zq%qbVBL(yJDMPyJQPax;31lBQjR{{e6;CT7>0V z$y_dK^Z*D~RQ*+5>_1GM9rTDvP_@UV{KrAFy7hEc5&id~$BXhIAm=8(p}3h1R*15N z*Q+C4SJt7MDg9-PtpaLZ%xw|vVUoQORcT{>h+Yrs642g%0G?0|03{>sWxs22+=Rx& zafHL{L&Yh#HetHWgo#_-3AQ@5)VJ<<(_f|mm5ahlO+K9d3X9qfCI zI-Q(%XLiex`eM72;{R@MSDHZorSpOy``@&#lqw9qsYm#XG!&Jzqs2UQ{blCcp=C+g z!h3^%@sWwy(#PwH{D$U|U0|6(rZbSLVXG+%*}iulNb>O;3rJmm3xO4wT9Nr%m(^Y_ zx#X2@?+*2ZOnN!;|@{Q5xDZ2zQx z)RIO~z=FRtA+XfFCXiPJ zLKNS=x*MOj@W}E;=G*d1+$KSvviW5r!S^0YA(TS+Ptw2RRjxg6Ns85KY;wO%z^ZoM ztv~s`^Dgrs!EWU4e0|`8kVB^`+Sg3{0q<=qR%?Ixm|+g4OQny8Kik*_dWV$XJ-te> zXD=t+n_U%O1AtmaIz)U8;g0_9|2EeD_V)+h<-E+tP7Z<|&4SFS`q0!>hAx&be;~3k2+6)T+5XQbXAVy;dQ)R8p&oC{huNwS?hNX8WIgrg=iD?G z%Xc|KAH1oXGt+4>ff|g@t|9KeQ0D(dr}s1ciU1TAr@&WuTAPPY(bS3Z#|HY388Qyr zz1y$sDe<>VKH+v(^MQqQN@ zv8c{q7g5_G#mjJy?fy59vk`FWZbY&7wYYQt`sh2o!&;>D8cmgi4Gk;Y78d%yc8}t@m z)yMew-oL?tB#m1sKy&POaR&?g$@C+|2a7Z#VUYXsoB(2LF`Q(X-=1s8w)hOxudqj5 zQ+JtTdMd!kGW+-bdld>`RmXHHGxuNwgVE7r;v9xLZVj(|;wQ04j`orLF(=KQqqsHc zQ7y;#$IyzAv>OE4#Td?QJ?9d44&#LK!UuuCG-4`8F-88o-4(v!yKM`chu_&zSvM=U zC{OMw%f*!3C@jCk8||%@t**S$4nFgHeIv)MPLO;iZ5)rhO$s!lkg8&yvI;8G6zq^S zg!#AfyYJGjVZbH+3y0)B+M3`0FpaN4OX|swH6Jyf^5aeUJq~h^Hu%AKs(XTfD16&+ zsc)+&0;h1GDAVvtl5OwoI2+aqp^${;kiY=t-ro8D`M%kBA-7d>7@K^4Br=1 zb#wU#lI-bTn1-;sDi>$oY(1|HdH+Zy)1u$Ac(7?y1@*SSpt@ov#371lc<8Qye ztvB&7ATYi{^6KJ?{CqFS$a@tHGnE^OsU2Ijm z-S~H5J92e1`e#M&mz#r<_379Y6E)UEzi|Lof06(!plvbfF;*Yv+`lA;oA&{fjJG`1 zG?ea)$P7O5qASh={=5i>F5np5bh?1wJNwDMZ}LX z1n=E7QqV4*DY$w;XgZryx;;)iEqO;b`&AYfdqjQ*xE~uI#hNFd)`X$cq=!@0E9|>c zvY&Q_+7LCOhSt(ad9E?skZ6%|h{419{FToRDu}M0d=ES>VUMwZVkw-V&WrruUonQ zc2y)A`%q!9X5Kii@QX!~<8anoaXZZ~)GX#CeDDcaGh~c@gD20Tx%#1EzJoGI_)1^1 zURXA>PMGk-gRn5s=SE$#bu*XElp6e8oYk{lbEgfDxQqkqf{g~r%>^ALx&r__9XMBL z*_WS2pQ~YeIt?h`RaSg?US5On)@J2Vl59LvHQN^dtCDc#-MA;PYgg{rc3b2|c4i4m z?$5>R)~^FBrsSEP>Ab^dq;JXYcaVn1<1BTQjb`n7;dHC@Hzo?$$%^aox zwERP0=QDBm1D!1|Y{hhszgw41k3d52*d*Molc@t;y=;5VHap@G2R9L4j?1%;A8$T~ z97F@)ax5FI79~@ujVz|S+jXG30=qb<++#6ACVJwfo>Bj1wY%2NxvTvIeCDf(D6@+U zG2?d$8;u6e0{s>Cz8umS?2yC*2jx_rb9oCi_slf0i^O&|8{d;r#!&(krEf!aNmJ|{ zpW{96@`OBe=hqi?=T*0Y$U?b4HbzM(1Io$4Z1iX*+09Z`q`~E`hhvBj$%NX|MQirZvrsI||nduyE=Y#(-aD@M(6I&*V?PG}b zzyJIcZEvoSHLzkssWI)K(Vk9$RB8iXai(}U9gn)PW#7e$VqNsBO$UT38Njl zL{J68J7gwl(jQ;}%t`sC+PMEV?}w(Wt3{Qd1vjM z!97?s`XLuQY|^6nkhf=&E{A|ae^v}S(dy6|L^BTMTsSutt-55-6!+V<82pUGfGQ?| zo%-?m+s5_5dP-$>bd6uQDrlPK%JfhwY+h3sBWp)`>Sz||iL&QR&ZsEyrd|p$B-pt7 z6z`9|r9!8`mB?#kY8;042r%rEw<%?{;Jqwe__depu8Zo9i%qz>axWh&xUemXinY=p zYY3~xl`sG zY07zeD}a1I*K)lcVBpf1t%+96<APLDe0Uz}wn&Cf34PGtRHJV)gs4**r%$>ByAScB|>quCUg$sT3Z3WnZ& z-Z!G|w+;B{h)WEy&O&!XUNP#FRY`bW@UbO^&Z}01)|;rg z1!kM`BwTwtO3bXR7}ZCzAIuW_vfDfzw3%I9VGfPk6^8bnan`KETN&d5RqFoe#yH}p zn?v&H)-}~C7Dn3Dp=7e2y$SROp6jQ}Q}S!a%-+6!KSy(` z2xSAnn=HF&aro#pEEldEg8q{?|PGPC)Bj!9n#l5v<_~N`Fm(shObXdfrz(aZ>9g|F+chut{Y-9tc2C zIQ`XK$_bOCunL^8$8?9(|CYTce<7ACC+_kDby=|?^Cn~^+TdYa*?YE~Iw7syE3W)A zOzMVO{BRQ;def{+;^cc65g{e+`^JzBp5YY2ui;T&Adn>sLM0mW@b`62HyV6@ygle* zes+R&aklfVHS|Ph+kF}2Bn)z=9|;O8YR1vT1EMVlD`AyHcwm*=CUcFPs#D3(J=KA3 z^vswG6sa>&+vsO3X_$*!Lj-{Xo)!3}{&Q=@#wDq|uBmU$rTgOWqgjM1Kirv98^}JP zOLTsKcYgc#91Q5I(&EbE6P*BlCcgFXeSKpm0zF`y`=OrvPLKCc{Ak<^)P%2b7*FZN zwJHcSqb2%XvL7wS`-vxXwEhhHAlj^Bo=atX5G(B#@B>fZnpF2Y4Ofz8*I!2eT^emC z7%F+0Q0Ns|R3MfJ?#GifqwMUFOl=mt~SG-S3_E%Ss2{6`SS$RsXPv;UPSt z3#T{*xv6p_D2kiRYAILc)inqi3JfFW7b(2W$-9+9OE^h)j0fiF%%rOW1F`OHCBt%; z3nVj#(vJ9r)1Oj zE-imF3ZybQb9MNB=6(2Y5mwNizl`5)kpVnR*hjh~?~?0vDT7cjw%VQo0r3 zLNfxuNeo-(Qb+YG5$bewF?X0H6QfOKqnxUhGL0gSdV8c5J`pa4oOWw(bu-L5LQG?w z1ZK>@zI0uqVfF?vRo~fTNFVR!j_;E0H@`0Aaf^A7QJ^SN0h8(-{+gV)G~w|R9nB3# z>*iOlBnzeA_t} zfof+ZH5a`TIV6_iLeW4qQsncvRj?=TjXXj2rvSrGU!zi&e$9ABIoyl`+Bsl3pgbBS zCYklYRJ(moCkW=&76{)H4AQE;T<)d>TtfPiXQR8} zZR&#Y)N*N;{)n8GTTz(X{5gR0do{N)x=VKm_v79M$`tCcj>fw?`?6Qt!rZN}#w?PT zWEjMXdD0$${KjZ=3X+J&^-ny8rgh)n~vAJuguXTo-D#%ruPzQAVy zigV#yf$DP3GERDu=DOlvJfF*L5M8ojtLY$mn*r1lf&tmAL38H^YQ(Y7q)V-v`pX3! z3MFsomhc;7c)`4`XOzOy5!bP@&}o1D;p7B;6{xH+TWc;-{hjVyU6_U%Q=1ER*;+I| zJ7OA-h^#0Hmb37%B5iN}$7cICGBG^Pe@M_&u60RtLvjw4(vfA72-6$AUk?t`c_*{j`0!3wJ6iL5M?V^l`HyT&9kSfe^!_#a%jHZ@%-e zsQ^RzF(Vqy!yyna2o1L~e_^?FFG;l#t{WpE-`K_#r-Hd`?zM7F@@?VU)>LWfQTCDE zC%FmV`|ZxelYw@;Tjrl}e@c#E2-h$7rQ}!k4QHndAqoQs5zPSb4NM5YY4fC?lMzBeG&%zZ^S`b$)ZIJef^&X60h z`B|IE)E}*=$(E?QZV5!8jFi4xF=zdb{Y{_jLap{RpwF|zXJA3HDh)KXBVzyXOeoMX zw(t}(Ft*OV_FEm%{e?YZH)}Ya`#)D?CjLdgrl3h6Y=8TH9@T{g%Ni%ai~JRme&)xA z4ULZP&~rXCt&DzwF(@||!9?mv^rlB=wNHEGETQz0Yntwx^|uaVJlc{u=1UC11iL8x zqIrQM{YYmQhk&_&8)e&N-?Vdw?tG!d+asF>z7cnLbl{k2-G2zLXBTI?88($Skr^3K z_Y*rSNXjrf^nCEG=yOr#KcI{1vh;AVvwEz3Dj2X;Ugd5~)NuAwaQoa}{@-xgXU|ha zR^n)i*DKX@m@Y-T@~D{I6WoBh& z1T)=9Yx=92q|2cqnnH98i$8f5pO|tf zGHLno<|cY7v9SnmEm!qv%msJW{uAEMP};d<7|pL$Em$OlJ}P6~u~a(39#z+2U$d)4 z?t!L{_5|X9GC22LMS)|TH>aU9D4syq18mUAa8=s&K5ZgdwNm@*i7EP8Gh64OS=4P9 zi-`IuyidTA%<--CF=U6Y9SH^4J={E2!w(e`-+8O$*W`2>eVp(sH2PWdpuQ;Gi(rJ+ z#7)dA+6+XK2#&R01m`bruuHZsvvFPwav3a|ZaduT8+E7h(;bfE)OxIqP#4GVAtTp5 zJXXuLobu>R*5&CeFrNY-WY;2iPl4nF9E(;p*Z;~6pdC!O!LQ`iQDNDIXv-Qq!igdm zHGzc+!@C0-rUO`(R!&ITCD7$u+S9sNo?$ZK0b0u=ijOR$!(oskk-5-T+;z0CEX~_f z<7{RLAx9-c?;aka)`zt9_zC-78qq5 zjV-Q0{oFw~MAAqPiVLO-vTxvnUjg}3kOCsD3vRi4Yh<+kg@yR8=hQl!kbYA4On4TL zX})|W;H5&3n!YbjAVr*tgiz||N6c-8O^}AKhI}%gnEY6E@XbKd>U%r>F zM|Yy!BT1|nZEduQ7yC&0D%c}XM}PKeQ`H9(!q|a4-7-s4z5o6UGDpEQG$!&Cc_T;k zQ|0glcQZ)747EeoMXs=~W8Es+Rp?o96@xQ3 zc1|Y4zv+!B&qa*g`W9^Xsjfa;h^!jYQvY`-px8siRcN92jgNyGW5)S;7OCetdM8n| zRW1mccbdHJP zENh=;KBoEK+2^~!6E`9azcHoRZa18!U42nI%P&-#)#d!*Ks__H;?88$kyVpARjk7y z*1J_}cKRQ*nOhK#s0EKOnJ-&JT-P179%xy&J@|G_>0XT#WN7aR{$G zchJvKoeX8LEOcaFHh=k&1Ba_vGwbS{Ly3zdlo+cp)Kjtt&H;bq>HK@YE;aqJleEJ9 zAosXn1G0;xgLJ0+**ANPvjb`Y663nZYQ6!yW9c8|)7mjkAqA8FU>&tjXqbAyTGl|@ zh6gKm0c@0QI-eY|cXz5G##iRl@C|lik1`P zKn*r6T^JIVickzt;oQ`u;z@T~ifH)-@K2R2yUyDm=Z1WTrSd2<#AvuqB_G z)CLYh9`Uu`+i+{mgTIt=-0&W_lyyfo(k53yRFFg4DQfm?9rjRP=7c*LmygzC%ejm5 zin10Tkuq(JtYPJVH&tdz+s3>d^64jy;aA#1W7dBPMy)H7yUS7vuR;t*8Exf5hoIFV zB+QpJe+;AEQGu5`g2LxX>M9F|?xj(?x9QAps{8J*j^Nv)qyuriAgd<|P|+pDpKu;+ zNWZ{i6Q`Bb^K%2DQy*u_*{9^`F`N>!g5|TqJ%X9kXt#76%516MuXAI~hRC>=)bbJZ z;kIJ`neDD}pM6h!u75HVaWC=LY?Q7Ox}Xbm2D5@Nc(dly51tgvdrWKgOy+l&h0Yb! zJOr2&M4Jc_S|oq%z3zORJ$%_X&+!s8hDO`!S1(OVx4upLU)=@x;(x&rJ9+7!o~;rc ziu(#~;>Y;zom@4sHpk+GGu~YR@pZZf$OM7Og1>giJ@<~CB3{qFT?}i!|8mlK0IzXv z^tyaI0!u1cB(1{961Zf6O)o{C=9`5Z+z$9^_>R|ludJhigC8p;n`mteGna!bfVYP#u95+MHHgD}!W_O*R#(#*k&NLLp^306XF)7kJaKt8n zDfq1L;zOnLLiy8GX)2b5y}C@Ga?t)&d_O6wK+cS2C9fzvts@`bYEOEZyyGf`t=HD& z88wfwgs9QEwg(_4kI2*GHwr(xPHwR4Sq{_8E*Mqaxeb zvo>TG##n|SDN@Wtc4LriSth%&7G*bHU&wb8)-{(5l zeO)&d+d2A9K|w6*`+*MSIZ%%evzRX^ZE_Mlvj9I|l4G`EH(Ti0B-5Q>6YPr|8R9J> zpEIr+) z2I$r9sv8$CP7F_^_ICNIKr5{c39LKagwQ&pc;OoTU@sPRXSJk~5e{{{?RlSzyL+a* zK}$_~ExcuLaIahL_TK?==az{<_=OF$5`*j${{Yn_y3EfmQevSGc-MBCW;0NexXA*C z(aHs=mcUNej$XS>eiD6@97H7v=k$FUJ)=JTJuAt1hj*TdQAMRXZ(KraB4s4XH+@sV zms!rE;1x{ao;VLt3I)i+g;q~67u3v{?5xcu@>miiik`*isId5K{SW}ID+v7`{P;8L z>NoT~EjEQ0>klC9fPG&4Y4cQ#<%{>4fPX!^$6+H()DfQV)Uip-{6V~_AL?XbZ-_3^ zvyrMa^3~*y7EEiO{z?v0Z*!EyD5x0p_$PKz8LZ)|cppUzMaf*G;x&Z;e24;-o$bQ& z{i`WSr>~F4m2gmH4Op55d6gKm35jBR@N|l?!|O zj`OHe4vD=adD=-izLUYC&(abJU#k16FKo8Gx}YNcxPLT4wykle9+C|D2sJjdD$)y- zY?d!-_kP0nBJX+=<(Ey^q{oZG2)c2s;-|8CD%x*nceq5-WI1-pt$VO%%Um%$rZuP& zFjP(hpXOv+l|8*Up|I>6rG!~ttz}Xhi-ZrGoAm`Zl-f`2LaYsbpa9I=Ff*36b^taa z5Vikv9lFt4W|bcczMmbumxA}vc4&kQTvbs$nx&VOT7s||c6j>*q~fnx3f2GHIwT@3 z$RYofUgfcVzr*+8=ITm(q<-hs&ydrqVS5IvN+82Q?;7luMo;!cT3y40-tW>9mu1Jh z%T~iFAVI89DezMET#B<|H)1?3n0M!Zv+gLZB!`+q1-+5HvQYpg2e-~!b!- z=T@VhlB1dTlSF`x3P-nU2fb8_u)-n6U#^2c?H>{iq6t-RVBlH;k~2}T!~*yv7v_0V zbG<=w!Rw9K4P5^4Oy!+JOm&?5hPT(@*}I{A#E#hcR(Dl0ibXhGX8~0B=ncdMr07uS zSs&K(xlSn3k?2!znQHm%<)>fXH=Y_#pPSv=;70p+v$4p)MoTn!G==rQ)4bjN2sx3w zKPfiBt?sRA^qkb$L;lp{6^>R<>DB6yi!nZC3mT4EkvK zMtObn9e_<^4!yK7;H$}7X$8~|3Xao8$>cNzRV2eCX6Q`XPUJ+lwr4aL51?yH9x=Hk zNS__cr7gSIkpIOy^)TL6f(ML%{r1IqKsspq?$4(utz?BGj6UyOpmA|sq>7I(kmN}2vM*T$VCM6etXD|>ajg&0&`fU%}0CwP7{6qc8E0;3*IxnR6&AWTH1(9s2@D0lSO8E4i_nzOzG-_vgCXA3nIq|J?)Jc-juNCEH?a*3sA9`rlZ zUj5iCzs@jj$M#O=S1t|sv;v~uO4GCm#xp;Ez$s^<_iu+7o+-QEFzOu{__E@k>$KSZ z&)V`mzti(i!t3E3N>c-dDPqXJH39yu#^<;95{^vF@49h_-{NJk`j4@a^lIzk_5p8L z{xWB0dO59RaJQDeEmFHCQii8^6+U|-A%xt2v} zYrMw|F5x_U4M&4cQV~mC zq|M^R(L*7cLDa8J5}=2_7{|>H*j1!1LU`IcjXE;5aC68(&$Njp7Tjm@I>lUl#pK!F zKPCpK=Ar(DPqgG0`_nIKFd7XZ1>Ed`x8Y1oDJK( z?zXyl1Bxv0r-X@4S*zB}Y3#}I16}s-(oQBDC+{2Ivy)^~du{pa{ShbBj1aqq&}9b~ zP&J%QU)Sb>@H^%$9t0dWwx{>UO2^7AzWEH-WE$}Xk%j(rCy#kz0uZ~j6q2msLut>? z{I2)C_*a_k@`Sy2C8#bZm{l^nsDV`_cy+`T0^(UeQqbzTYcZ(5oG6| z>@wAy?(W=4-)tIEYVK`GFU^5s5QXzYxmI0vY3Cf8b}_Bx|53HSL9WefEnR0pX)d2Rah?{6&OwM(tIK%}pzO}iiIe;^cRGz$c>bxA z&o&iuRp)+aD#=9%ZO?PNEeu$EGg_m0)u4r9OPRx7qov6urT0FtdE)!PbC~~%1MjH^2XM3lSE%NP|W)3e7VSXs@m2kPhZnWyKnfjd<(_)-G&xz zVlX?x@p8@Q3kl4wUux5HrqO@#v3Zz;FW2<^S&cWyPS>l_xxHDV(#h{ovs?4}&*E|h zXpFhSoU*scPpJ}7_sza{RTmCzJPm&?9e}5PS^Q#^(z3Mf(_ur{wl-eeX;gXiTi-xw z1bEuQDt20S*)SRCR!2N3+sA_J*d{5Jz{G*OS8OrhbxNT%{*km??;19lQT58b030ys z24wp2ujQi5jnd$27?vOBzgSV(xq;x^KS`aw;}^P7W3&xBCPdSTNt*%le9-ovsD2gF z5LLjsf^%rau{Xmv-_W@6i zi)?(w$_>}pye#G5*6w)~u@|Pe4Y-*lU{zY#l5+iSfu9FB3UWdS^M#dr=BDIYqq~!R zA5~NA7A@Mx=k2Pb-e{z&D=0=P%dESDt1ju~i3>~i=GK}_K+tH(oN?{DDiTc$Sh%kx_mXDZD_=$U{s3nE57fGn%rxMilu|fjc>b$f9rrvyQ31}i$_U9g3a;8w0&2@AxpqO3)8C3zf*Mutzw7aLc<|*~S1rIBVcX3gj%*FgF7-Px zd@>~VJoV>QkE|*+Zs%4$sgTs8vx#IFpg8P<2o5(xMCTt_+R(4*TbsjtjUvsbGmDVb zp`!0jM^Pr)rnYAf2+dK7k&+IEN`rk_B@cWo*v*kR?j}%M5N^Ahp!7_N3aCdoMFnIw zFJUU^?a!@h)%w1Su*ZeUi8Q8q3v|Fz< zwD7*!C3*@Q7{+#$k6lWAPE?tbT@l~=EBpc}u_5G~e}-FDKrr(x;;2e_gh+$7b;#+d z6PGD5%RcSCB(6Elb#o9;wE~lZ+Wu|FM*pMS*Wq(f;nm8t$)E6|W8reI?FMa5qTzB> zdt{4B`Nz(dd+nj`e2iDVjn&Y}soCYr>uVh<-z0i98QF14)G8V2Q;J)N-BGN5Y3RgJ z^2udP^SWhf?ycew%7+`3b>H%o(>l9X*ZYsqTEvak2Z^HCCqAOVdTy;7V;yHcPiGcz zELIux9<7p9(5in2^^CbT*zxSwd|YBiv&2#WJMdTyY%v6Nf{fFZ30MW^1VqfKA1s`#cW9Z8R+#P*lH%RHjRm61f*UWl?7cs zjah;H`6+S1)E^!cc)#z-`9o^_5B*pqmY9JGw><_C6-v1<8I2R{>t7Oy< z|7`T@bI>IR`HQl_>k^tu)L&P}HgfvD)tF?KcFkBn6q{S6Oo-o1gf;dGGHE9qp~hVI_cBM4UW?U52|d(Qr$G)6fwMAspP<9&3GWL6r4n#c?e zO-o|fyWpWU!R`zaICU4inHOA@Sjj|~YhON2;qG+kr`{Cj=+0ccMzZ-I6RF^~kca-sqiAi4j;|g6NH&q_MXP;opyI)L#H=Rh8E$auIQE`(f4=1}?l|(rCJ2 zDtUdd0@TcA<^7P5cb0bQVwV-L^|`Yzsq_QvNhzV0(z&Qb+M(QL}LX zo$%K3t(M*1GEtkjOkM1I=RbGq^J*q&aT_z+_oWYj@%D)$nw;XJzAi{A@>EHV7D>xF zvoo!9!n>y{v%O%6T`JPK5*AV|J3UQ4!9@#8q|PZ48}G}E`J28Eh%`lZew)@Vf62w-DHH=*X4_JEiv06M6k)WaebH1=<=r} z55gx&K!mtek)UrBfHPSAtwQEcPMY%~{`J$7J<*Sss7?I$Sd4$d2A50;Q_~60WI1t; zt55m|2=O6%1*P~S`t024H;V3_JUV}QgE-$YReY;Gr0#oYkMSdo34V-=Rts`^a)lfd zA%1Ld?!xVo&z#(LF(i=__r|uhtd_3e`>2L0V~ri3-R36v5B|#Zos*FI&uxh8zmYSD z4OyR_jZ=RMG1iUcmkoBiFw$kwu+`6yeT_^HX5ryc9ttIgoO*WzaLM?g2KduFy;;^g zCOmp$b)#P>lbv!LB%Dk2t>*jU1V|u#(5bg7xRtsvGyVv0>uQXI@N}XNvNQ~v0A45$ z{)wDR-h>=aU2B2$khBqWdc!Y5oo^5tGgjh$*_A)Ye+kPHzE+@7-S_l!NcigRoDoJ9 zo6MTFD=qN5c>Z+m(rus>33s3I_+5-@b>zn;>hRh06#Dbeq#~mo(j2D_aQS!QS%E7; zDH?D8t*CZLshi(tUXH8={W=GTQmT|*8TJK{5bN$g86)O*IW`F&x2XHS2A)nQ6|-2zNn@L9ebdvpJ3y5ebv&C2%W2{6pp~X2DT&)zW>24dIOMA6e_e`v|CK4<^z0;c#JYHK`?SwPnGS z7p5WufQy>eAn$uH-u2Niyw9f{Y8w1q;x$rLwRk)Z7Hpx*lPCLbgguz(u2v1cq==}p z`YbF=&be>;;$*l`b50@qqi5wsotj1?X@B$gv^Tk=fApKIYpf}(Uk`MUW17l^Bow{f z1X$voLiMg=K8|tO7=?_9^grgyr>nzw0Rws)B{fQ7MW>_nu`50g!UpcfvsMphX;qsk zl5hX+p!a7bD~9OEntm6e2l@nmsd728me2=Yzv|W16cG0WXl2|wP*Gb^E0#Kc1 zd&;}V-{BUX!z#VAO!I1f*g9a+nV9%qyPDqn`h5;q=a9dhAGys3k;w8g&2-Fatw^@B~dLxFYQ+7YbUTiFg>zz8iV`epcMBt2s_*uT@ zG0C-Osr=Qv6aP`G03W+j62x2NcZl@0j*PipA`EZM2JD@kkjpmPDm#PS#wz4(?WjX2;+Rn|B>z3m;?Jrc9or^m zT^svaoNc^9w_Y-Q1+END`4lJNH7^n*aiJ-#HUHXxlyIEm4_Do3A|#CG>(l7c8d=$p zLglS>`#zj+{9{ver{uZ>;__lOQw8=zwhoEUQ%ap*5> z<(0yIn6cNJ_g<_brFjBAXM&c%r7QGP8Jn|1C02o5wgk}Afl(2Qz+Ag$kFT?)XEjMW zfWz6V1d#j1Q=kdc)76#5NvyPsa0^N5W>Od0wDhRW=)}*C3-{%YOa09q_Kqz1$AzRn zWP|&@y3R{xk6QK?*GsQC?IONzs3!K&48hCTA5-lN|Ie{wrr2Os6Ib8SvoGqV?!}fd z_e}2ly_Y&?DAO8$e)gN+;=Lk370NYJMV)N*$(tFMwv8GmZoK3%1JobZ{$ellwM?k9 z0A9M0P^_hBS;u)o>DhdN9!cBRU>50Y1x$`0;qmIyPfHr73L?VV0G*vWE4fU1{J+HT{(MmT@whdA?bRnjWbpK9ZU4kU>(F0dD7Uhd z)Iv~j7zt^|4styLSOMLu#6wR<1nUGctk|SIE$=Dc8i8=f<9X`xCrWbZa`#bOd9QwME#P4{ZV32{1X;!=>7oGc==sq#-{Y`pD>o8pfx7~!tT ziRIM|7}-a#5rN>Ky0oAJ`!w5Nn{Jj~&I@&etW~GhHI8mSm^rJc<6w8rM!@SvqJ$zi zi{KQ!uq$oYIAi)HR&7Hw8{;59XV)ms6+2$w+0=XW+1rx2qv^7EAO9@dtc#XxY{NGB z-0a7&&*L&r{?7lsVbV#H9_p~@?qO+}H&paosKoruC0tmP11~!Y6%M%E06>6lQ?+K# z{N_WHxb2MiLR$j#c_p|o+;hE>rh-?K?=07~85A7kF=?fo#-7winMCJZzO*q{vgX~> zlHcw-c`uoDZ$w<-DoRrJaD>>D9sUvUnLSL#@_`Dg8ZYZ=rZss|m4iN*M$cVKjYZ(> zk0mgGai)iTj@JBaDl!uH7GLcuYO~93@Mf@GLQ>4W732k(ohW*QmLglgY7v%MQHFXJqJ1l;2N%t(gKME$DNHE}gHbTw^QIymoaK8R~kDBAHA zc3&;j^dhr6we^FZaQ)sqN5H<}xHB+M)zHIGnNZy*>_C6IRn717Jd102*_UT6Dvuc9 z6wbN-;vqz(HE@qP6!El0?^PdTaZ$mrg)O4TX0Tm&u%Hyb=vW)ED9s3HXPJXIWjcjl z+E=PD*aLZxWBl2p40)zjc&3VZ_+HE^^xyRDUN#G}7E>la=KHC1Z0HWv{dF_bJ+b9Y`nNcm4~q}K_KQa+>j90*=u!ReO9%c2(L2b;8~G2&p}m0qiVg;)Df?^Pzo{|H zL{SKV)Adv&A)-vkOyB0X?sx}TLEn5ca+lZKrmJ<@YTk*;?7|3$Etf-XtUmctHlm&~ zf%$UI<;%#!O*`4bQi3r^19{=rWFt~)1e ztyZ#|+{E6?R?j{eTrn0}Tn6k?^RE3lG!NR8^j}EZRr7f%Q7KGicPkO`05x!^nBCQR zHE{}wW_c2*5xv>1db{0%YnfX<;~TQx)$0D!YHb7*BmTNG_^i`<_*e7hUvfQ!&?>Xw zGm{e2#51VMmigzG8-ZAO-Sy%@I%L(DU1cR-!Z&fdg)80yBaw{EwC}*EjE%YG@EK5? zFjlnFtJ>`dPvac5PP}2rOkx^axR@~Sr>PVZ3{)#&9b@N{5YM3A&nv;UpquXu19O4? zuJT&z-@$MZa2Fuea4jziDse;a_eOcrwlRCQzKvJ=X_cJp*UKZ9{d#K&dcl33$lz@3 zZi3@ae?0B-@98#(MYE8F4*y5toXtFN`|h36u7@2qhAQ<#a)h~Vl$H+gNSIt{Ef&w3 z=C4_j)(Xv!y?|j?22MjJ-CL`KB|Kp|_sa(yW|+H-Z69><#8ACt#cHLdPmY!ul_s- z@!e0)-a&w(9uW&{b$|NveKdI zmwE<2p*`vlQ>sR2r=Y8ZGh1Xb-+`~BxL1|2)Q@-4;NA-8t$t0_gNLPsbKG{X(L@Kn zK_5lwm))=)yAGSa`E2DMj_|%rSb$SzUt<=nTY{qJEKY;uK3+e?wdO!`w{knN@Vf z#Is9!Usz8xd$1qD`mN~x&Mh2VLGAaT?yD$obaw!(p`Z=!!Z1(ih4@8;O*5#8UWV7^n_3eAB*^FqfNGL~kZgRO$`J7q2md%YgYge1l?E4vlfMsi`tFzd?@}L$jgI>Vf3+1 zrq0Qdk@f*RteOw?o6)llcM~nn*|NhP4oXtL9L)f^I8ir{rQ_5u=f0E`X-1pTmETBI zqov+`8&X*D#=tlHwb}|swD3v^sFI{q#`;T8+YTr)4_o}3HveNwpCF@%UBCAyo%P>y z$iMH}1m>MxWzLS|g(M}`X?s}lOz$_vy^%l4H7#7qPVH6>b)JFfj9b(jXTRj1^5dBz z^Gs#T`j|;QehU_;Tr2YUjidx13U}yx-qNyojMT~2si4_CzLI$aR|~*T*?NIM4Na}X zjceZPa3r6rv?dH}6lTMQ@0F?3x}_~(RAG>X)J(UJMRnwE4y&HCEiK1HjR(2NaS9=* zatSp3uQmO*t7rg?MeYhXu( zuOnC{D&=^I_Vp{*gss24RsHlzrZ|Po*-qt3et&*esP*=UKjTl={$u?lG=P;@N2F-3JA0`s$wz_#>a}pV@zjU!+eznQHjYG%Svz+AH0(DaPRBB9_T)Q9IPJOG z2X1G~{rat}0cH)482qMas<= zG*vGbUCckTUUKP=Mu5X`h3@0q=~2|jwb@aEDvm8xa&t4c$roV9{&p&*`92Si<-u7d zE=pGXgu_n#3cO~#ENElP&v%XoBH>unFDP)?^PId|MG=7!&uCqh+ORCYIoRM+t9$+))Ec# zyBwVFWg7J=B`k;M4qGStX|-+Ci)S)gnK`(4Nlv1w?FregKh;?$KLLLt&a%|7EH3ej~-7h?vC>chjSEANzz!)n!JxpN`O1aAmWRdT@KxQ0lDpv9n715UEVJ zZzo?F4<57YlDqqW$L_(|b-pIR;wc<(aVk6UxY>s_2N&my&nytYkhfbClrzfZe>qR8 zHWz5le%1EseW&cw`$t);SIK1dxu&tLtu&b2B}4zA;NI4mr#$nJ89(%;J#3-i?v81M zP^OYt~=ljVDd3~$VH6UMC5_=1o1_WFG{i5j5f;$tXDW^H@<`Kqwd7hD}v^Sf$VPzi1d~dP)N1o%q?fogS z0H4h?{=J!{4Zh96yn39a|6H5Ny;d79QKhZPkG6*K^kYUAOoH!AX{*+`3NFCs(L<7jp}^@3kPOUZOm@a%U?m=_dR{dQL#UThoh~-V-|AUl)`uS z0gXV7M>cuf{PwxY&Y(U?lZH)wEICSDpaQWBC7~1S+q)C(D}d9W?0JL!7ky{PL7@Pb zA=|Q=-`IvO1}1f4GFI0D9531=Yd}h2F}yEeDN#>nNsdzOTT$wsJNGErzNA_xlOmc^ z4G<)Y?HAlfQ9}}Z*Et8p{eA90gS{Ry_QlT&5$c(d=Nv7&Io*5P5?q~CTt>{QC2P|6 zB|98J<!g%~MRy zOs^mMu4}qTFX1fltHlMW;qI7~~`A*4Qq+PtOx>^KIN`^eiohV~2I~<>l z(8Z$);qL((;yDKIi@9m(t~&b_S(~_7b=|V;a#KNb$>XQVj;)5G7l25rNQp^=~SJQAOYclUT@>*I>@TLe(NnHHYAmPz2MDoyFjN^b8eA|2t$%pw# z@R5E}fGnVJSHi@DI`{m@i$?Khn5p&l;)25rc$*L*xO!I=wV`hiJp1(fhrDrKmaXol zd6@hRlP14>XJcmJ+Al4`p!IXh+Rlf!vV}@?k1;i@B|&g=UZGbjW+9PsX>u)&G574pOvT|9CPa5_j%z< z`CxQB?dKdf^u%;1gYYoiwg@ZyN^qZDNzlxVb{UkK&NRi7T?WHq9%t5TY6jKfyk}l( z8`99}gED)|ZdsQJFjWD~Nxk`89pCtY=b}!~6))UKU@wa7}{hh?Z zCs00PwH;EQbJr^BF6lNMJD0Uivv>U4(Jn2$#>&?<9?4O}llOYWgDX|Q@s63*#U_2= zP}vt$LdH(_woGh~vvbsKP_NvWmd^Tj+zM81)TDFc+%{IvT3)4=<5PX7?$!N$vVJ<^ zjJz%9Sw0rnIRpE?TXHw^Hx*d~Ds^PaU^I!v0pc0QplkfkC(k+tO@x-l!`WSVQwL|# zjtL%>nDIVI<%`2}CJ}S&|EBX%PtW^1K8V=4D-is054AHVXNO`J&$T(m{q@Axca84O z5s8kOX<>@cBoR5nkl|eItL*KikEc1}cfyRDRnor8^UJf`18r|9w_7Z4N)SJ7Y(Okh4lTkzV|4gmxmh*0b(_tR+z}xfzXgU{Lrc>Vlo4UARm?8A+Ak_au$bGi zv%{VhU9(XW=>jh@eKYJ58Lhl~_}T&49QhFPLQuA^jaD5w$?{__G*K4!%2G8iPfF=bi~!Z@xzLG*yE%-byx;)^}K}a3;oBc0>y^mznvrt z%$^Kmz#fnU(~W41nqV(N0PXk2H3_>CL|BufI3LLJofz+}kteO(Fm1d8-|)NbM>(E9 znt41j`WTW)FuYH3fB~Zu`V-vWvZuV zaRvqA6uSa$6nTC)C){;UX{WV9v}>#2WBnLBoD($rQF53j8IR8%_7PXOIT zZts{=Rc^q?Tv|`3&+3*_;;gyB1Z27BVMLF)aSzkD%^o)G@s+p9>^BNlB#yN?hF=c! z(4941CF4uC{NwT57!7(Dt;*wcyn!~K*y)C;3PY6n?R39`v4pw}QU09eQ|7U2pve;S zMJtoTRa%Ri$$NiAN)O4HteIi!Fv3qz6X3Sl1FjwY%xk(<ey+-U`wnnAr&%1v_7}yVmkz)-3hHkD3ca^Yv?U zZ&~MC8BgagB?W3u$Deyp*0@B}nlphKyZ-qa;<>|0kD*0*{4FP`;XmylTFRI4M2}EL zjTTI{^Sk%x$y8l)8J>tSzGUv0Cw$YxN%kF?$qh$H^H(FPB)L2!tohluOS1(9j0#1Y zyOSzr(mItedDGTUVd6h3O;lM`<_ru=Z^uRmHrqT!I8TDCM{sm0OmZ7KbMPTa!En=f zwv<30ei+BAMOm0wZ9_|Ub+% z&;OqShxqF>cE%i$VwpnK){No^@Zp8Z14r68CD2TeV^PixKl!A-;jf$usqa)I%DDa3 z_uGsup!djOM=7Fh_(;^5TC@>F@VYPjuqCYBTYRxRz&)RurmPT4RKrJXR85)Yi&s$f za3XRt*VDK!Q{(Z1*Gb;4{|DLM5Z$vsF864Zsj!n7 z6&s4M^Z((vzR3uDd(3f!d-WSVvBW*s`MM;C_3d+U>{0RSM!bLD5rf^3RyO?8*#)M< zhLZ+3y9sX$N8J7Shh>h@$y>RZUOzI3=X5s514X~5MA{n|RLrXQHW$Rqev7NHm%XT- z55>RntLaM8kw((0BO>5mVad#h$_hh+oiVs?tN)Vkw9|tRzV+R<2#SyYRt_;(S^!5( zL$7Gs4@i^@HJ=5B-{_+-d0;tj$%klV9NV}R@`J9{cgaH1X5Jw{Kw6R&HBsiFbz%WqqwR*P5o_$f88{|xcBl90*%+p|eU$M|4@ z+|1hj`P!vzv+(YtybfibTZ&@NI=a6xtG?a-;`XSZ#Qi_HGA%eG9*(dta`Ul9taK;* z;a#R$0-H-}FV(LG4-!1cc*kDdfmt{zbLZVqw7>0qvBO{zRnp9mITMYBA6V>R*j;>H z3~j@k-;xja*`JaC{e$JVPswVSzyE48L^q`Ul-yNsSHl8?FWVsZYADzE0dq9qKpx@I zW!t7_z+Fp*`Gw_o#O+^ar^|gB@u4TZAfcJ57yc@gWbvys{*vh99Ag^I?if!g84&OC8i1K}#2+ z$m9snKieAK1IPwpLIaSlbENN(45S2;bH2G;?AbxoS_gOd{Ra)?+TbP z6}P!~?xOw4F|lR#G^gD6sJXLKVZxoMuXrQQ#jA`^qmX4M&dlZ5t&1laz#MhUoO>NQ z?Ot^MjBp_kvN-6INkvG_;bx;ERj9ToA1mU+B#b_A)R7c?IZeksNg-K;lH{^)Vr$#H zHG~T!4Z~NAa@of!VEdhLqs3?u-_})kQZwHoi)G#rbEwma@8&1(s3LHLthk-&1Qf@u z1>N~fls@a?re`xydpU4^r+*4)kuX!Oospy0%0+FgwdUfiVMBcJCrXls4-dIdSob*k zTo@NZ#O{OOe<~9=nEE}z69JNi^&V2(3+=xujw0MW#;#(8LfVDvf_z#%d5?u{9d@0f z62W#i>8|Rhi_J!JvxCy!bi2r%472mmnWS(fNrttX;$3NS=AK^#JJiBS6j`G_uTdP+ z1uTboxFf>{Y5dAT^kTBPFDUk&qVb{{3)C>1M7~&8bK*|V+f0!i*36Fg3gmQ!W8A4v zc5IqC2L9^27&m8ME)rLa6V(Vg3V80Mcf{bYPl-Q{(|kbDkbTxHk#wmMQkHwcdVG8# zBtO@&sB3X`j_qD8CMb@K*v-B9Sri$3EhK;8W5stVR0=Anz>dNDnOFhoH_~d7*`E2( z*;yRVvv29Z6muH*-ozxHcUcM=1}D;O$~f(kci=mp zQLW4~)H;(2PD5N=nkG43MvZ!YzF7Ee5)~JM-{7&2IPucnwLR+?`w{N3Jmj-0Csv^N4aY)`Rwu?%hsWy~k4AW_+pU&1?FPr~JeKy!h9AeGc3kuumgQNLd_fSz!HsdSk@Q&2@o&9jxk-xWKYSf#{ z$M4ZV@UM|b=3`CjHAV--VKNpWJ>X$tl6?D-?X_}EhSBhZh{Rs|QvOQlIWMSM(zCKg zh`HnWXx(P8Ks4h(AcW9&p{90aYtBnyV9PH#Te({K_53LgAM0JwR3a@yB$@HA@{wQd zfAQn+?BvX-zy8T81JK7C<=!SE7E@RS-{OOJQUp-FTorHb#Dt%-5bXFJm&0W*cSH`{ zt8L55!R2wDFX-c}O|So|=``<_eTJ-DXtUsIH9V9RRo$@v!?4DbjTERGQRU>V=2Y4jx1#x3oLI zhDxdXy(Hy5@I&eoa6Qdxd^NAZ!@0{XFp%0vDk`Zxo@R#U6(O}0aXrtUh~8Gm$w{F=cQ#=`_(2>W?1<5|E{H-3`S5QC+=PeOR4>-}$A49ka``Et>DsvxY zV0({CC?=wIMppJxFSOObN~#jEOE=SAdavxgWIecWx41GV0d6=#SL>ufd+*|}(3^H$ z+_~ZBD+yA*{dKH;|Ypv2LMS`qF-&BQS99PGntzm8OUEN^A@%W6)ye>V{}UjCt{pApKycjeC3qxsaEe+Lt3(NT#N@s$;MMX02x+htuz z?x4-QQ$@e>c#RmU^|kJ56;BwdwYh3h?jpk?(6mBbJiNE%cTcL$(!(-zyR>a}M3+4T zxKISP=dq`xI*=F?&af}>*>%(2hMU|6zIQ5dW2*%m@XXOZivXM#uW@WM++V4Qc}5)U zuF$@%+i3q%{*OL)&(hP_akzWNkVtxzd-#r@%LvotSNqJr>x3%lbv?Dx!Tc6ri#}rZ z`540E9c|*R_k3R2l6n2Zz*T;=qYVdA_(adeI~Wj+<5z{5+utJ*;>K6(SYgrwU6-l< z1whItj`gqpylmn3QB>oD^l2M?B&!;?#Ai#C%V#TOEG-*)Yn#S~zKP{>~=9c(2=9N0CML+_H-y2=6qW=hg%XP+#6rlp-PQSiyGzY#?TeBa!31h` z#l2`_={h&3fz*Qa@rpU3(p~!cOaJx3|JIp5Z@lPe5Hp0|-XKGwUI}eUnPui1pkN zgk0pC$I8^+_A*ehoBCk=q~C%Wx&$3iYW2OmXwZCjcU0ACM1PLFVEbC-QlIoEmY||@ z^2I!zR(CI?!6n?k+eL&eD8mIF6E8a>Oy$I`gTi1(`5yPmr*cj})vl$VT-IX$d#NzF zB3xTnHv940d~I4?y~r?BaNxrQ_5)-YmAsk^ z*sI}wi~MlLG%Ei#m9n<=xC|4XA^E;k!3)WB;1}}xe1(#WDvCsp=56*5u~Mkr)q^OX zd?Oa7B8-?xC#>2_K2uX{6t?Am|D0vwO5kha?M|95<1ml>t9ny$0e_SE7Y~@m(4Th4 zziI2RY?eI=Qqqi|nv!iu>eJhw1R6-SajA!yr2>6b+ir9>q|^4@SAZ{b)~!>WCE`~3}k$hcyfa9lt$gv61>E5@gaz!PUl z_{8X;=2LI-P34g>Nwd>&U2gRW*0_Wumn5f1{1r@*=xtkJX+9niO0)|}C4URR?#-Lp z&}HuT^ESWpigo>H(x@+sd@l~51t++uf{pM^!5f87%NJSUhDss;+!DL%btQ3OuC0C;?9;# zdottu{4Ys$Dg0`4>1?CWln*3ta5rERVwN!55%%(Y7web$nv7>%orRGt^bE72HYOe~ z_MKwAPV7X{x@0B`H$S)|_N@~r|97F&hmtcqM6^!)s!U23zJTnEb~IYfbTj~8$v9WP z!UjWWK+<&vK*ETHtF{lcL6pTzh~j+XOjW!lF-)`bA&KLYwM~{GllE2#)4n=Ax-(~9 zGA!(MqZSs-cbik5-k{0sp*$H@(~K6WFmyNc$n@_#`m8(toFvRGY@nbmL7|t>EakA? zd2IqRcC4*9C?l~&&jrzAZB3vdCueM5Ct?V>O)Lmep5Mo2+UdRA%`!>3xytXYV*l@- z&#A@-pK7|to|MDE?{GPKUYj0DMQQ#tG}jV8jr!4WGB4tHBiNzQPO4o`rx>@BPElfbQGGOhx1Jp zmWC2?VZk+lL=BJK=FVO_*k!IH9k?4SgU1-XWHT-IDy2 zXW#z+@7f<9!&a^}qb|>`iXE(pjdJUn%T|b{M=f6gbwa|fJVIF?(c$Orgals+w~S)d z)WcvXtX<&b=vvI2lp`BDE0jJ zSc3|)%V|kb>IUxk*bPF4%IgD4hPLGGCTV8BE^Sqp#$|QecCG;0PW*W8HlpVqsWN)0 z2ku%myRJT5iTmKbsVu`J0N-?cW@6v0EaHRc(!w18)5(0dCrUVz{1%S`MGxKL#4?+Ya zKKTD@>f7U){{MLE+eJ6z*UeqE3h9Em&aJ*`xI*NYJ`+gQ2S2aT=Mq-owT;mw6jd1KbK6=@aJ4QKY-tOv%#8R^MrP*rUoXLRqBDM}QSI{U z@bwS36u3^M1u#y*m5%)2R-L?KmpNB=QkqSN))4tAe_#DlMs4ColWf|h`&>pCj{yf1 z&g>EkN7d5c58UtYL8?qxNFg1JXfC0q9=c6=N#_FGE1`@*-rvMO0UY2@Z`bs!0X(WF z*ZH22eBpnvzo06v7cXZR7k|@=IU3^IB6k40SW+N-^n~-dR}CxJ|2$J6!7(Qex7#^6 zqLUS^pzzaa$gVqjes=XQ85+>HeanVJl4%svq=rSYu{snerTaY!X*vY}vvLKi-2`N7 zq#EH-^Wv{*XzF-&o2q)%uu-{)iabmF+ZE{rBhE}nvXEES0Ly9O9kR6prOpj}l#3Z1 zZhfLzq4Od5ClA883h4v(F}z_!hkpIG;C@I8vBYpSw6$pt zs1t?E8)<1th#lBor|J#&5wMhx3%5g;0LX9s=hY7*E;|4TsLki9DBT7-z*q#89=bx5 z!N5(}tvhoi^i+p2Yk-F?pXiDyEe8FkZ-qOu6B;x}-}A&qW;;2*&LgL!2!D(kbqOGj zXF@!w|ifjSP5mZr*H0c<9MY_2wVdeQMlE4I4YR zvWOT(uu;9-F>Y(J4lUq>NF2p)&9%EJFS?|Y;Mr)wv3cHtO-wS^rfG5AWLV>P=DO2L zo00d4*I@1hWJ4Q9oS#?z0(9RC)8SMW8-1B74sH(8L&Nb=5sZqgWz)f5IUh$-KTU1BA+yt**j@+|5 za<5r=3ec$I1SJ_`Xp7OhmqLprrQWkg<>?L|k#>;`+eIwm<9F=;Cnj!jNW|x6aF<&5ml+ z`YzUUvNHQeqvAFVQ)}O$!>PN>QtnFDpHH2vUf=$vdS{{ zP02X3rPEA+L_etyf zn~N^6!wKF@6~ub$BA~%wbtRk7JhOwFhv0>^5Os^FCfaebIYm-^A(~VYoUjP-U9^2XSnEQ$Fm>4MzZ?QVp6Fd-W zDV0n}=e6#t>C^$a7fjJ?p<3=$r;`xC-M--27CBHaw_6<0b%LSG&5l zU(ArdZ#U0V327szob1p_NINH{~j>Y*C+}29gs^V+7IGd((Hra(xZ5_ahMn?Wtzr zA>LA=E7_6(FU(|bh>Ldh+P;GPK|bKCaBaWdTGIjX0jBO9v!PzC=1;kUKw*sz zWNuH6p+NY&*%AsdXgCHhzmD%x2|eE%SA4;We*$HtC)_F9eU3zbPow+*mZ1K-9AElG za%X&qZ`9+}J?2Z?dJ!~6E^5|%O~wJ4j4jk~e~s1|0juaOW56RGU;;y_8ImVjIiDWh!lzW9?M(*jq4(YSNE&81^9on)? zShl(Xdg@PMZQLz4lXo@A2`Ce0F1n`?G4Fzt)Ozod$-)-6ZAjr@jmGOi&euKzgS+Cn z$ji@pY%Xg?>MgEm#KgfGC=Dt-wnDSJSf8X*8EeE>Lp`Q9a@U?C<~wGy;&ggVG?5TY8|K~nCS927Ei;MzRn%6Brz%gjXN3|J z4JZ!TdDi2BFdPF`&N9C9hC`6M{@mI!O`l01G4$t8F!8{zhN^2xX6K`$ zm4eKoGRfIsH-d=%Ot16g`r{8YKvZNDbRw^lQP6l`!tPt4z5Jv&L>Y(u2t^Ohtn3Qg zqm91%D#kz~L~)|}ldUeK;?>hL$sQ+~N`8Od6X{ncYPyr){7S7D4q3%pfx1vBED^1>Phkj0g4{gROk^uxEH8* zG8dq8t!k2fd#TFyzdD(uoRe~O?S2?(Rr1X5R-`rG%Zf+E znSQT!0%FuSRhnbz583e+scCi@cczR5CAQgbGI!>E!njNv@5B~V^Nq%ss-!M6yahNs!r*t{30^s+k#{}27P5LM|_}Vymr&P zH=VL?xSZpAT<7HG;TizijCk6yZdLCKbwAgYl-{Au6?2XyGgR5|&&AVDMpmW9?r9r? z5Jh-ERHrPp_q7t?beD)CONAh#rP&qcR^j>G|7CRUxaYfDI=L=3P3L>bNf;)%KT2Iw zf_~f|4%DUAOl?yIl*+JKz#2HCsWEM^hK(9AfaE2%&_tQqC_P6qv9CLT53=T-Mz9B) zXOi*L&tz;1;+Fo5-l#njJGx8p;fwyO3W~$qfP!mi=I6EGi9dCLEqnA8rdvGV-->&W=!6G3#lCY)9<(u16_WuIyU(lER z^n9}v7XKdp8?8GN8~&8UNszYB{_|b#z}wbkdl$_PIq@%1W*vzI-d$h&8h$||PLHDm z+1u+QO*R!jyL}ty(ZO?5zx|k=KRS)fh9H;FgPDWfz$DKZn^P}Cr#d#$y(jW8DwB^D zMZL0?FLLD~y+Kwc=I(Ka0nux(tujwkm~nd2p91zuLZ(J^=MQ%1-l2^HtuMEBQ+=%o zmFm?znY=vyl9%fe$$Kbuo-Xf&^>aU(BBIB?E)K!6%CKMz?)hR%DCzNKw&2mMN^#Pj z51g~|48!oUx8i4vm~uD!<5wQs`0Uhv-mU9IBpuL!Zbpr}Eb*lm)E_o=du*gNaH0wQ z>KaeiclgB@blWl;+OmB8+=<7!iXRFkueNf6@VbpPytM(kQIN=#$0RQlal9WRbu;=k zB!nOGRJ_}=ypx3|igy(@c+KvfUhnvLW&0E3mQ&h>OV}x$SY&SF@y*Pxiy$Ksdk*fE z2=rVoGi$1_Ua7X=nN-SB5DiAXLGnt``(8|H!$(k~2jd7Riz}<&_LI%DhF&9dqpyPe z0X1;kG43S5Axg1Sy5<1y`3(9xP&4OCu<9%O-OIVl_oMDH%5e@aldc2&Eu zEh}zz@OL7>EVYNFO$n~(_;d>_-57pXJZ*%L!kh55gQ@dO)cyu{n7)$qOOFiCb>k=* z5Zv2ueUNee>wE5KgmASI7OW>}k=H|;%CBcto25l+BxKDw?R?Jq;v1v&{E*O@x&eZ%#DSOoHhB*z}?JjkuD^Y5iBs?!q zwI#tG%?!^+XtT7)*nb9^9EMz`bO&n0rd_16iE*zX(fm$z;jklv$@x)v@Iic;KL-Pz ztlSNVp0%tqes2wLi-M-s*`^bRgk++=8*B~K@CHgE_kxtC2MyuS?%TA({v9`#DoarX z8gCM15cQJaL-J=J%~M$lF&4l}czrK|CHHgu4Hp88k(3_c$N8Lz=s(kj?-WWc{LRh= z8jf@F<{u37kO$$FIXgzjsSn#s6#UhO#U;u{8ymbQ@Y;PB~h9}#O#E)QWe8~(9qt|$8H5l$StADoBV6;&(x;{HAeV(FzC z$dfOF$;Z#W34u6w2QV*D#80^9gNW~}L|4&Yg@FY0MK&^86UlhwBnv# zShBq0XNPE1L##~%E)UMH-6L&)XI{%muU*um4Azv147rGFJF=Y7bd?8gRcB{K+%o$_ z*pVh)0Wa(XefZ(w4LA}zatz))43-KFYm^&r>Y2S)7?c%qN-({f{3~m@cz=V7YVu6` zsP{HslG~^MEIldC*C6jvL@d~chJz+lI9iloiD4=C1 zNF5J)$OHHc2+}kmFrFVq)n@)^h9Becxpnp;ux!qU+ZRctRhXu$JMQq&5o2c};G-97 zuSNMv)o-y4mJS_hWB$?E+^q-FS41LSG5+`vqzPJ6^AbYNNDiwFmC)@3zs@`uRUzlNji$~3)KYbclq^*S`0d*1$zhg6~ z8O`yK`SV!j9^xs0Ud_lYX-}r6%6n+b1XVtDlx|fgxM_vdkm_fT46{Pi{v@g%<9nIH zW5MwXQZy*?4a2%XbD5i^9)@o+x{EA3mi(-S4GwV2*Py9V)Q( zSAhQR-TwJyx?WAm?gGj4U&-EJuj4t)ZY8%MoMYn4M`v>$)0`0YeG;lqVbN0;@il3@ zId}joX~RVMkVm<2;^D%P^5Hx3oN!EJ7qj2t!62$kg7Bj2yFPZ@$F z(dSH9M<;|s1ea_CUY1$P45)Mycis%ny+;m{pJWbfUMunHJz;T$_$u!O5zlh#ZMikn zJpI&|3?6E&LwynV$sVBmo2o!~2&ee%a?el4AEQU903yx;hu%JO03`epwHP-rUqr5+ zvyL*&<-OfQwYBUc9ixtS+rZn>P24_h;jq6e&d)pao~8UeV-MW2A#`pcN=Bh_jEa!w zRSF?ZlU0wu@OR`?#5{@9r`kL>cT@;&Qhy#EG-nd`8ii96=BhpghxXXQDj7B$y1U=Hj7m;%SF)K){>SL4>hPNJsZz!UocWf z-G;a1DV21ZN>F3H!C06yUEgeJ;q*UIKqQ359=8^O)K(DR0={A;X4+vP(+=vP-`R^XQ z(@`hnz_p`^Q%Xz1{389mv0;nALD@fg+v9qvRYx?&LK<5$JPsC0^r4P_Zj9`s`L3KD z{ij~wicGVga=b;sgSHsE(7}gWEbyO87hlN$OQEOX6W@hk4?1MVHTQc9E^GyIsMR?| zmB!r=bur#`nXo~)imCWwhdM}Q)Z~iP-nFDvEcQ*&Wul!w1`mS>s>DsKD-3n@DbCi+ zq3Ir305R+(CE+WhK_{@|?T2|4v*Z146xD^}!>dVLr__qLmPMxSm&>ywb8Ek}uachE zd)5bmOH*PDNy*?hEh-@!x@Uf3r+3rwc?x-^@$xeT${ZMA6QqJ8t1$EQ36OWOIDtz_unQH<)&Q z47+KSE%-9*2xFOA4t;cl6@nAloen0jpf^398yJXp`ssQeps&DfjzOsrUQlTzy#?)_ zDIdadSW^(|6Wz38U(zN*7Jf*H=%^B+k?J)ZKeOmIQ$+A)Md3?5Ev|I^&SJ+Aqn2w? zQcp{SXA$UEs&G*{Dss@Q95J`CvSD_`Pr*QMQd^)a{a+bZ^x3xM--H?iiZ%Bs@A;rn zxw%K~qRHju1__^#V}0YnPj%SA5xS5Y)`|URW_Qk6TTnKn$?@VIWeiSS$n~F>Y81hzNYA~E!g5H+WSNMGTTuG-_O&sj@jN@v!P2jIh)#*zuapzM3 zim}zM#wapY{x=?$!8X}Y0~REr2dHw&gxk5}Z7#-|tW02x!M@-+J3>3nfD#Wz8jzEQ z0ij+H&6<17pntH2ob9JeW>}XB=3(3}KO;V4DBxQ#l6=So=%Kj><$nOh%OJ~p!@_Yd z|Co>aN1dvAnx5P@=x|})BB5IzH#X(|d7yU^U}`FdGsnk1U6wlBdw4et>L$^#4``E8 zKaRxhkvhI&P5X2hR+NvHxSrvChlaK$JuMlnG8cuq2U3$f3*uVnH=?gD>}ozB3@95URYj8?kCIGxnV`Bz6 zOjC$(?d#$x9pP#GB5zPD;qQE$5lJ{jmHP}thDXM6Gj3z;tbjwcjT<23l%q3jZSn$bjtaPQp0|!7h zdx>k=0u>;u0}N>UXw?fUd3aNCYxOxa948g`jL-zJ4CS* zVI?imF-BnnelM3o6^o-dpDFV$yetzRfD8KjfPgS`BVPch?|vvz_GKRyI!@3Led}5B zRL6_-=C>;B=6MZ|&ObV{$=67v;xu!8U3#~dCOt=jtm2Wfd6C*Bmx?T53Xf0ky61cH zrti(G2kCS>t57ko+=jJ+G$!Rmq-WRLwx3cWlZbeiBUA-p3DOY!jN%ngeSD)yUM(}Q+Z{Era z>g6P1icKSTQ=RWxK?H^rDllJS2ilreCsm0ROh>+&P4{sdYR9%-UP@)o6t~c(KC

    Po3xSbPRkVOF(Ka?Kn#@tL`$s-yio7()yelp)KfJ^%x0)tQhY^qz^ z@gvo5$2}9PidUX_5h^wb0CWF)7)ua~7DFJ=`YK=ir#=AkG|;Rf<|Gu+ZuS)l6-z9* zNDzevof92_=Svby9z?~;t4k?}T~{I~F0bPzOrlgLacFvDG@g~@jq?J6ME0I%YQzkG zq|=0Pvy$W5ErDpvt5-?LuWkM6O%Kfg>h@26_xvD>4Cw;Mbm;82Fh3`8Q@5GxvpQ~7 zpZVVN*M;I3@qF-NGWcnXxXl76ZGd#_Ea;*|XU>kk6O5*HcFSk)`*5hq{wuFQxBaU}vJbPnP@^+;2S`y+*zd)|)z4@ZP zXrAZs+mNWin(4SM&jhdk{l~y36oO2r0UkN}`0SU&CxR+Z;XLt&Nk`8($L)O?h*%d* zQX)Qi_2ycDcr(1}*xROo{iNTWp1@8;xKuI=m}rqJiGEU?CUU_5IpZ%xI_fgyuX@iS zpiD%nBo-F1rsQW&k{g)zH!Danw!+{@>6hE$klf0pz$^72Wp0HYA^D*= z@5eT)-fTMFbo{TLVqj|i3-II)bi@$rv=OBB`u^jN8{&zSM`dn;DcFCSZ7-6#lI80k z8Dk8PFg3wZn051cg`{{k*;|X8qcwoO(ONYBo|>2mcFocvK2qlO=XJcF1t!RqQH~oS zP)OD`UZ18UWm^1Z#YU=dyut@Sf*$H*v&C*skdwLU#O}cwh<1q=EuM3S#6UUtzUpiU z_V_;As2MFEDS{v=xL$Hx7Da9YVo;L#alB2h0>!7>4tNDi#f=L&U%06d*nnA5Wy2G2 zC)*Y%#sMo8bR0+n&iZ_vm>~0gSpeMN5^CadSMAX0up3?O=Nd zWbWVWcqv^6{LzS6;$s1K2qbU$J+e1l=}CPVI`4F(H_kFI3OryTtlXH|thpz}fmc~lfC4hTcDnLOK`s#&po9BU0Zid5|Uig4UP&jgTGrivq^81n6RhIQ$sYQM_gbdGrVNl z$M_OMcyuvthneD|3y1i4W#7{%2ZgdsDrAS_D~)eP zNSbIyM>4YUIbPjqCUAP+CLmRjFBC5bBBfPr>YS+DUrnT~ zm4$z15;iIILA=2?!|9zG<$Gx3M;NiJLk-NcE^CXkTQeW|Os{l-DLdFS+bp<|c#UXB zg`qVYO=&=XMe}%1CZQ_v?dLp8*7>rlyC1Wc$(P$w*+Y}pH|NV9-QmF1h-X} zd!3_g(cXBiAb6(vp6#P*QTz2ins$(4@G`Ta)usaOpH)LMQ``^pwA;s{1G~`eRERwE zZsHpSzgevEPzt8luyEY-+T&D(A(HPNScWOU0#oFcezM=)l zP`3?metoM=YIMt!hBU(y96{Dk$xYH-B|@rMHGw@S03{`UpsjcS@}=-xOzkY>QJnD* zw0`PZ5~~^Wt-l5r8Hxuh2n^_9DV9m0v?`T_v;N-GgGQR1pLv8hvx*a4K?fxT5bgi; z01q$qKaN___{$Y?OIS$Sgy{tX7cL=sCqUiyZ#1r?@pmy;NQ+fK&S8yZZeG1 zeuWSFT}=sm;h4fuL03nh!cd85v6teieV+jMw*a}j3L;Pe5PM|muR;wsm6=xFTU>}w zJ2Y&-{WxwxUQ!L`(_fCwJVUvF5DHW;MnZZu_i=Rv;&3c%6@A&k;+UY0HM?9dfzaOMURHV5nOwstlOly0w;q zA$ikVv_CX;d;RFRBK~tR+Z*6>6OnxBWZuKw`8c<-B;;fEebC!Wo2~VjLX_bKwo_^K zElvVNWDeq^k64zq-tV;FEM6>`sc4C zKZ<))nEN+vjbzCW0on4kq9EtvvHBIS>1)7pla=RQy{k&LXKb>*{R48?3NO@`2U#zL zB~h%*LVAGu*s1c2L`-hc-pN}=C#t{xZ+7>A9lim?iQOgMj z241~XH2U6uSwp~mUMB3FU4Sg;6;>`?n1c04Z}T`D7AIko=?ye8uyWL{0Tlosf$xpV znY9pd(534(+rS$9T%)4oG&{ZYwhd_F>Y8-zld!oqif;3tM8rpLI)U|ORb}%$L!A}J z0#7Dpn|;D}dCN?piyYsX>);j~0j)&6>f=hH&Ihh6{Y1dl+4o$AxNg~^Bu{%pGkDa< z^eKp}prOYY`J@ON-q1~!f5bl~<3&=ZmtX#b-|PTCLT1HrJA5pF$7Yx$BAN8e)L?h! z`#QrTQPU+?jLQx}*CpTXz|XzezhfEKmM5Sx>HZu`AsF-~H2vlTu~>O8T=e`lLWVC> zItfVf{$o;ip+$Ka)>B}qLtu*jkc}|BfJ|9l@9|0zDkmDsQd4Me;!>8a%8_M-86;q6 zz(NXO!~JKhyrDRQ1D>BNq`y0#)ItEOPkW^zH|Es?T_JWBP`)%c z$h>9jY4C_z>(wc;dJEkG=G5vU@N^h$>gef1E^A{3HD1uhk9w2Xhl}CTxISIz=`$&~ zbRfd3{eIA#@z<2sBrxtY0ChU~mMr)0w7*g*Fy3MPJSZ{J1QlRb5^%T9mct zA#hxX@?XixO9sWRAlJGuzH%7h2AId9dD%SjZ?4)p6SCqGunN)wX)s5y{qN$h2U{{+ zdwigK3De;ld&080&3GERaH3%5ew8k@QaPI&D`H&U>YNb)hc4wcRCM~2g8g)@>DGwy zeu-RO@YjWaad9!U73?9+nWH;Mm{s8Nw*>^v1Ughr2G8h+-sTS%8_83*>H$|C^0^PZ zlGtw+x1Yx-UKOpge+gk1_J*rT!K)fNt%0FPOvO|vwR58T+G4|*ywlb>hvh2sClstL$@no zvcJubAQap8fpvw>lk{0zEEveq+DSu{4H#%HY$U%tH+!Tn`s-up{Yi03HkfxIXi~t`3j=u_S68!dK#kp&a3^hpKXK z7V_`CDL%z_DR}0JX^we0G#y3w4GCNsveI0UaZp%Jj;!u&;8#6H8)`g%J}PtYNUvyI z(4A$M$muJ2g2kQ0jHF(`d zTnj{@d0Mpgj+veKI;^}QY~VEYm>=9$0~Wr>kl7{$x0K?6jMM1)nW7D>Gr$Qu!dt;Z z1q8D{|DhA-cvH8+4hKo4uYZf8SDO`9y^1Mnlu>7kj_mBG1+P=4cUpvAb^R0Lhw3$boTy znQx%CjQ3`EmIXQ9khNt;1nI)jF_>aCy7!KWCdWH9n`}ME5cLa51&Uk9Nl$nIbm6H` za!}+So99xLpuvmTpr-K-r3nh940aXO%G^Ou=4uZngMACg(_cn0fx5E@iEHZB?cDNrXYR;cs^$TU`fRmIAgzy z@=IqBnsi;AczCOBPT0dW3ae-lt|pzNd>FfxNCDgK>n4a!BG0L(3nSsBcS$iif``eD zC22Td-V&_*W0AQ?!V8th*-2%`$Tiu^3Z8^<=H5?l;K%WtZqprfT;^O{%SOtDdBX<7 zjGSP0n&qMDco8_Q4m0QIx3j5D_yGNub*yQbST7enE@v5qN(qp;A5;G&>)4T?BhF%; ztXY(fcCU*6r1*Lwf&g(%E$0W;L(3I3n`9MYP}S}Ri3^p?u~$iuCEITmR%Zhy=9(me z04SL605;2EseBE%{5^ra1rrkL59(yfld`oJDplNGn(dZS9@fdRhX@5$D?g-vUsDup z(|qZw@(T5v%0;J|FayOjfCOZrno(m zqzGV`iS|yjLDDBRLM#hRjpZw<6R8#bE+uV-+2pXO>g4I^$8(t_O~?JdqNqzIO6Bz& z5o)-|At~#LxSw}QKhwXWPU`$1G=XRM>xRg}8ZMQdQ&SfN7AXP7ri7l-&NT%W+N-hu zJz~BJ%_3Ei1T<6crn8hWabCxpCk0BUCzVyLp#M0pl*z0QdK_MP0?%5#WulXSq#YcB zkRGK_diFtOHYBT{UM89>AyNsr*d=?QbO30;0NsWxj+XD7C7VNdzQJ=QL^MiQ(#qf5lUYb58s|qn}0T*y zcn~=3?HnXEM!fdkSGS`3QPWT#4UP@mZDwuVLI@P5tN!5pKxa(6mrcE!sw|piTQK3i z5{-C7+aL@YsUy5y58b1B%#`)U9!>fQX&BAn1`8zu*aRp>yldc4e zg?Fj&AO{X$z`HQOA|T(}6=B!M>9e+#eW<>vRQ|~VDi3D=FCyyjNI-s&O&mVxQf3Z@ z7@-UP=rwo}6jm6o=+Q9jj3-w8gr)e7pQvZ;&5_U1Lhl?@j*OpXt&=p2Blq&)*STUk zvGdD8xboP6X~-JVf{)_1OTi)Tj_!xxdb(RoKny7=l^Tm5VPLe2MB_jTH%;{Ek zEud`M$e%i#anjv9Sn?(|EvH5lOq8>dugL3*#b7t(3r{8CZkxablAa0W9aMqQ-DCzV z=-sNYAz&&l4^L6fvg@@dc8@jp-nu<-`6lV_d;D9KRTru(ddUM@a6V!q_7RnZWF#*@ z`$o4qiZVbAU)?;rnOAA4Hv0Rr+e{87teQ@}_bixmG0J^pj21T?FJIOkH~Mj-`onV7 zMRme1Eduf;r(@QD0^2z;WPpiA-?vGa4z%H!B4zsFj1MuVwbM2hf@mNRHPHL6#QfT# z(7+==a##$&TMbw*jeoNxQ6>I3Gs&*iX;J0>mne+Ug&oeubrVD5vd8xx|_dqgv) zv#$?{gFY&033ip)j0otfnq^=QBqK$uN^nP9Y&qv<8|Tn22dKV35WPjWvb&Acg$Wj4 z-s_iR;`T6Vb(<&gBzByO&hkc#H>@{*0*8iso$JM^E|Y;a5{5&$UM5(|tO?Uux{Zte z04`GtG3m|ol_@TRHheqP)kg%itNJ>oE?A}nA4π$Eu}RDh?4EdOF;&XoK4V zqge1u!bghz4O9OdnI@Gf|5JAy2GNh(6UCisf1LVr)=zHgi_(nSTG6%3qD|LixH(!N zaGrvSpPNy+Jlu#Zua4N8m99I9Of8A_A|1ACYbsK1OQ33}(MwH+`mR!oZ{yVI;meg7 z!M%H%gV?li3VgE)*aqOBk!j-A5W&i=@{|aEUz5-I`#JypCf?uH&Mo3)XokFEhKq{& z_i!~L5^ehjA`H5;mslZky$?EZ6C&=O4Bj+xn08GD7MPX@7p5f78hX#Dot3TgR78BA zdTa>n9GJe>q&baG^mAsSn0N}fjS<(P3$ZWuI$;@W76S;}tBkbZGQh+a)~LTJA06yi zEIex{b2ji-By?017?@8GI=yxt!wUMFvHp8!BQk%bdB;@N;ikt2&=>!xgB&i1*${Dk z?!nt>s+i)-O;4`p1UD11YHXv_XZOrE0DJLf75!wU@3+mHaNd+G7GU*2$VXbn=gX42 zX7GhfbeXVy7(w6WDixEcnu*SI$gu=G|9=LuNWH*EW`mZFc09d~pL(6U-)pv@6_C$a zd~)dxsXKc6vLtp6N>aSywW8E1i)c;!-16!O0jkaLeK4aGwMm+>py|rPUEk2_fE86M zC8In5qfiO}*7YfY(QZBkUv#5AN3RK(SD&)F7a`a6%Le`lmo@M!|2)en zfL%*3N{s;Q`FN5$|D*e7sPNvx>lJsugmRc#23vJwRG(P@b>@&o`NbMH{`CC(Bok0 zt(Z@#mbMi^)yE|Nh5Tj)hu3Jlwc3AnM4$HaE4p=KA#8_Buot|>(6BY83DZ)NaEm4d ztdGDfhTgZaMu}TX!T)&KORR@#6;2OJ#;yv4Z%>Uwen;Jg(ZrwqHQl7Ix$!mm$8WG1WjrSdFQVB8hwju43ec8K063^ab#Z~CHQ(vXy9X}#!s*tc$bo(xc#l681Vi;25iivbJT`4w x*nKUfqu0hKcJ}><^|ylVqQB(I5_&x>J+ Date: Mon, 24 Mar 2025 17:24:58 +0100 Subject: [PATCH 541/722] Merge pull request #71 from e2b-dev/update-e2b-sdk Update e2b sdk --- .changeset/rude-boats-live.md | 6 +++ js/package.json | 2 +- pnpm-lock.yaml | 10 ++-- python/poetry.lock | 94 ++++++++++++++++++++++++++++------- python/pyproject.toml | 2 +- 5 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 .changeset/rude-boats-live.md diff --git a/.changeset/rude-boats-live.md b/.changeset/rude-boats-live.md new file mode 100644 index 00000000..0f513942 --- /dev/null +++ b/.changeset/rude-boats-live.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +Updated E2B SDK version diff --git a/js/package.json b/js/package.json index e2dedc8a..863a6f71 100644 --- a/js/package.json +++ b/js/package.json @@ -66,7 +66,7 @@ "vm" ], "dependencies": { - "e2b": "^1.0.5" + "e2b": "^1.2.1" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f59a4eb1..caf15fed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ importers: js: dependencies: e2b: - specifier: ^1.0.5 - version: 1.0.7 + specifier: ^1.2.1 + version: 1.2.1 devDependencies: '@types/node': specifier: ^18.18.6 @@ -677,8 +677,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@1.0.7: - resolution: {integrity: sha512-7msagBbQ8tm51qaGp+hdaaaMjGG3zCzZtUS8bnz+LK7wdwtVTA1PmX+1Br9E3R7v6XIchnNWRpei+VjvGcfidA==} + e2b@1.2.1: + resolution: {integrity: sha512-ii/Bw55ecxgORqkArKNbuVTwqLgVZ0rH1X3J/NOe4LMZaVETm3qNpPBjoPkpQAsQjw2ew0Ad2sd54epqm9nLCw==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -2097,7 +2097,7 @@ snapshots: dotenv@16.4.7: {} - e2b@1.0.7: + e2b@1.2.1: dependencies: '@bufbuild/protobuf': 2.2.2 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) diff --git a/python/poetry.lock b/python/poetry.lock index 9d6f7cde..f32595ad 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "anyio" @@ -6,6 +6,7 @@ version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, @@ -19,7 +20,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] trio = ["trio (>=0.23)"] [[package]] @@ -28,6 +29,7 @@ version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -38,8 +40,8 @@ cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6) ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\""] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "black" @@ -47,6 +49,7 @@ version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, @@ -83,7 +86,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -93,6 +96,7 @@ version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, @@ -104,6 +108,7 @@ version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, @@ -218,6 +223,7 @@ version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -232,6 +238,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -243,6 +251,7 @@ version = "4.5.2" description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.8 and newer." optional = false python-versions = "<4.0.0,>=3.8.0" +groups = ["dev"] files = [ {file = "databind-4.5.2-py3-none-any.whl", hash = "sha256:b9c3a03c0414aa4567f095d7218ac904bd2b267b58e3763dac28e83d64b69770"}, {file = "databind-4.5.2.tar.gz", hash = "sha256:0a8aa0ff130a0306581c559388f5ef65e0fae7ef4b86412eacb1f4a0420006c4"}, @@ -262,6 +271,7 @@ version = "4.5.2" description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.8 and newer. Deprecated, use `databind` package." optional = false python-versions = "<4.0.0,>=3.8.0" +groups = ["dev"] files = [ {file = "databind.core-4.5.2-py3-none-any.whl", hash = "sha256:a1dd1c6bd8ca9907d1292d8df9ec763ce91543e27f7eda4268e4a1a84fcd1c42"}, {file = "databind.core-4.5.2.tar.gz", hash = "sha256:b8ac8127bc5d6b239a2a81aeddb268b0c4cadd53fbce7e8b2c7a9ef6413bccb3"}, @@ -276,6 +286,7 @@ version = "4.5.2" description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.8 and newer. Deprecated, use `databind` module instead." optional = false python-versions = "<4.0.0,>=3.8.0" +groups = ["dev"] files = [ {file = "databind.json-4.5.2-py3-none-any.whl", hash = "sha256:a803bf440634685984361cb2a5a975887e487c854ed48d81ff7aaf3a1ed1e94c"}, {file = "databind.json-4.5.2.tar.gz", hash = "sha256:6cc9b5c6fddaebd49b2433932948eb3be8a41633b90aa37998d7922504b8f165"}, @@ -290,6 +301,7 @@ version = "1.2.15" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["dev"] files = [ {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, @@ -299,7 +311,7 @@ files = [ wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools ; python_version >= \"3.12\"", "sphinx (<2)", "tox"] [[package]] name = "docspec" @@ -307,6 +319,7 @@ version = "2.2.1" description = "Docspec is a JSON object specification for representing API documentation of programming languages." optional = false python-versions = ">=3.7,<4.0" +groups = ["dev"] files = [ {file = "docspec-2.2.1-py3-none-any.whl", hash = "sha256:7538f750095a9688c6980ff9a4e029a823a500f64bd00b6b4bdb27951feb31cb"}, {file = "docspec-2.2.1.tar.gz", hash = "sha256:4854e77edc0e2de40e785e57e95880f7095a05fe978f8b54cef7a269586e15ff"}, @@ -323,6 +336,7 @@ version = "2.2.1" description = "A parser based on lib2to3 producing docspec data from Python source code." optional = false python-versions = ">=3.7,<4.0" +groups = ["dev"] files = [ {file = "docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54"}, {file = "docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559"}, @@ -339,6 +353,7 @@ version = "0.11" description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb"}, ] @@ -348,19 +363,20 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.0.4" +version = "1.3.1" description = "E2B SDK that give agents cloud environments" optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ - {file = "e2b-1.0.4-py3-none-any.whl", hash = "sha256:1a9c765eb1b2cc291c5ebd3f2e268f8fba9471a12f470f4651395b5753730170"}, - {file = "e2b-1.0.4.tar.gz", hash = "sha256:5ed3db4f984e52cf3aabb717725493ff060a8374b7c878b31bceeff46a0b5648"}, + {file = "e2b-1.3.1-py3-none-any.whl", hash = "sha256:2c7fa76e7a8614ebbc0df7f0863275284f9cd4afba7dc631e1c1471658809c37"}, + {file = "e2b-1.3.1.tar.gz", hash = "sha256:d704faa618f0c7b3a4374654443609522a589189ece24d791129e9722f266e75"}, ] [package.dependencies] attrs = ">=23.2.0" httpcore = ">=1.0.5,<2.0.0" -httpx = ">=0.27.0,<0.28.0" +httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" @@ -372,6 +388,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -386,6 +404,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -400,6 +419,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -411,6 +431,7 @@ version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, @@ -432,6 +453,7 @@ version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, @@ -445,7 +467,7 @@ idna = "*" sniffio = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -456,6 +478,7 @@ version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" +groups = ["main", "dev"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -467,6 +490,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -478,6 +502,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -495,6 +520,7 @@ version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -564,6 +590,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -575,6 +602,7 @@ version = "2.1.0" description = "" optional = false python-versions = ">=3.6,<4.0" +groups = ["dev"] files = [ {file = "nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568"}, {file = "nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6"}, @@ -586,6 +614,7 @@ version = "1.1.5" description = "" optional = false python-versions = ">=3.6,<4.0" +groups = ["dev"] files = [ {file = "nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4"}, {file = "nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65"}, @@ -597,6 +626,7 @@ version = "0.8.12" description = "General purpose Python utility library." optional = false python-versions = ">=3.7,<4.0" +groups = ["dev"] files = [ {file = "nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb"}, {file = "nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4"}, @@ -612,6 +642,7 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -623,6 +654,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -634,6 +666,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -650,6 +683,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -665,6 +699,7 @@ version = "5.27.3" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, @@ -685,6 +720,7 @@ version = "4.8.2" description = "Create Python API documentation in Markdown format." optional = false python-versions = ">=3.7,<4.0" +groups = ["dev"] files = [ {file = "pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f"}, {file = "pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b"}, @@ -712,6 +748,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -734,6 +771,7 @@ version = "0.23.8" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, @@ -752,6 +790,7 @@ version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, @@ -767,6 +806,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -787,6 +827,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -801,6 +842,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -815,6 +857,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -877,6 +920,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -898,19 +942,21 @@ version = "75.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.10\"" files = [ {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.5.2) ; sys_platform != \"cygwin\""] +core = ["importlib-metadata (>=6) ; python_version < \"3.10\"", "importlib-resources (>=5.10.2) ; python_version < \"3.9\"", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.12.*)", "pytest-mypy"] [[package]] name = "six" @@ -918,6 +964,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -929,6 +976,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -940,6 +988,7 @@ version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -951,6 +1000,7 @@ version = "1.0.0" description = "A lil' TOML writer" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "tomli_w-1.0.0-py3-none-any.whl", hash = "sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463"}, {file = "tomli_w-1.0.0.tar.gz", hash = "sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9"}, @@ -962,6 +1012,7 @@ version = "2.2.3" description = "" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "typeapi-2.2.3-py3-none-any.whl", hash = "sha256:038062b473dd9bc182966469d7a37d81ba7fa5bb0c01f30b0604b5667b13a47b"}, {file = "typeapi-2.2.3.tar.gz", hash = "sha256:61cf8c852c05471522fcf55ec37d0c37f0de6943cc8e4d58529f796881e32c08"}, @@ -976,6 +1027,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -987,13 +1039,14 @@ version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -1004,6 +1057,7 @@ version = "4.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, @@ -1051,6 +1105,7 @@ version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, @@ -1125,6 +1180,7 @@ version = "0.43.0" description = "A formatter for Python code" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca"}, {file = "yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e"}, @@ -1135,6 +1191,6 @@ platformdirs = ">=3.5.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.9" -content-hash = "5435d0ba1aa34f8515214810654e5c11a3bc34e7c12d52f9426c42f456d978a7" +content-hash = "fb8dae0c0794005cd1df122f585e9121b0205db37f8c2a85759df8c4d2ec2510" diff --git a/python/pyproject.toml b/python/pyproject.toml index 9b97f234..fe62f752 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^1.0.4" +e2b = "^1.3.1" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 870e4c6438bfa19e455c9b63514ce7cdb7a5908c Mon Sep 17 00:00:00 2001 From: Jiri Sveceny Date: Wed, 26 Mar 2025 12:39:51 +0100 Subject: [PATCH 542/722] script for per-package checkin if release is needed (#72) --- .github/scripts/is_release_for_package.sh | 15 +++++ .github/workflows/release.yml | 77 ++++++++++++++--------- 2 files changed, 62 insertions(+), 30 deletions(-) create mode 100755 .github/scripts/is_release_for_package.sh diff --git a/.github/scripts/is_release_for_package.sh b/.github/scripts/is_release_for_package.sh new file mode 100755 index 00000000..c8965efb --- /dev/null +++ b/.github/scripts/is_release_for_package.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +# This script checks if the specified package has changesets in the current commit. + +set -eu + +if [ $# -lt 1 ]; then + echo "Error: Package name is required as the first argument." >&2 + exit 1 +fi + +PACKAGE_NAME=$1 +PACKAGE_CHANGES=$(node -e "require('@changesets/read').default(process.cwd()).then(result => console.log(result.flatMap(changeset => changeset.releases.flatMap(release => release.name)).includes('${PACKAGE_NAME}')))") + +echo "${PACKAGE_CHANGES}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cb4920c3..30a6e81c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,42 +54,59 @@ jobs: if: needs.is_release.outputs.release == 'true' runs-on: ubuntu-latest outputs: - js: ${{ steps.filter.outputs.js }} - python: ${{ steps.filter.outputs.python }} - charts: ${{ steps.filter.outputs.charts }} - template: ${{ steps.filter.outputs.template }} + js: ${{ steps.js.outputs.release }} + python: ${{ steps.python.outputs.release }} + charts: ${{ steps.charts.outputs.release }} + template: ${{ steps.template.outputs.release }} steps: - - name: Checkout repository + - name: Checkout Repo uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Get the last release - id: last_release - uses: cardinalby/git-get-release-action@v1 - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install with: - latest: true - prerelease: false - draft: false + version: 9.5 - - name: Find changes since the last release - uses: dorny/paths-filter@v3.0.2 - id: filter + - name: Setup Node + uses: actions/setup-node@v3 with: - base: ${{ steps.last_release.outputs.tag_name }} - predicate-quantifier: 'every' - filters: | - js: - - 'js/src/**' - python: - - 'python/e2b_code_interpreter/**' - charts: - - 'chart_data_extractor/e2b_charts/**' - template: - - 'template/**' - - '!template/package.json' + node-version: "18.x" + registry-url: "https://registry.npmjs.org" + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Check JavasScript SDK Release + id: js + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/code-interpreter") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" + + - name: Check Python SDK Release + id: python + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/code-interpreter-python") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" + + - name: Check Charts SDK Release + id: charts + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/data-extractor") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" + + - name: Check Template SDK Release + id: template + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/code-interpreter-template") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" charts-tests: name: Charts tests From 0b21d361fec87458da27b0760f7afd7326a90b01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 26 Mar 2025 11:43:18 +0000 Subject: [PATCH 543/722] [skip ci] Release new versions --- .changeset/rude-boats-live.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.1.0/charts/page.mdx | 240 ++++++ .../v1.1.0/consts/page.mdx | 13 + .../v1.1.0/index/page.mdx | 103 +++ .../v1.1.0/messaging/page.mdx | 326 ++++++++ .../v1.1.0/sandbox/page.mdx | 312 ++++++++ .../v1.2.0/sandbox/page.mdx | 722 ++++++++++++++++++ 10 files changed, 1719 insertions(+), 9 deletions(-) delete mode 100644 .changeset/rude-boats-live.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx diff --git a/.changeset/rude-boats-live.md b/.changeset/rude-boats-live.md deleted file mode 100644 index 0f513942..00000000 --- a/.changeset/rude-boats-live.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -Updated E2B SDK version diff --git a/js/package.json b/js/package.json index 863a6f71..d58f728b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.0.4", + "version": "1.1.0", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index d5091ef0..7591c0da 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.1.1", + "version": "1.2.0", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index fe62f752..d8a650a0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.1.1" +version = "1.2.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx new file mode 100644 index 00000000..86e0dfaf --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From 3f473368b8e905010b833f6c0b690ac4749b966e Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 2 Apr 2025 13:09:40 -0700 Subject: [PATCH 544/722] make show sdk ref dir when exsits --- .github/workflows/release.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 30a6e81c..ce12a1b2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -321,7 +321,12 @@ jobs: run: pnpm run --recursive generate-ref - name: Show docs file structure - run: tree ./sdk-reference + run: | + if [ -d "./sdk-reference" ]; then + tree ./sdk-reference + else + echo "sdk-reference directory does not exist" + fi - name: Release new versions uses: changesets/action@v1 From 6d42afeade4d021bd474ca9114f77197769186a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 3 Apr 2025 21:03:28 +0200 Subject: [PATCH 545/722] Update Ubuntu base image to 22.04 (#75) --- .github/workflows/charts_tests.yml | 2 +- .github/workflows/js_tests.yml | 2 +- .github/workflows/python_tests.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index bd1ef28e..c94d2fa4 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -12,7 +12,7 @@ jobs: run: working-directory: ./chart_data_extractor name: Build and test Chart Data Extractor - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index e2ab1110..49cdefef 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -15,7 +15,7 @@ jobs: run: working-directory: ./js name: Build and test SDK - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 3d653e82..a54b2d51 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -15,7 +15,7 @@ jobs: run: working-directory: ./python name: Build and test SDK - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v3 From 647226dbb59cfbe37ba4cd7c83fb0478d75e01de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Mon, 7 Apr 2025 13:37:57 +0200 Subject: [PATCH 546/722] Update esbuild to 0.25.0 (#79) --- js/package.json | 4 +- pnpm-lock.yaml | 614 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 434 insertions(+), 184 deletions(-) diff --git a/js/package.json b/js/package.json index d58f728b..c6c57f34 100644 --- a/js/package.json +++ b/js/package.json @@ -41,11 +41,11 @@ "dotenv": "^16.4.5", "knip": "^5.25.1", "npm-check-updates": "^17.1.14", - "tsup": "^8.3.6", + "tsup": "^8.4.0", "typedoc": "0.26.8", "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.5.3", - "vitest": "^3.0.5" + "vitest": "^3.0.9" }, "files": [ "dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index caf15fed..1a1c1489 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^17.1.14 version: 17.1.14 tsup: - specifier: ^8.3.6 - version: 8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) + specifier: ^8.4.0 + version: 8.4.0(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) typedoc: specifier: 0.26.8 version: 0.26.8(typescript@5.7.3) @@ -51,8 +51,8 @@ importers: specifier: ^5.5.3 version: 5.7.3 vitest: - specifier: ^3.0.5 - version: 3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + specifier: ^3.0.9 + version: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -139,150 +139,300 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -339,98 +489,103 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.34.3': - resolution: {integrity: sha512-8kq/NjMKkMTGKMPldWihncOl62kgnLYk7cW+/4NCUWfS70/wz4+gQ7rMxMMpZ3dIOP/xw7wKNzIuUnN/H2GfUg==} + '@rollup/rollup-android-arm-eabi@4.39.0': + resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.3': - resolution: {integrity: sha512-1PqMHiuRochQ6++SDI7SaRDWJKr/NgAlezBi5nOne6Da6IWJo3hK0TdECBDwd92IUDPG4j/bZmWuwOnomNT8wA==} + '@rollup/rollup-android-arm64@4.39.0': + resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.3': - resolution: {integrity: sha512-fqbrykX4mGV3DlCDXhF4OaMGcchd2tmLYxVt3On5oOZWVDFfdEoYAV2alzNChl8OzNaeMAGqm1f7gk7eIw/uDg==} + '@rollup/rollup-darwin-arm64@4.39.0': + resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.3': - resolution: {integrity: sha512-8Wxrx/KRvMsTyLTbdrMXcVKfpW51cCNW8x7iQD72xSEbjvhCY3b+w83Bea3nQfysTMR7K28esc+ZFITThXm+1w==} + '@rollup/rollup-darwin-x64@4.39.0': + resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.3': - resolution: {integrity: sha512-lpBmV2qSiELh+ATQPTjQczt5hvbTLsE0c43Rx4bGxN2VpnAZWy77we7OO62LyOSZNY7CzjMoceRPc+Lt4e9J6A==} + '@rollup/rollup-freebsd-arm64@4.39.0': + resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.3': - resolution: {integrity: sha512-sNPvBIXpgaYcI6mAeH13GZMXFrrw5mdZVI1M9YQPRG2LpjwL8DSxSIflZoh/B5NEuOi53kxsR/S2GKozK1vDXA==} + '@rollup/rollup-freebsd-x64@4.39.0': + resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.3': - resolution: {integrity: sha512-MW6N3AoC61OfE1VgnN5O1OW0gt8VTbhx9s/ZEPLBM11wEdHjeilPzOxVmmsrx5YmejpGPvez8QwGGvMU+pGxpw==} + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.3': - resolution: {integrity: sha512-2SQkhr5xvatYq0/+H6qyW0zvrQz9LM4lxGkpWURLoQX5+yP8MsERh4uWmxFohOvwCP6l/+wgiHZ1qVwLDc7Qmw==} + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.3': - resolution: {integrity: sha512-R3JLYt8YoRwKI5shJsovLpcR6pwIMui/MGG/MmxZ1DYI3iRSKI4qcYrvYgDf4Ss2oCR3RL3F3dYK7uAGQgMIuQ==} + '@rollup/rollup-linux-arm64-gnu@4.39.0': + resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.3': - resolution: {integrity: sha512-4XQhG8v/t3S7Rxs7rmFUuM6j09hVrTArzONS3fUZ6oBRSN/ps9IPQjVhp62P0W3KhqJdQADo/MRlYRMdgxr/3w==} + '@rollup/rollup-linux-arm64-musl@4.39.0': + resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.3': - resolution: {integrity: sha512-QlW1jCUZ1LHUIYCAK2FciVw1ptHsxzApYVi05q7bz2A8oNE8QxQ85NhM4arLxkAlcnS42t4avJbSfzSQwbIaKg==} + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.3': - resolution: {integrity: sha512-kMbLToizVeCcN69+nnm20Dh0hrRIAjgaaL+Wh0gWZcNt8e542d2FUGtsyuNsHVNNF3gqTJrpzUGIdwMGLEUM7g==} + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.3': - resolution: {integrity: sha512-YgD0DnZ3CHtvXRH8rzjVSxwI0kMTr0RQt3o1N92RwxGdx7YejzbBO0ELlSU48DP96u1gYYVWfUhDRyaGNqJqJg==} + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.3': - resolution: {integrity: sha512-dIOoOz8altjp6UjAi3U9EW99s8nta4gzi52FeI45GlPyrUH4QixUoBMH9VsVjt+9A2RiZBWyjYNHlJ/HmJOBCQ==} + '@rollup/rollup-linux-riscv64-musl@4.39.0': + resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.39.0': + resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.3': - resolution: {integrity: sha512-lOyG3aF4FTKrhpzXfMmBXgeKUUXdAWmP2zSNf8HTAXPqZay6QYT26l64hVizBjq+hJx3pl0DTEyvPi9sTA6VGA==} + '@rollup/rollup-linux-x64-gnu@4.39.0': + resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.3': - resolution: {integrity: sha512-usztyYLu2i+mYzzOjqHZTaRXbUOqw3P6laNUh1zcqxbPH1P2Tz/QdJJCQSnGxCtsRQeuU2bCyraGMtMumC46rw==} + '@rollup/rollup-linux-x64-musl@4.39.0': + resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.3': - resolution: {integrity: sha512-ojFOKaz/ZyalIrizdBq2vyc2f0kFbJahEznfZlxdB6pF9Do6++i1zS5Gy6QLf8D7/S57MHrmBLur6AeRYeQXSA==} + '@rollup/rollup-win32-arm64-msvc@4.39.0': + resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.3': - resolution: {integrity: sha512-K/V97GMbNa+Da9mGcZqmSl+DlJmWfHXTuI9V8oB2evGsQUtszCl67+OxWjBKpeOnYwox9Jpmt/J6VhpeRCYqow==} + '@rollup/rollup-win32-ia32-msvc@4.39.0': + resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.3': - resolution: {integrity: sha512-CUypcYP31Q8O04myV6NKGzk9GVXslO5EJNfmARNSzLF2A+5rmZUlDJ4et6eoJaZgBT9wrC2p4JZH04Vkic8HdQ==} + '@rollup/rollup-win32-x64-msvc@4.39.0': + resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} cpu: [x64] os: [win32] @@ -460,11 +615,8 @@ packages: engines: {node: '>=8.10'} hasBin: true - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -484,11 +636,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.0.5': - resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/mocker@3.0.5': - resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -498,20 +650,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.5': - resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/runner@3.0.5': - resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/snapshot@3.0.5': - resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} - '@vitest/spy@3.0.5': - resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} - '@vitest/utils@3.0.5': - resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -581,8 +733,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} changeset@0.2.6: @@ -716,6 +868,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -724,8 +881,8 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} extendable-error@0.1.7: @@ -775,9 +932,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -900,9 +1054,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -1051,8 +1202,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -1153,8 +1304,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.34.3: - resolution: {integrity: sha512-ORCtU0UBJyiAIn9m0llUXJXAswG/68pZptCrqxHG7//Z2DDzAUeyyY5hqf4XrsGlUxscMr9GkQ2QI7KTLqeyPw==} + rollup@4.39.0: + resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1215,8 +1366,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1274,8 +1425,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} tinypool@1.0.2: @@ -1311,8 +1462,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsup@8.3.6: - resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + tsup@8.4.0: + resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1385,8 +1536,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.5: - resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -1430,16 +1581,16 @@ packages: yaml: optional: true - vitest@3.0.5: - resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.5 - '@vitest/ui': 3.0.5 + '@vitest/browser': 3.1.1 + '@vitest/ui': 3.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1667,78 +1818,153 @@ snapshots: '@esbuild/aix-ppc64@0.24.2': optional: true + '@esbuild/aix-ppc64@0.25.0': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true + '@esbuild/android-arm64@0.25.0': + optional: true + '@esbuild/android-arm@0.24.2': optional: true + '@esbuild/android-arm@0.25.0': + optional: true + '@esbuild/android-x64@0.24.2': optional: true + '@esbuild/android-x64@0.25.0': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true + '@esbuild/darwin-arm64@0.25.0': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true + '@esbuild/darwin-x64@0.25.0': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true + '@esbuild/freebsd-arm64@0.25.0': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true + '@esbuild/freebsd-x64@0.25.0': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true + '@esbuild/linux-arm64@0.25.0': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true + '@esbuild/linux-arm@0.25.0': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true + '@esbuild/linux-ia32@0.25.0': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true + '@esbuild/linux-loong64@0.25.0': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true + '@esbuild/linux-mips64el@0.25.0': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true + '@esbuild/linux-ppc64@0.25.0': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true + '@esbuild/linux-riscv64@0.25.0': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true + '@esbuild/linux-s390x@0.25.0': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true + '@esbuild/netbsd-arm64@0.25.0': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true + '@esbuild/netbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true + '@esbuild/openbsd-arm64@0.25.0': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true + '@esbuild/openbsd-x64@0.25.0': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true + '@esbuild/sunos-x64@0.25.0': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true + '@esbuild/win32-arm64@0.25.0': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true + '@esbuild/win32-ia32@0.25.0': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true + '@esbuild/win32-x64@0.25.0': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1808,61 +2034,64 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.34.3': + '@rollup/rollup-android-arm-eabi@4.39.0': optional: true - '@rollup/rollup-android-arm64@4.34.3': + '@rollup/rollup-android-arm64@4.39.0': optional: true - '@rollup/rollup-darwin-arm64@4.34.3': + '@rollup/rollup-darwin-arm64@4.39.0': optional: true - '@rollup/rollup-darwin-x64@4.34.3': + '@rollup/rollup-darwin-x64@4.39.0': optional: true - '@rollup/rollup-freebsd-arm64@4.34.3': + '@rollup/rollup-freebsd-arm64@4.39.0': optional: true - '@rollup/rollup-freebsd-x64@4.34.3': + '@rollup/rollup-freebsd-x64@4.39.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.3': + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.3': + '@rollup/rollup-linux-arm-musleabihf@4.39.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.3': + '@rollup/rollup-linux-arm64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.3': + '@rollup/rollup-linux-arm64-musl@4.39.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.3': + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.3': + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.3': + '@rollup/rollup-linux-riscv64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.3': + '@rollup/rollup-linux-riscv64-musl@4.39.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.3': + '@rollup/rollup-linux-s390x-gnu@4.39.0': optional: true - '@rollup/rollup-linux-x64-musl@4.34.3': + '@rollup/rollup-linux-x64-gnu@4.39.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.3': + '@rollup/rollup-linux-x64-musl@4.39.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.3': + '@rollup/rollup-win32-arm64-msvc@4.39.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.3': + '@rollup/rollup-win32-ia32-msvc@4.39.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.39.0': optional: true '@shikijs/core@1.29.2': @@ -1906,9 +2135,7 @@ snapshots: ignore: 5.3.1 p-map: 4.0.0 - '@types/estree@1.0.5': {} - - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} '@types/hast@3.0.4': dependencies: @@ -1928,43 +2155,43 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.0.5': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.1.1(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.5 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) - '@vitest/pretty-format@3.0.5': + '@vitest/pretty-format@3.1.1': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.5': + '@vitest/runner@3.1.1': dependencies: - '@vitest/utils': 3.0.5 - pathe: 2.0.2 + '@vitest/utils': 3.1.1 + pathe: 2.0.3 - '@vitest/snapshot@3.0.5': + '@vitest/snapshot@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.1.1 magic-string: 0.30.17 - pathe: 2.0.2 + pathe: 2.0.3 - '@vitest/spy@3.0.5': + '@vitest/spy@3.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.5': + '@vitest/utils@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.1.1 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -2011,21 +2238,21 @@ snapshots: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.24.2): + bundle-require@5.1.0(esbuild@0.25.0): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.0 load-tsconfig: 0.2.5 cac@6.7.14: {} ccount@2.0.1: {} - chai@5.1.2: + chai@5.2.0: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.1 + loupe: 3.1.3 pathval: 2.0.0 changeset@0.2.6: @@ -2162,13 +2389,41 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + esprima@4.0.1: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.7 - expect-type@1.1.0: {} + expect-type@1.2.1: {} extendable-error@0.1.7: {} @@ -2223,8 +2478,6 @@ snapshots: fsevents@2.3.3: optional: true - get-func-name@2.0.2: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2358,10 +2611,6 @@ snapshots: lodash.startcase@4.4.0: {} - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 - loupe@3.1.3: {} lru-cache@10.2.0: {} @@ -2498,7 +2747,7 @@ snapshots: path-type@4.0.0: {} - pathe@2.0.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -2568,29 +2817,30 @@ snapshots: reusify@1.0.4: {} - rollup@4.34.3: + rollup@4.39.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.3 - '@rollup/rollup-android-arm64': 4.34.3 - '@rollup/rollup-darwin-arm64': 4.34.3 - '@rollup/rollup-darwin-x64': 4.34.3 - '@rollup/rollup-freebsd-arm64': 4.34.3 - '@rollup/rollup-freebsd-x64': 4.34.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.3 - '@rollup/rollup-linux-arm-musleabihf': 4.34.3 - '@rollup/rollup-linux-arm64-gnu': 4.34.3 - '@rollup/rollup-linux-arm64-musl': 4.34.3 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.3 - '@rollup/rollup-linux-riscv64-gnu': 4.34.3 - '@rollup/rollup-linux-s390x-gnu': 4.34.3 - '@rollup/rollup-linux-x64-gnu': 4.34.3 - '@rollup/rollup-linux-x64-musl': 4.34.3 - '@rollup/rollup-win32-arm64-msvc': 4.34.3 - '@rollup/rollup-win32-ia32-msvc': 4.34.3 - '@rollup/rollup-win32-x64-msvc': 4.34.3 + '@rollup/rollup-android-arm-eabi': 4.39.0 + '@rollup/rollup-android-arm64': 4.39.0 + '@rollup/rollup-darwin-arm64': 4.39.0 + '@rollup/rollup-darwin-x64': 4.39.0 + '@rollup/rollup-freebsd-arm64': 4.39.0 + '@rollup/rollup-freebsd-x64': 4.39.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 + '@rollup/rollup-linux-arm-musleabihf': 4.39.0 + '@rollup/rollup-linux-arm64-gnu': 4.39.0 + '@rollup/rollup-linux-arm64-musl': 4.39.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-musl': 4.39.0 + '@rollup/rollup-linux-s390x-gnu': 4.39.0 + '@rollup/rollup-linux-x64-gnu': 4.39.0 + '@rollup/rollup-linux-x64-musl': 4.39.0 + '@rollup/rollup-win32-arm64-msvc': 4.39.0 + '@rollup/rollup-win32-ia32-msvc': 4.39.0 + '@rollup/rollup-win32-x64-msvc': 4.39.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -2645,7 +2895,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.0: {} + std-env@3.9.0: {} string-width@4.2.3: dependencies: @@ -2704,7 +2954,7 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -2733,23 +2983,23 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.4.0(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) + bundle-require: 5.1.0(esbuild@0.25.0) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 debug: 4.4.0 - esbuild: 0.24.2 + esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.1)(yaml@2.7.0) resolve-from: 5.0.0 - rollup: 4.34.3 + rollup: 4.39.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.1 @@ -2818,12 +3068,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 - pathe: 2.0.2 + pathe: 2.0.3 vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' @@ -2843,34 +3093,34 @@ snapshots: dependencies: esbuild: 0.24.2 postcss: 8.5.1 - rollup: 4.34.3 + rollup: 4.39.0 optionalDependencies: '@types/node': 18.19.75 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vitest@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.5 - '@vitest/runner': 3.0.5 - '@vitest/snapshot': 3.0.5 - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 debug: 4.4.0 - expect-type: 1.1.0 + expect-type: 1.2.1 magic-string: 0.30.17 - pathe: 2.0.2 - std-env: 3.8.0 + pathe: 2.0.3 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.0.5(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.75 From 06e21495fe91df5a540d2fa6ba45b8765b0d98be Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 9 Apr 2025 18:24:22 +0200 Subject: [PATCH 547/722] bump e2b package (#80) Co-authored-by: never not exploring <50748440+ben-fornefeld@users.noreply.github.com> --- .changeset/metal-crabs-reflect.md | 5 +++++ js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/metal-crabs-reflect.md diff --git a/.changeset/metal-crabs-reflect.md b/.changeset/metal-crabs-reflect.md new file mode 100644 index 00000000..838517dc --- /dev/null +++ b/.changeset/metal-crabs-reflect.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +bump e2b to 1.2.3+ diff --git a/js/package.json b/js/package.json index c6c57f34..8f712c51 100644 --- a/js/package.json +++ b/js/package.json @@ -66,7 +66,7 @@ "vm" ], "dependencies": { - "e2b": "^1.2.1" + "e2b": "^1.2.3" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a1c1489..77250e38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ importers: js: dependencies: e2b: - specifier: ^1.2.1 - version: 1.2.1 + specifier: ^1.2.3 + version: 1.2.3 devDependencies: '@types/node': specifier: ^18.18.6 @@ -829,8 +829,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@1.2.1: - resolution: {integrity: sha512-ii/Bw55ecxgORqkArKNbuVTwqLgVZ0rH1X3J/NOe4LMZaVETm3qNpPBjoPkpQAsQjw2ew0Ad2sd54epqm9nLCw==} + e2b@1.2.3: + resolution: {integrity: sha512-1IJOnqrlDaT/5vn5IzRvkabJ8DIlJ5YGi17TDFhjiBcUgVsBIozPBDyYeQO4BnCxYeLzvLnTJ2zUbXcN57Qnng==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -2324,7 +2324,7 @@ snapshots: dotenv@16.4.7: {} - e2b@1.2.1: + e2b@1.2.3: dependencies: '@bufbuild/protobuf': 2.2.2 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) From 7463f27307ad01612802b8d22dc4af738e200dbe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 9 Apr 2025 16:29:23 +0000 Subject: [PATCH 548/722] [skip ci] Release new versions --- .changeset/metal-crabs-reflect.md | 5 - js/package.json | 2 +- .../v1.1.1/charts/page.mdx | 240 +++++++++++++ .../v1.1.1/consts/page.mdx | 13 + .../v1.1.1/index/page.mdx | 103 ++++++ .../v1.1.1/messaging/page.mdx | 326 ++++++++++++++++++ .../v1.1.1/sandbox/page.mdx | 312 +++++++++++++++++ 7 files changed, 995 insertions(+), 6 deletions(-) delete mode 100644 .changeset/metal-crabs-reflect.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx diff --git a/.changeset/metal-crabs-reflect.md b/.changeset/metal-crabs-reflect.md deleted file mode 100644 index 838517dc..00000000 --- a/.changeset/metal-crabs-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -bump e2b to 1.2.3+ diff --git a/js/package.json b/js/package.json index 8f712c51..9c3f546f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.1.0", + "version": "1.1.1", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | From 0a27b5c289f10c01e79e1f5816d5da3e06cafc0d Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Sat, 19 Apr 2025 00:55:43 +0200 Subject: [PATCH 549/722] Add support for proxy parameter (#87) --- .changeset/dull-bobcats-tie.md | 5 +++++ python/poetry.lock | 34 +++++++++++++++++----------------- python/pyproject.toml | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 .changeset/dull-bobcats-tie.md diff --git a/.changeset/dull-bobcats-tie.md b/.changeset/dull-bobcats-tie.md new file mode 100644 index 00000000..dc436d61 --- /dev/null +++ b/.changeset/dull-bobcats-tie.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Update core SDK to add proxy parameter diff --git a/python/poetry.lock b/python/poetry.lock index f32595ad..9c85df98 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -363,14 +363,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.3.1" +version = "1.3.5" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-1.3.1-py3-none-any.whl", hash = "sha256:2c7fa76e7a8614ebbc0df7f0863275284f9cd4afba7dc631e1c1471658809c37"}, - {file = "e2b-1.3.1.tar.gz", hash = "sha256:d704faa618f0c7b3a4374654443609522a589189ece24d791129e9722f266e75"}, + {file = "e2b-1.3.5-py3-none-any.whl", hash = "sha256:d2f54e1782b0bdf7f87e4855fdf952ba78848ba7b3b2dde984fe8101f0b95724"}, + {file = "e2b-1.3.5.tar.gz", hash = "sha256:dff2cfdec5ebea715b545f940934c9f42e200ef1e869e4c726e5cadf630efc1e"}, ] [package.dependencies] @@ -378,7 +378,7 @@ attrs = ">=23.2.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" -protobuf = ">=3.20.0,<6.0.0" +protobuf = ">=5.29.4,<6.0.0" python-dateutil = ">=2.8.2" typing-extensions = ">=4.1.0" @@ -695,23 +695,23 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.27.3" +version = "5.29.4" description = "" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, - {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, - {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, - {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, - {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, - {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, - {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, - {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, - {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, ] [[package]] @@ -1193,4 +1193,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "fb8dae0c0794005cd1df122f585e9121b0205db37f8c2a85759df8c4d2ec2510" +content-hash = "b06afa63f39a566dbd0ab49c1a258977ab169a3ce33b04e5c4bd75056e5dc13a" diff --git a/python/pyproject.toml b/python/pyproject.toml index d8a650a0..ad48765f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^1.3.1" +e2b = "^1.3.5" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 0cc558a07973eeade773bad2346fc143fb63682a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 18 Apr 2025 22:59:06 +0000 Subject: [PATCH 550/722] [skip ci] Release new versions --- .changeset/dull-bobcats-tie.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.2.1/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/dull-bobcats-tie.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx diff --git a/.changeset/dull-bobcats-tie.md b/.changeset/dull-bobcats-tie.md deleted file mode 100644 index dc436d61..00000000 --- a/.changeset/dull-bobcats-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Update core SDK to add proxy parameter diff --git a/python/package.json b/python/package.json index 7591c0da..69ebbb04 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.2.0", + "version": "1.2.1", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index ad48765f..27f4982d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.2.0" +version = "1.2.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx new file mode 100644 index 00000000..86e0dfaf --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From d4f1d0b56ecf53f0b51667e99c88362c82c51637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Fri, 25 Apr 2025 14:20:45 +0200 Subject: [PATCH 551/722] Refactor workflows to run tests on PRs (#89) --- .github/workflows/charts_tests.yml | 2 +- .github/workflows/js_tests.yml | 2 +- .github/workflows/pull_request.yml | 26 ++++++++++++++++++++++++++ .github/workflows/python_tests.yml | 2 +- .github/workflows/release.yml | 12 +++--------- 5 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/pull_request.yml diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index c94d2fa4..985e7d99 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -11,7 +11,7 @@ jobs: defaults: run: working-directory: ./chart_data_extractor - name: Build and test Chart Data Extractor + name: Chart Data Extractor - Build and test runs-on: ubuntu-22.04 steps: - name: Checkout repository diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 49cdefef..f791115a 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -14,7 +14,7 @@ jobs: defaults: run: working-directory: ./js - name: Build and test SDK + name: JS SDK - Build and test runs-on: ubuntu-22.04 steps: - name: Checkout repository diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000..78b42016 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,26 @@ +name: Pull Request + +permissions: + contents: read + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: + - main + +jobs: + js-sdk: + uses: ./.github/workflows/js_tests.yml + secrets: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + python-sdk: + uses: ./.github/workflows/python_tests.yml + secrets: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + charts-tests: + uses: ./.github/workflows/charts_tests.yml diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index a54b2d51..5bb46fea 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -14,7 +14,7 @@ jobs: defaults: run: working-directory: ./python - name: Build and test SDK + name: Python SDK - Build and test runs-on: ubuntu-22.04 steps: - name: Checkout repository diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce12a1b2..523f8531 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -108,15 +108,9 @@ jobs: IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/code-interpreter-template") echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" - charts-tests: - name: Charts tests - needs: [changes] - if: needs.changes.outputs.charts == 'true' - uses: ./.github/workflows/charts_tests.yml charts-release: name: Charts release - needs: [charts-tests] if: needs.changes.outputs.charts == 'true' runs-on: ubuntu-latest outputs: @@ -243,8 +237,8 @@ jobs: needs: [changes, build-template] if: always() && !contains(needs.*.result, 'failure') && - !contains(needs.*.result, 'cancelled') && - (needs.changes.outputs.python == 'true' || needs.changes.outputs.template == 'true') + !contains(needs.*.result, 'cancelled') && + needs.changes.outputs.template == 'true' uses: ./.github/workflows/python_tests.yml secrets: inherit @@ -254,7 +248,7 @@ jobs: if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && - (needs.changes.outputs.js == 'true' || needs.changes.outputs.template == 'true') + needs.changes.outputs.template == 'true' uses: ./.github/workflows/js_tests.yml secrets: inherit From c70f06eb35371feb90bf1676644f3125f8ac72fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 02:56:46 -0700 Subject: [PATCH 552/722] Bump h11 in /python in the pip group across 1 directory (#90) Bumps the pip group with 1 update in the /python directory: [h11](https://github.com/python-hyper/h11). Updates `h11` from 0.14.0 to 0.16.0 - [Commits](https://github.com/python-hyper/h11/compare/v0.14.0...v0.16.0) --- updated-dependencies: - dependency-name: h11 dependency-version: 0.16.0 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 9c85df98..1bd62420 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -239,7 +239,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -415,37 +415,37 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" From 2bfcfbb6154508cfed25a296424ee77b04371364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 29 Apr 2025 12:32:50 +0200 Subject: [PATCH 553/722] Security patches (#95) * Update Jinja2 * Update esbuild + vite --- pnpm-lock.yaml | 296 +++------------------------------------------ python/poetry.lock | 6 +- 2 files changed, 22 insertions(+), 280 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77250e38..34d8ce5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 17.1.14 tsup: specifier: ^8.4.0 - version: 8.4.0(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) + version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typedoc: specifier: 0.26.8 version: 0.26.8(typescript@5.7.3) @@ -133,300 +133,150 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.0': resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.0': resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} @@ -863,11 +713,6 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} @@ -1249,8 +1094,8 @@ packages: yaml: optional: true - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -1541,8 +1386,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.1.0: - resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + vite@6.2.6: + resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1815,153 +1660,78 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.2.2 - '@esbuild/aix-ppc64@0.24.2': - optional: true - '@esbuild/aix-ppc64@0.25.0': optional: true - '@esbuild/android-arm64@0.24.2': - optional: true - '@esbuild/android-arm64@0.25.0': optional: true - '@esbuild/android-arm@0.24.2': - optional: true - '@esbuild/android-arm@0.25.0': optional: true - '@esbuild/android-x64@0.24.2': - optional: true - '@esbuild/android-x64@0.25.0': optional: true - '@esbuild/darwin-arm64@0.24.2': - optional: true - '@esbuild/darwin-arm64@0.25.0': optional: true - '@esbuild/darwin-x64@0.24.2': - optional: true - '@esbuild/darwin-x64@0.25.0': optional: true - '@esbuild/freebsd-arm64@0.24.2': - optional: true - '@esbuild/freebsd-arm64@0.25.0': optional: true - '@esbuild/freebsd-x64@0.24.2': - optional: true - '@esbuild/freebsd-x64@0.25.0': optional: true - '@esbuild/linux-arm64@0.24.2': - optional: true - '@esbuild/linux-arm64@0.25.0': optional: true - '@esbuild/linux-arm@0.24.2': - optional: true - '@esbuild/linux-arm@0.25.0': optional: true - '@esbuild/linux-ia32@0.24.2': - optional: true - '@esbuild/linux-ia32@0.25.0': optional: true - '@esbuild/linux-loong64@0.24.2': - optional: true - '@esbuild/linux-loong64@0.25.0': optional: true - '@esbuild/linux-mips64el@0.24.2': - optional: true - '@esbuild/linux-mips64el@0.25.0': optional: true - '@esbuild/linux-ppc64@0.24.2': - optional: true - '@esbuild/linux-ppc64@0.25.0': optional: true - '@esbuild/linux-riscv64@0.24.2': - optional: true - '@esbuild/linux-riscv64@0.25.0': optional: true - '@esbuild/linux-s390x@0.24.2': - optional: true - '@esbuild/linux-s390x@0.25.0': optional: true - '@esbuild/linux-x64@0.24.2': - optional: true - '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.24.2': - optional: true - '@esbuild/netbsd-arm64@0.25.0': optional: true - '@esbuild/netbsd-x64@0.24.2': - optional: true - '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': - optional: true - '@esbuild/openbsd-arm64@0.25.0': optional: true - '@esbuild/openbsd-x64@0.24.2': - optional: true - '@esbuild/openbsd-x64@0.25.0': optional: true - '@esbuild/sunos-x64@0.24.2': - optional: true - '@esbuild/sunos-x64@0.25.0': optional: true - '@esbuild/win32-arm64@0.24.2': - optional: true - '@esbuild/win32-arm64@0.25.0': optional: true - '@esbuild/win32-ia32@0.24.2': - optional: true - '@esbuild/win32-ia32@0.25.0': optional: true - '@esbuild/win32-x64@0.24.2': - optional: true - '@esbuild/win32-x64@0.25.0': optional: true @@ -2162,13 +1932,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.1.1': dependencies: @@ -2361,34 +2131,6 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 - esbuild@0.25.0: optionalDependencies: '@esbuild/aix-ppc64': 0.25.0 @@ -2763,15 +2505,15 @@ snapshots: platform@1.3.6: {} - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.1)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.1 + postcss: 8.5.3 yaml: 2.7.0 - postcss@8.5.1: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -2983,7 +2725,7 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.4.0(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.0) cac: 6.7.14 @@ -2993,7 +2735,7 @@ snapshots: esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.1)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.39.0 source-map: 0.8.0-beta.0 @@ -3002,7 +2744,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -3074,7 +2816,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3089,10 +2831,10 @@ snapshots: - tsx - yaml - vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: - esbuild: 0.24.2 - postcss: 8.5.1 + esbuild: 0.25.0 + postcss: 8.5.3 rollup: 4.39.0 optionalDependencies: '@types/node': 18.19.75 @@ -3103,7 +2845,7 @@ snapshots: vitest@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -3119,7 +2861,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.1.0(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) vite-node: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/python/poetry.lock b/python/poetry.lock index 1bd62420..cc005e6e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -498,14 +498,14 @@ files = [ [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] [package.dependencies] From 2ee6ffb9aa6cae3f48cb230898dcc08ba0fcb535 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Wed, 30 Apr 2025 09:27:51 +0200 Subject: [PATCH 554/722] Update JS SDK target to es2017 (#96) * Update JS SDK target to es2017 * Add changeset --- .changeset/salty-ideas-own.md | 5 +++++ js/tsup.config.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/salty-ideas-own.md diff --git a/.changeset/salty-ideas-own.md b/.changeset/salty-ideas-own.md new file mode 100644 index 00000000..4eaae97e --- /dev/null +++ b/.changeset/salty-ideas-own.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': minor +--- + +Update JS SDK target to es2017 diff --git a/js/tsup.config.js b/js/tsup.config.js index 80616774..c63b850f 100644 --- a/js/tsup.config.js +++ b/js/tsup.config.js @@ -2,7 +2,7 @@ import { defineConfig } from 'tsup' export default defineConfig({ minify: false, - target: ['es2015'], + target: ['es2017'], sourcemap: true, dts: true, format: ['esm', 'cjs'], From 3be5d224f8678fcac7c77757593fb5700dc945b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 30 Apr 2025 07:29:28 +0000 Subject: [PATCH 555/722] [skip ci] Release new versions --- .changeset/salty-ideas-own.md | 5 - js/package.json | 2 +- .../v1.2.0/charts/page.mdx | 240 +++++++++++++ .../v1.2.0/consts/page.mdx | 13 + .../v1.2.0/index/page.mdx | 103 ++++++ .../v1.2.0/messaging/page.mdx | 326 +++++++++++++++++ .../v1.2.0/sandbox/page.mdx | 312 ++++++++++++++++ .../v1.2.1/sandbox/page.mdx | 336 +++++++++--------- 8 files changed, 1163 insertions(+), 174 deletions(-) delete mode 100644 .changeset/salty-ideas-own.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx diff --git a/.changeset/salty-ideas-own.md b/.changeset/salty-ideas-own.md deleted file mode 100644 index 4eaae97e..00000000 --- a/.changeset/salty-ideas-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': minor ---- - -Update JS SDK target to es2017 diff --git a/js/package.json b/js/package.json index 9c3f546f..868606d3 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.1.1", + "version": "1.2.0", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx index 86e0dfaf..19778c89 100644 --- a/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx @@ -3,6 +3,174 @@ +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + ## ChartType ```python @@ -32,8 +200,6 @@ Extracted data from a chart. It's useful for building an interactive charts or c - - ## OutputMessage ```python @@ -389,8 +555,6 @@ The working directory of the context. - - ## AsyncSandbox ```python @@ -556,167 +720,3 @@ Context object - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - From 9f9a423e45b253f106f2548dda25f5dc15fd99ab Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 2 May 2025 13:27:53 +0200 Subject: [PATCH 556/722] Updated template with SWC compiler for TypeScript (#97) * updated template with SWC compiler * added changeset --- .changeset/dull-flies-bow.md | 5 +++++ template/.ts.swcrc | 15 +++++++++++++++ template/Dockerfile | 11 +++++++++-- template/test.Dockerfile | 11 +++++++++-- 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 .changeset/dull-flies-bow.md create mode 100644 template/.ts.swcrc diff --git a/.changeset/dull-flies-bow.md b/.changeset/dull-flies-bow.md new file mode 100644 index 00000000..28c24a35 --- /dev/null +++ b/.changeset/dull-flies-bow.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +added swc compiler for TypeScript diff --git a/template/.ts.swcrc b/template/.ts.swcrc new file mode 100644 index 00000000..da515cd2 --- /dev/null +++ b/template/.ts.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://swc.rs/schema.json", + "jsc": { + "parser": { + "syntax": "typescript" + } + }, + "module": { + "type": "commonjs" + }, + "env": { + "targets": "node 20" + }, + "isModule": false +} \ No newline at end of file diff --git a/template/Dockerfile b/template/Dockerfile index b023150d..199a5cb0 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -1,7 +1,11 @@ FROM python:3.10.14 RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo nodejs npm fonts-noto-cjk + build-essential curl git util-linux jq sudo fonts-noto-cjk + +# Install Node.js 20.x from NodeSource +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get install -y nodejs ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -24,10 +28,13 @@ RUN R -e "install.packages('IRkernel', repos='https://cloud.r-project.org')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" # Javascript Kernel -RUN npm install -g node-gyp RUN npm install -g --unsafe-perm ijavascript RUN ijsinstall --install=global +## TypeScript compiler +RUN npm install -g @swc/cli @swc/core +COPY .ts.swcrc $SERVER_PATH/.ts.swcrc + # Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno diff --git a/template/test.Dockerfile b/template/test.Dockerfile index f3647911..f9302081 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -5,7 +5,11 @@ COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo nodejs npm fonts-noto-cjk + build-essential curl git util-linux jq sudo fonts-noto-cjk + +# Install Node.js 20.x from NodeSource +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get install -y nodejs ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ @@ -19,10 +23,13 @@ COPY ./template/requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # Javascript Kernel -RUN npm install -g node-gyp RUN npm install -g --unsafe-perm ijavascript RUN ijsinstall --install=global +## TypeScript compiler +RUN npm install -g @swc/cli @swc/core +COPY ./template/.ts.swcrc $SERVER_PATH/.ts.swcrc + # Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno From 120d097e247fb69d3b55808eb11538ea60b478f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 May 2025 11:45:08 +0000 Subject: [PATCH 557/722] [skip ci] Release new versions --- .changeset/dull-flies-bow.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/dull-flies-bow.md diff --git a/.changeset/dull-flies-bow.md b/.changeset/dull-flies-bow.md deleted file mode 100644 index 28c24a35..00000000 --- a/.changeset/dull-flies-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -added swc compiler for TypeScript diff --git a/template/package.json b/template/package.json index 8c91626e..8d675f86 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.6" + "version": "0.0.7" } From 95163ce29497afb9c1072c899517d0d9002fa2f3 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 2 May 2025 14:10:27 +0200 Subject: [PATCH 558/722] Added TypeScript support to the code interpreter (#91) * added typescript support via SWC * added ts tests * changed target node version * minor nits by @0div * added test for typescript kernel failure * changed swc path in prod Dockerfile * added changeset * skip test here so that the template can be built --- .changeset/tiny-adults-breathe.md | 5 +++++ js/tests/defaultKernels.test.ts | 4 +++- template/.ts.swcrc | 2 +- template/server/contexts.py | 10 +++++++++- template/server/messaging.py | 28 +++++++++++++++++++++++++++- 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 .changeset/tiny-adults-breathe.md diff --git a/.changeset/tiny-adults-breathe.md b/.changeset/tiny-adults-breathe.md new file mode 100644 index 00000000..38bb961f --- /dev/null +++ b/.changeset/tiny-adults-breathe.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +added typescript support diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts index 8a7b7f65..d8120267 100644 --- a/js/tests/defaultKernels.test.ts +++ b/js/tests/defaultKernels.test.ts @@ -3,6 +3,8 @@ import { expect } from 'vitest' import { sandboxTest } from './setup' sandboxTest('test js kernel', async ({ sandbox }) => { - const output = await sandbox.runCode('console.log("Hello World!")', { language: 'js' }) + const output = await sandbox.runCode('console.log("Hello World!")', { + language: 'js', + }) expect(output.logs.stdout).toEqual(['Hello World!\n']) }) diff --git a/template/.ts.swcrc b/template/.ts.swcrc index da515cd2..cf7cb8d3 100644 --- a/template/.ts.swcrc +++ b/template/.ts.swcrc @@ -12,4 +12,4 @@ "targets": "node 20" }, "isModule": false -} \ No newline at end of file +} diff --git a/template/server/contexts.py b/template/server/contexts.py index 3af317d3..d078dc6e 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -11,6 +11,11 @@ logger = logging.Logger(__name__) +def get_kernel_for_language(language: str) -> str: + if language == "typescript": + return "javascript" + + return language def normalize_language(language: Optional[str]) -> str: if not language: @@ -21,13 +26,16 @@ def normalize_language(language: Optional[str]) -> str: if language == "js": return "javascript" + if language == "ts": + return "typescript" + return language async def create_context(client, websockets: dict, language: str, cwd: str) -> Context: data = { "path": str(uuid.uuid4()), - "kernel": {"name": language}, + "kernel": {"name": get_kernel_for_language(language)}, "type": "notebook", "name": str(uuid.uuid4()), } diff --git a/template/server/messaging.py b/template/server/messaging.py index 4f537aa8..d2894d92 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -3,6 +3,7 @@ import logging import uuid import asyncio +import subprocess from asyncio import Queue from envs import get_envs @@ -27,7 +28,6 @@ logger = logging.getLogger(__name__) - class Execution: def __init__(self, in_background: bool = False): self.queue = Queue[ @@ -199,6 +199,32 @@ async def execute( + code ) + if self.language == "typescript": + logger.info("Compiling TypeScript: %s", code) + + # call SWC to compile the typescript code + try: + compile_result = subprocess.run("swc --config-file .ts.swcrc --filename index.ts".split(), input=code.encode(), capture_output=True) + + if compile_result.returncode != 0: + logger.error("Error during TypeScript compilation: %s", compile_result.stderr.decode()) + yield Error( + name="TypeScriptCompilerError", + value=compile_result.stderr.decode(), + traceback="", + ) + return + + code = compile_result.stdout.decode() + except Exception as e: + logger.error("Error starting SWC process: %s", e) + yield Error( + name="TypeScriptCompilerError", + value=str(e), + traceback="", + ) + return + logger.info(code) request = self._get_execute_request(message_id, code, False) From 8251c2fb3ceffac251f84f67815946b9df73246f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 May 2025 12:28:01 +0000 Subject: [PATCH 559/722] [skip ci] Release new versions --- .changeset/tiny-adults-breathe.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/tiny-adults-breathe.md diff --git a/.changeset/tiny-adults-breathe.md b/.changeset/tiny-adults-breathe.md deleted file mode 100644 index 38bb961f..00000000 --- a/.changeset/tiny-adults-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -added typescript support diff --git a/template/package.json b/template/package.json index 8d675f86..b541ecc7 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.7" + "version": "0.0.8" } From e80eb185ddc64b62cabc6dcac484ff9a33b86a12 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 2 May 2025 14:36:34 +0200 Subject: [PATCH 560/722] added ts-kernel tests (#99) --- js/tests/defaultKernels.test.ts | 15 +++++++++++++++ python/tests/async/test_async_default_kernels.py | 15 +++++++++++++++ python/tests/sync/test_default_kernels.py | 12 ++++++++++++ 3 files changed, 42 insertions(+) diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts index d8120267..5750644a 100644 --- a/js/tests/defaultKernels.test.ts +++ b/js/tests/defaultKernels.test.ts @@ -8,3 +8,18 @@ sandboxTest('test js kernel', async ({ sandbox }) => { }) expect(output.logs.stdout).toEqual(['Hello World!\n']) }) + +sandboxTest('test ts kernel', async ({ sandbox }) => { + const output = await sandbox.runCode( + 'const message: string = "Hello World!"; console.log(message)', + { language: 'ts' } + ) + expect(output.logs.stdout).toEqual(['Hello World!\n']) +}) + +sandboxTest('test ts kernel errors', async ({ sandbox }) => { + const output = await sandbox.runCode('import x from "module";', { + language: 'typescript', + }) + expect(output.error?.name).toEqual('TypeScriptCompilerError') +}) diff --git a/python/tests/async/test_async_default_kernels.py b/python/tests/async/test_async_default_kernels.py index a632bda6..83f92746 100644 --- a/python/tests/async/test_async_default_kernels.py +++ b/python/tests/async/test_async_default_kernels.py @@ -6,3 +6,18 @@ async def test_js_kernel(async_sandbox: AsyncSandbox): "console.log('Hello, World!')", language="js" ) assert execution.logs.stdout == ["Hello, World!\n"] + + +async def test_ts_kernel(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code( + "const message: string = 'Hello, World!'; console.log(message);", language="ts" + ) + assert execution.logs.stdout == ["Hello, World!\n"] + + +async def test_ts_kernel_errors(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code( + "import x from 'module';", language="ts" + ) + assert execution.error is not None + assert execution.error.name == "TypeScriptCompilerError" diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index d0daf820..0695defd 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -18,3 +18,15 @@ def test_r_kernel(sandbox: Sandbox): def test_java_kernel(sandbox: Sandbox): execution = sandbox.run_code('System.out.println("Hello, World!")', language="java") assert execution.logs.stdout[0] == "Hello, World!" + + +@pytest.mark.skip_debug() +def test_ts_kernel(sandbox: Sandbox): + execution = sandbox.run_code("const message: string = 'Hello, World!'; console.log(message)", language="ts") + assert execution.logs.stdout == ["Hello, World!\n"] + + +def test_ts_kernel_errors(sandbox: Sandbox): + execution = sandbox.run_code("import x from 'module';", language="ts") + assert execution.error is not None + assert execution.error.name == "TypeScriptCompilerError" From 0ba58b4a9794ff1810fb62d531565518d4830b89 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 2 May 2025 16:33:13 +0200 Subject: [PATCH 561/722] vitest: continue after failing test (#100) --- js/vitest.config.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/vitest.config.mts b/js/vitest.config.mts index 1705595d..0a5def20 100644 --- a/js/vitest.config.mts +++ b/js/vitest.config.mts @@ -16,7 +16,7 @@ export default defineConfig({ globals: false, testTimeout: 30000, environment: 'node', - bail: 1, + bail: 0, server: {}, deps: { interopDefault: true, From c590c0918856e33a69fea75435a9107e0bbfcca5 Mon Sep 17 00:00:00 2001 From: 0div <98087403+0div@users.noreply.github.com> Date: Mon, 5 May 2025 10:36:06 -0700 Subject: [PATCH 562/722] Bump e2b core to 1.4.0 (#101) * bump e2b core to 1.4.0 in js sdk * bump e2b core to 1.4.0 in python sdk * add changeset --- .changeset/fluffy-turkeys-promise.md | 6 ++++++ js/package.json | 4 ++-- pnpm-lock.yaml | 10 +++++----- python/package.json | 2 +- python/poetry.lock | 14 +++++++------- python/pyproject.toml | 4 ++-- 6 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 .changeset/fluffy-turkeys-promise.md diff --git a/.changeset/fluffy-turkeys-promise.md b/.changeset/fluffy-turkeys-promise.md new file mode 100644 index 00000000..77b7b63c --- /dev/null +++ b/.changeset/fluffy-turkeys-promise.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +bump e2b core to 1.4.0 diff --git a/js/package.json b/js/package.json index 868606d3..fb2301ca 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.2.0", + "version": "1.4.0", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", @@ -66,7 +66,7 @@ "vm" ], "dependencies": { - "e2b": "^1.2.3" + "e2b": "^1.4.0" }, "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34d8ce5a..78e23697 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ importers: js: dependencies: e2b: - specifier: ^1.2.3 - version: 1.2.3 + specifier: ^1.4.0 + version: 1.4.0 devDependencies: '@types/node': specifier: ^18.18.6 @@ -679,8 +679,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@1.2.3: - resolution: {integrity: sha512-1IJOnqrlDaT/5vn5IzRvkabJ8DIlJ5YGi17TDFhjiBcUgVsBIozPBDyYeQO4BnCxYeLzvLnTJ2zUbXcN57Qnng==} + e2b@1.4.0: + resolution: {integrity: sha512-KGe5F5UI+1PZ82OBjPHsYqpbw33ck7j0xgcJRSS56mAOWMX/Z6xllXqbZj66Xg6kkO32GmSGXjCAZL4FMSfyug==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -2094,7 +2094,7 @@ snapshots: dotenv@16.4.7: {} - e2b@1.2.3: + e2b@1.4.0: dependencies: '@bufbuild/protobuf': 2.2.2 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) diff --git a/python/package.json b/python/package.json index 69ebbb04..5bb17035 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.2.1", + "version": "1.4.0", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/poetry.lock b/python/poetry.lock index cc005e6e..efda3671 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "anyio" @@ -239,7 +239,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -363,14 +363,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.3.5" +version = "1.4.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-1.3.5-py3-none-any.whl", hash = "sha256:d2f54e1782b0bdf7f87e4855fdf952ba78848ba7b3b2dde984fe8101f0b95724"}, - {file = "e2b-1.3.5.tar.gz", hash = "sha256:dff2cfdec5ebea715b545f940934c9f42e200ef1e869e4c726e5cadf630efc1e"}, + {file = "e2b-1.4.0-py3-none-any.whl", hash = "sha256:a489015ece78ecabfdc281463ed495b6e4adf8c66278bb7312069d8ded21ab52"}, + {file = "e2b-1.4.0.tar.gz", hash = "sha256:6a4596d4f91df32340bdbfac429591980a8dedd7ac509aae73f1bbc128175245"}, ] [package.dependencies] @@ -943,7 +943,7 @@ description = "Easily download, build, install, upgrade, and uninstall Python pa optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, @@ -1193,4 +1193,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "b06afa63f39a566dbd0ab49c1a258977ab169a3ce33b04e5c4bd75056e5dc13a" +content-hash = "e2b926469f1010c15bc330c9866099bbfad8dbcdc157d5e5174a07886945b3bf" diff --git a/python/pyproject.toml b/python/pyproject.toml index 27f4982d..a1c9f982 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.2.1" +version = "1.4.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^1.3.5" +e2b = "^1.4.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 286361a57d1164c1f011d43cab63823ea33c6f18 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 May 2025 17:37:50 +0000 Subject: [PATCH 563/722] [skip ci] Release new versions --- .changeset/fluffy-turkeys-promise.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.5.0/charts/page.mdx | 240 ++++++ .../v1.5.0/consts/page.mdx | 13 + .../v1.5.0/index/page.mdx | 103 +++ .../v1.5.0/messaging/page.mdx | 326 ++++++++ .../v1.5.0/sandbox/page.mdx | 312 ++++++++ .../v1.5.0/sandbox/page.mdx | 722 ++++++++++++++++++ 10 files changed, 1719 insertions(+), 9 deletions(-) delete mode 100644 .changeset/fluffy-turkeys-promise.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx diff --git a/.changeset/fluffy-turkeys-promise.md b/.changeset/fluffy-turkeys-promise.md deleted file mode 100644 index 77b7b63c..00000000 --- a/.changeset/fluffy-turkeys-promise.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -bump e2b core to 1.4.0 diff --git a/js/package.json b/js/package.json index fb2301ca..27c76fd4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.4.0", + "version": "1.5.0", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 5bb17035..cee595b9 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.4.0", + "version": "1.5.0", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index a1c9f982..d1d859cf 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.4.0" +version = "1.5.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "Apache-2.0" diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx new file mode 100644 index 00000000..2fbc0e20 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From cbe4a51b14078b05bb003a193f9d4f818f00f185 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Thu, 8 May 2025 01:57:28 -0700 Subject: [PATCH 564/722] Configure code interpreter server idle timeout (#102) * Configure server timeouts * Remove flag * Add changeset --------- Co-authored-by: Jakub Novak --- .changeset/stale-olives-cover.md | 5 +++++ template/start-up.sh | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/stale-olives-cover.md diff --git a/.changeset/stale-olives-cover.md b/.changeset/stale-olives-cover.md new file mode 100644 index 00000000..111d4718 --- /dev/null +++ b/.changeset/stale-olives-cover.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Increase keep alive timeout diff --git a/template/start-up.sh b/template/start-up.sh index fb45f470..735e5811 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -26,7 +26,7 @@ function start_jupyter_server() { sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null cd /root/.server/ - /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors + /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } echo "Starting Code Interpreter server..." From 918ab8e91a62e79838a25a4dd41f49a62ce52ef6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 8 May 2025 09:15:09 +0000 Subject: [PATCH 565/722] [skip ci] Release new versions --- .changeset/stale-olives-cover.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/stale-olives-cover.md diff --git a/.changeset/stale-olives-cover.md b/.changeset/stale-olives-cover.md deleted file mode 100644 index 111d4718..00000000 --- a/.changeset/stale-olives-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Increase keep alive timeout diff --git a/template/package.json b/template/package.json index b541ecc7..24a4e53e 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.8" + "version": "0.0.9" } From c6dd986b2303cb3b50c629253b172f084d5c7142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Mon, 12 May 2025 15:34:19 +0200 Subject: [PATCH 566/722] Update babel (#103) --- pnpm-lock.yaml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78e23697..e90731f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: packages: - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} '@bufbuild/protobuf@2.2.2': @@ -1129,9 +1129,6 @@ packages: resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} engines: {node: '>= 14.18.0'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -1503,9 +1500,7 @@ packages: snapshots: - '@babel/runtime@7.24.4': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.1': {} '@bufbuild/protobuf@2.2.2': {} @@ -1763,14 +1758,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.27.1 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.27.1 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -2542,8 +2537,6 @@ snapshots: readdirp@4.1.1: {} - regenerator-runtime@0.14.1: {} - regex-recursion@5.1.1: dependencies: regex: 5.1.1 From fae4e6d105b1edee74a1308eebf0081eb87a0866 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 19 May 2025 18:33:50 +0200 Subject: [PATCH 567/722] Python 3.12 support + deps bump (#105) * bump python 3.12 and dependencies * added changeset --- .changeset/clever-berries-shave.md | 5 +++ template/Dockerfile | 2 +- template/requirements.txt | 65 +++++++++++++++--------------- template/test.Dockerfile | 2 +- 4 files changed, 40 insertions(+), 34 deletions(-) create mode 100644 .changeset/clever-berries-shave.md diff --git a/.changeset/clever-berries-shave.md b/.changeset/clever-berries-shave.md new file mode 100644 index 00000000..ee6748b4 --- /dev/null +++ b/.changeset/clever-berries-shave.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +python 3.12 support diff --git a/template/Dockerfile b/template/Dockerfile index 199a5cb0..c48f7df9 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10.14 +FROM python:3.12 RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ build-essential curl git util-linux jq sudo fonts-noto-cjk diff --git a/template/requirements.txt b/template/requirements.txt index ca87be9a..3d185173 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -1,42 +1,43 @@ # Jupyter server requirements -jupyter-server==2.13.0 -ipykernel==6.29.3 -ipython==8.22.2 +jupyter-server==2.16.0 +ipykernel==6.29.5 +ipython==9.2.0 -orjson==3.9.15 -pandas==1.5.3 -matplotlib==3.9.2 -pillow==10.3.0 +orjson==3.10.18 +pandas==2.2.3 +matplotlib==3.10.3 +pillow==11.2.1 # Latest version for e2b_charts # Other packages -aiohttp==3.10.11 -beautifulsoup4==4.12.3 -bokeh==3.3.4 -gensim==4.3.2 -imageio==2.34.0 -joblib==1.3.2 -librosa==0.10.1 -nltk==3.9 -numpy==1.26.4 -opencv-python==4.9.0.80 -openpyxl==3.1.2 -plotly==5.19.0 -pytest==8.1.0 -python-docx==1.1.0 -pytz==2024.1 -requests==2.32.2 -scikit-image==0.22.0 -scikit-learn==1.5.0 -scipy==1.12.0 +aiohttp==3.11.18 +beautifulsoup4==4.13.4 +bokeh==3.7.3 +gensim==4.3.3 # unmaintained, blocking numpy and scipy bump +imageio==2.37.0 +joblib==1.5.0 +librosa==0.11.0 +nltk==3.9.1 +numpy==1.26.4 # bump blocked by gensim +numba==0.61.2 +opencv-python==4.11.0.86 +openpyxl==3.1.5 +plotly==6.0.1 +pytest==8.3.5 +python-docx==1.1.2 +pytz==2025.2 +requests==2.32.3 +scikit-image==0.25.2 +scikit-learn==1.6.1 +scipy==1.13.1 # bump blocked by gensim seaborn==0.13.2 -soundfile==0.12.1 -spacy==3.7.4 -textblob==0.18.0 +soundfile==0.13.1 +spacy==3.8.2 # doesn't work on 3.13.x +textblob==0.19.0 tornado==6.4.2 -urllib3==1.26.19 -xarray==2024.2.0 +urllib3==2.4.0 +xarray==2025.4.0 xlrd==2.0.1 -sympy==1.12 +sympy==1.14.0 diff --git a/template/test.Dockerfile b/template/test.Dockerfile index f9302081..9a6c2f21 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10.14 +FROM python:3.12 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME From 85b729ffd6adb8cac1548815205710ece382f6f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 May 2025 16:53:42 +0000 Subject: [PATCH 568/722] [skip ci] Release new versions --- .changeset/clever-berries-shave.md | 5 - .../v1.5.0/sandbox/page.mdx | 398 +++++++++--------- template/package.json | 2 +- 3 files changed, 200 insertions(+), 205 deletions(-) delete mode 100644 .changeset/clever-berries-shave.md diff --git a/.changeset/clever-berries-shave.md b/.changeset/clever-berries-shave.md deleted file mode 100644 index ee6748b4..00000000 --- a/.changeset/clever-berries-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -python 3.12 support diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx index 2fbc0e20..6bee4003 100644 --- a/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx @@ -3,205 +3,6 @@ -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - ## OutputMessage ```python @@ -557,6 +358,8 @@ The working directory of the context. + + ## AsyncSandbox ```python @@ -720,3 +523,200 @@ Creates a new context to run code in. Context object + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + diff --git a/template/package.json b/template/package.json index 24a4e53e..222d0d21 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.9" + "version": "0.0.10" } From 19af07f5ce78c2778dc86984442e4b1215fc4855 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 03:14:25 -0700 Subject: [PATCH 569/722] Bump setuptools in /python in the pip group across 1 directory (#110) Bumps the pip group with 1 update in the /python directory: [setuptools](https://github.com/pypa/setuptools). Updates `setuptools` from 75.3.0 to 78.1.1 - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v75.3.0...v78.1.1) --- updated-dependencies: - dependency-name: setuptools dependency-version: 78.1.1 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index efda3671..70a17901 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "anyio" @@ -239,7 +239,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -938,25 +938,24 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "75.3.0" +version = "78.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] -markers = "python_version == \"3.9\"" files = [ - {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, - {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, + {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, + {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.5.2) ; sys_platform != \"cygwin\""] -core = ["importlib-metadata (>=6) ; python_version < \"3.10\"", "importlib-resources (>=5.10.2) ; python_version < \"3.9\"", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.12.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" From 8f381069366c899a6416afcafdd079fb5a3e3801 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 May 2025 13:27:45 -0700 Subject: [PATCH 570/722] Bump tornado in /template in the pip group across 1 directory (#112) Bumps the pip group with 1 update in the /template directory: [tornado](https://github.com/tornadoweb/tornado). Updates `tornado` from 6.4.2 to 6.5.1 - [Changelog](https://github.com/tornadoweb/tornado/blob/master/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v6.4.2...v6.5.1) --- updated-dependencies: - dependency-name: tornado dependency-version: 6.5.1 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 3d185173..3adbfdb5 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -36,7 +36,7 @@ seaborn==0.13.2 soundfile==0.13.1 spacy==3.8.2 # doesn't work on 3.13.x textblob==0.19.0 -tornado==6.4.2 +tornado==6.5.1 urllib3==2.4.0 xarray==2025.4.0 xlrd==2.0.1 From e9e0903a4070eb21b2e2fe2473c5e23f47336936 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 28 May 2025 14:53:18 +0200 Subject: [PATCH 571/722] Updated JavaScript kernel with typescript, top-level async/await, es module import, promise resolution (#111) * e2b ijavascript kernel * removed compiler step * e2b ijavascript * removed ts compiler from dockerfile * removed tests that should no longer be failing * added changeset --- .changeset/breezy-bananas-lay.md | 5 ++++ js/tests/defaultKernels.test.ts | 7 ----- .../tests/async/test_async_default_kernels.py | 8 ------ python/tests/sync/test_default_kernels.py | 5 ---- template/.ts.swcrc | 15 ----------- template/Dockerfile | 6 +---- template/server/messaging.py | 26 ------------------- template/test.Dockerfile | 6 +---- 8 files changed, 7 insertions(+), 71 deletions(-) create mode 100644 .changeset/breezy-bananas-lay.md delete mode 100644 template/.ts.swcrc diff --git a/.changeset/breezy-bananas-lay.md b/.changeset/breezy-bananas-lay.md new file mode 100644 index 00000000..c7d185b0 --- /dev/null +++ b/.changeset/breezy-bananas-lay.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +updated ijavascript kernel in the template diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts index 5750644a..41bc245b 100644 --- a/js/tests/defaultKernels.test.ts +++ b/js/tests/defaultKernels.test.ts @@ -16,10 +16,3 @@ sandboxTest('test ts kernel', async ({ sandbox }) => { ) expect(output.logs.stdout).toEqual(['Hello World!\n']) }) - -sandboxTest('test ts kernel errors', async ({ sandbox }) => { - const output = await sandbox.runCode('import x from "module";', { - language: 'typescript', - }) - expect(output.error?.name).toEqual('TypeScriptCompilerError') -}) diff --git a/python/tests/async/test_async_default_kernels.py b/python/tests/async/test_async_default_kernels.py index 83f92746..88df4a94 100644 --- a/python/tests/async/test_async_default_kernels.py +++ b/python/tests/async/test_async_default_kernels.py @@ -13,11 +13,3 @@ async def test_ts_kernel(async_sandbox: AsyncSandbox): "const message: string = 'Hello, World!'; console.log(message);", language="ts" ) assert execution.logs.stdout == ["Hello, World!\n"] - - -async def test_ts_kernel_errors(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code( - "import x from 'module';", language="ts" - ) - assert execution.error is not None - assert execution.error.name == "TypeScriptCompilerError" diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index 0695defd..71abadfc 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -25,8 +25,3 @@ def test_ts_kernel(sandbox: Sandbox): execution = sandbox.run_code("const message: string = 'Hello, World!'; console.log(message)", language="ts") assert execution.logs.stdout == ["Hello, World!\n"] - -def test_ts_kernel_errors(sandbox: Sandbox): - execution = sandbox.run_code("import x from 'module';", language="ts") - assert execution.error is not None - assert execution.error.name == "TypeScriptCompilerError" diff --git a/template/.ts.swcrc b/template/.ts.swcrc deleted file mode 100644 index cf7cb8d3..00000000 --- a/template/.ts.swcrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://swc.rs/schema.json", - "jsc": { - "parser": { - "syntax": "typescript" - } - }, - "module": { - "type": "commonjs" - }, - "env": { - "targets": "node 20" - }, - "isModule": false -} diff --git a/template/Dockerfile b/template/Dockerfile index c48f7df9..a4bb24d0 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -28,13 +28,9 @@ RUN R -e "install.packages('IRkernel', repos='https://cloud.r-project.org')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" # Javascript Kernel -RUN npm install -g --unsafe-perm ijavascript +RUN npm install -g --unsafe-perm git+https://github.com/e2b-dev/ijavascript.git RUN ijsinstall --install=global -## TypeScript compiler -RUN npm install -g @swc/cli @swc/core -COPY .ts.swcrc $SERVER_PATH/.ts.swcrc - # Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno diff --git a/template/server/messaging.py b/template/server/messaging.py index d2894d92..9fe4e081 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -199,32 +199,6 @@ async def execute( + code ) - if self.language == "typescript": - logger.info("Compiling TypeScript: %s", code) - - # call SWC to compile the typescript code - try: - compile_result = subprocess.run("swc --config-file .ts.swcrc --filename index.ts".split(), input=code.encode(), capture_output=True) - - if compile_result.returncode != 0: - logger.error("Error during TypeScript compilation: %s", compile_result.stderr.decode()) - yield Error( - name="TypeScriptCompilerError", - value=compile_result.stderr.decode(), - traceback="", - ) - return - - code = compile_result.stdout.decode() - except Exception as e: - logger.error("Error starting SWC process: %s", e) - yield Error( - name="TypeScriptCompilerError", - value=str(e), - traceback="", - ) - return - logger.info(code) request = self._get_execute_request(message_id, code, False) diff --git a/template/test.Dockerfile b/template/test.Dockerfile index 9a6c2f21..14eb0005 100644 --- a/template/test.Dockerfile +++ b/template/test.Dockerfile @@ -23,13 +23,9 @@ COPY ./template/requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # Javascript Kernel -RUN npm install -g --unsafe-perm ijavascript +RUN npm install -g --unsafe-perm git+https://github.com/e2b-dev/ijavascript.git RUN ijsinstall --install=global -## TypeScript compiler -RUN npm install -g @swc/cli @swc/core -COPY ./template/.ts.swcrc $SERVER_PATH/.ts.swcrc - # Deno Kernel COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno RUN chmod +x /usr/bin/deno From 585543f98d19d0273cc2cd38f1a51087bf397579 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 28 May 2025 13:08:52 +0000 Subject: [PATCH 572/722] [skip ci] Release new versions --- .changeset/breezy-bananas-lay.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/breezy-bananas-lay.md diff --git a/.changeset/breezy-bananas-lay.md b/.changeset/breezy-bananas-lay.md deleted file mode 100644 index c7d185b0..00000000 --- a/.changeset/breezy-bananas-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -updated ijavascript kernel in the template diff --git a/template/package.json b/template/package.json index 222d0d21..fd7d6236 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.10" + "version": "0.0.11" } From 85cac9199b9ed5e4b59a4eb9afb7117ccb142640 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 28 May 2025 19:34:18 +0200 Subject: [PATCH 573/722] added tests for new js kernel (#113) --- js/tests/defaultKernels.test.ts | 28 +++++++++++++++++++ .../tests/async/test_async_default_kernels.py | 14 ++++++++++ python/tests/sync/test_default_kernels.py | 15 ++++++++++ 3 files changed, 57 insertions(+) diff --git a/js/tests/defaultKernels.test.ts b/js/tests/defaultKernels.test.ts index 41bc245b..f5fce337 100644 --- a/js/tests/defaultKernels.test.ts +++ b/js/tests/defaultKernels.test.ts @@ -9,6 +9,34 @@ sandboxTest('test js kernel', async ({ sandbox }) => { expect(output.logs.stdout).toEqual(['Hello World!\n']) }) +sandboxTest('test esm imports', async ({ sandbox }) => { + const output = await sandbox.runCode( + ` + import { readFileSync } from 'fs' + console.log(typeof readFileSync) + `, + { + language: 'js', + } + ) + expect(output.logs.stdout).toEqual(['function\n']) +}) + +sandboxTest( + 'test top-level await and promise resolution', + async ({ sandbox }) => { + const output = await sandbox.runCode( + ` + await Promise.resolve('Hello World!') + `, + { + language: 'js', + } + ) + expect(output.text).toEqual('Hello World!') + } +) + sandboxTest('test ts kernel', async ({ sandbox }) => { const output = await sandbox.runCode( 'const message: string = "Hello World!"; console.log(message)', diff --git a/python/tests/async/test_async_default_kernels.py b/python/tests/async/test_async_default_kernels.py index 88df4a94..23b01b35 100644 --- a/python/tests/async/test_async_default_kernels.py +++ b/python/tests/async/test_async_default_kernels.py @@ -7,6 +7,20 @@ async def test_js_kernel(async_sandbox: AsyncSandbox): ) assert execution.logs.stdout == ["Hello, World!\n"] +async def test_js_esm_imports(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code(""" + import { readFileSync } from 'fs' + console.log(typeof readFileSync) + """, language="js") + assert execution.logs.stdout == ["function\n"] + + +async def test_js_top_level_await(async_sandbox: AsyncSandbox): + execution = await async_sandbox.run_code(""" + await Promise.resolve('Hello World!') + """, language="js") + assert execution.text == "Hello World!" + async def test_ts_kernel(async_sandbox: AsyncSandbox): execution = await async_sandbox.run_code( diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index 71abadfc..998a39e8 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -20,6 +20,21 @@ def test_java_kernel(sandbox: Sandbox): assert execution.logs.stdout[0] == "Hello, World!" +def test_js_esm_imports(sandbox: Sandbox): + execution = sandbox.run_code(""" + import { readFileSync } from 'fs' + console.log(typeof readFileSync) + """, language="js") + assert execution.logs.stdout == ["function\n"] + + +def test_js_top_level_await(sandbox: Sandbox): + execution = sandbox.run_code(""" + await Promise.resolve('Hello World!') + """, language="js") + assert execution.text == "Hello World!" + + @pytest.mark.skip_debug() def test_ts_kernel(sandbox: Sandbox): execution = sandbox.run_code("const message: string = 'Hello, World!'; console.log(message)", language="ts") From 2b7833b6b9ab413ecacd6926c1b2833b2ca278c2 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 5 Jun 2025 16:24:59 +0200 Subject: [PATCH 574/722] added MIT license to code-interpreter SDKs and charts library (#117) --- .changeset/shaggy-cups-compare.md | 7 +++++++ chart_data_extractor/LICENSE | 9 +++++++++ chart_data_extractor/pyproject.toml | 2 +- js/LICENSE | 9 +++++++++ python/LICENSE | 9 +++++++++ python/pyproject.toml | 2 +- 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .changeset/shaggy-cups-compare.md create mode 100644 chart_data_extractor/LICENSE create mode 100644 js/LICENSE create mode 100644 python/LICENSE diff --git a/.changeset/shaggy-cups-compare.md b/.changeset/shaggy-cups-compare.md new file mode 100644 index 00000000..2242a953 --- /dev/null +++ b/.changeset/shaggy-cups-compare.md @@ -0,0 +1,7 @@ +--- +'@e2b/data-extractor': patch +'@e2b/code-interpreter-python': patch +'@e2b/code-interpreter': patch +--- + +added MIT License source diff --git a/chart_data_extractor/LICENSE b/chart_data_extractor/LICENSE new file mode 100644 index 00000000..4aa6529d --- /dev/null +++ b/chart_data_extractor/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 FOUNDRYLABS, INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 6ca00367..4694b151 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -3,7 +3,7 @@ name = "e2b-charts" version = "0.0.3" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] -license = "Apache-2.0" +license = "MIT" readme = "README.md" homepage = "https://e2b.dev/" repository = "https://github.com/e2b-dev/e2b-code-interpreter/tree/python" diff --git a/js/LICENSE b/js/LICENSE new file mode 100644 index 00000000..4aa6529d --- /dev/null +++ b/js/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 FOUNDRYLABS, INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/python/LICENSE b/python/LICENSE new file mode 100644 index 00000000..4aa6529d --- /dev/null +++ b/python/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 FOUNDRYLABS, INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/python/pyproject.toml b/python/pyproject.toml index d1d859cf..b8b857a2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -3,7 +3,7 @@ name = "e2b-code-interpreter" version = "1.5.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] -license = "Apache-2.0" +license = "MIT" readme = "README.md" homepage = "https://e2b.dev/" repository = "https://github.com/e2b-dev/code-interpreter/tree/main/python" From c87f122de41b80e1458ffb0e50ea18df4583284a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 5 Jun 2025 14:38:09 +0000 Subject: [PATCH 575/722] [skip ci] Release new versions --- .changeset/shaggy-cups-compare.md | 7 - chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.5.1/charts/page.mdx | 240 ++++++ .../v1.5.1/consts/page.mdx | 13 + .../v1.5.1/index/page.mdx | 103 +++ .../v1.5.1/messaging/page.mdx | 326 ++++++++ .../v1.5.1/sandbox/page.mdx | 312 ++++++++ .../v1.5.1/sandbox/page.mdx | 722 ++++++++++++++++++ 12 files changed, 1721 insertions(+), 12 deletions(-) delete mode 100644 .changeset/shaggy-cups-compare.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx diff --git a/.changeset/shaggy-cups-compare.md b/.changeset/shaggy-cups-compare.md deleted file mode 100644 index 2242a953..00000000 --- a/.changeset/shaggy-cups-compare.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@e2b/data-extractor': patch -'@e2b/code-interpreter-python': patch -'@e2b/code-interpreter': patch ---- - -added MIT License source diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 8135e77c..41cb32b8 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.3", + "version": "0.0.4", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 4694b151..745d7588 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.3" +version = "0.0.4" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "MIT" diff --git a/js/package.json b/js/package.json index 27c76fd4..938d5c2e 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.5.0", + "version": "1.5.1", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index cee595b9..319c24d6 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.5.0", + "version": "1.5.1", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index b8b857a2..4208cf65 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.5.0" +version = "1.5.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx new file mode 100644 index 00000000..6bee4003 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + From cef0e440ae901148958366a48e49ca925316cae6 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:31:52 +0200 Subject: [PATCH 576/722] Added CI/CD for code interpreter template (#116) --- .github/workflows/build_test_template.yml | 55 ++++++++++++++++++++ .github/workflows/charts_tests.yml | 2 +- .github/workflows/cleanup_build_template.yml | 33 ++++++++++++ .github/workflows/js_tests.yml | 17 +++++- .github/workflows/pull_request.yml | 23 ++++++++ .github/workflows/python_tests.yml | 11 +++- .github/workflows/release.yml | 17 +++--- js/tests/setup.ts | 6 ++- python/tests/conftest.py | 17 +++--- 9 files changed, 159 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/build_test_template.yml create mode 100644 .github/workflows/cleanup_build_template.yml diff --git a/.github/workflows/build_test_template.yml b/.github/workflows/build_test_template.yml new file mode 100644 index 00000000..e8d6edb2 --- /dev/null +++ b/.github/workflows/build_test_template.yml @@ -0,0 +1,55 @@ +name: Build Template + +on: + workflow_call: + secrets: + E2B_TESTS_ACCESS_TOKEN: + required: true + inputs: + E2B_DOMAIN: + required: false + type: string + outputs: + template_id: + description: "The ID of the built template" + value: ${{ jobs.build.outputs.template_id }} + +permissions: + contents: read + +jobs: + build: + name: Build E2B Template + runs-on: ubuntu-latest + outputs: + template_id: ${{ steps.build-template.outputs.template_id }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set package version + working-directory: ./template + run: | + VERSION=$(cat ../chart_data_extractor/pyproject.toml | grep version | cut -d '"' -f 2) + echo "Version: $VERSION" + sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt + + - name: Install E2B CLI + run: npm install -g @e2b/cli + + - name: Build E2B template + id: build-template + run: | + rm -f e2b.toml + e2b template build --memory-mb 1024 -c "/root/.jupyter/start-up.sh" -d "Dockerfile" + TEMPLATE_ID=$(grep "template_id" e2b.toml | cut -d '"' -f 2) + echo "Captured Template ID: $TEMPLATE_ID" + echo "template_id=$TEMPLATE_ID" >> $GITHUB_OUTPUT + working-directory: ./template + env: + E2B_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} + + - name: Output template ID + run: | + echo "Template ID from step output: ${{ steps.build-template.outputs.template_id }}" diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index 985e7d99..6cbc59e1 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 diff --git a/.github/workflows/cleanup_build_template.yml b/.github/workflows/cleanup_build_template.yml new file mode 100644 index 00000000..9878474c --- /dev/null +++ b/.github/workflows/cleanup_build_template.yml @@ -0,0 +1,33 @@ +name: Cleanup Build Template + +on: + workflow_call: + secrets: + E2B_TESTS_ACCESS_TOKEN: + required: true + inputs: + E2B_DOMAIN: + required: false + type: string + E2B_TESTS_TEMPLATE: + required: true + type: string + +permissions: + contents: read + +jobs: + cleanup: + name: Cleanup Build Template + runs-on: ubuntu-latest + steps: + - name: Install E2B CLI + run: npm install -g @e2b/cli + + - name: Cleanup E2B template + id: cleanup-template + run: | + e2b template delete -y "${{ inputs.E2B_TESTS_TEMPLATE }}" + env: + E2B_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index f791115a..144603f6 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -5,6 +5,13 @@ on: secrets: E2B_API_KEY: required: true + inputs: + E2B_DOMAIN: + required: false + type: string + E2B_TESTS_TEMPLATE: + required: false + type: string permissions: contents: read @@ -18,7 +25,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v3 @@ -49,16 +56,20 @@ jobs: run: pnpm test env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} - name: Install Bun uses: oven-sh/setup-bun@v2 with: - version: 1.1.x + bun-version: 1.2.15 - name: Run Bun tests run: pnpm test:bun env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} - name: Install Deno uses: denoland/setup-deno@v1 @@ -69,3 +80,5 @@ jobs: run: pnpm test:deno env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} \ No newline at end of file diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 78b42016..29aa1e15 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -14,13 +14,36 @@ on: - main jobs: + build-template: + uses: ./.github/workflows/build_test_template.yml + secrets: + E2B_TESTS_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + with: + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} js-sdk: uses: ./.github/workflows/js_tests.yml + needs: build-template secrets: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + with: + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ needs.build-template.outputs.template_id }} python-sdk: uses: ./.github/workflows/python_tests.yml + needs: build-template secrets: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + with: + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ needs.build-template.outputs.template_id }} + cleanup-build-template: + uses: ./.github/workflows/cleanup_build_template.yml + needs: [build-template, js-sdk, python-sdk] + if: always() && !contains(needs.build-template.result, 'failure') && !contains(needs.build-template.result, 'cancelled') + secrets: + E2B_TESTS_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + with: + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ needs.build-template.outputs.template_id }} charts-tests: uses: ./.github/workflows/charts_tests.yml diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 5bb46fea..22c85536 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -5,6 +5,13 @@ on: secrets: E2B_API_KEY: required: true + inputs: + E2B_DOMAIN: + required: false + type: string + E2B_TESTS_TEMPLATE: + required: false + type: string permissions: contents: read @@ -18,7 +25,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 @@ -43,3 +50,5 @@ jobs: run: poetry run pytest --verbose -x env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 523f8531..8ee6313b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: ${{ steps.version.outputs.release }} steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v3 @@ -60,7 +60,7 @@ jobs: template: ${{ steps.template.outputs.release }} steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v3 @@ -117,7 +117,7 @@ jobs: version: ${{ steps.output_version.outputs.version }} steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v3 @@ -177,9 +177,7 @@ jobs: (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') steps: - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 + uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -220,9 +218,7 @@ jobs: (needs.changes.outputs.template == 'true' || needs.changes.outputs.charts == 'true') steps: - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 + uses: actions/checkout@v4 - name: Install E2B CLI run: npm install -g @e2b/cli @@ -268,9 +264,8 @@ jobs: private-key: ${{ secrets.VERSION_BUMPER_SECRET }} - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: - fetch-depth: 0 token: ${{ steps.app-token.outputs.token }} diff --git a/js/tests/setup.ts b/js/tests/setup.ts index b4466365..52cd7c65 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -3,6 +3,8 @@ import { test as base } from 'vitest' const timeoutMs = 60_000 +const template = process.env.E2B_TESTS_TEMPLATE || 'code-interpreter-v1' + interface SandboxFixture { sandbox: Sandbox } @@ -10,7 +12,9 @@ interface SandboxFixture { export const sandboxTest = base.extend({ sandbox: [ async ({}, use) => { - const sandbox = await Sandbox.create({ timeoutMs }) + const sandbox = await Sandbox.create(template, { + timeoutMs, + }) try { await use(sandbox) } finally { diff --git a/python/tests/conftest.py b/python/tests/conftest.py index efb6c1d7..796eab91 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -11,8 +11,13 @@ @pytest.fixture() -def sandbox(debug): - sandbox = Sandbox(timeout=timeout) +def template(): + return os.getenv("E2B_TESTS_TEMPLATE", "code-interpreter-v1") + + +@pytest.fixture() +def sandbox(template, debug): + sandbox = Sandbox(template, timeout=timeout) try: yield sandbox @@ -27,14 +32,14 @@ def sandbox(debug): @pytest_asyncio.fixture -async def async_sandbox(debug): - sandbox = await AsyncSandbox.create(timeout=timeout) +async def async_sandbox(template, debug): + async_sandbox = await AsyncSandbox.create(template, timeout=timeout) try: - yield sandbox + yield async_sandbox finally: try: - await sandbox.kill() + await async_sandbox.kill() except: if not debug: warning( From 22c5d4d2b367e2f96f1d1097b430ebdd03f34bb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:22:26 +0000 Subject: [PATCH 577/722] Bump requests in /template/server in the pip group across 1 directory (#118) Bumps the pip group with 1 update in the /template/server directory: [requests](https://github.com/psf/requests). Updates `requests` from 2.32.2 to 2.32.4 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.2...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- template/server/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 38aa52e3..52385cb6 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -2,5 +2,5 @@ fastapi==0.111.0 httpx==0.27.0 websockets==12.0 uvicorn[standard]==0.30.1 -requests==2.32.2 +requests==2.32.4 pydantic==2.9.1 From bf43b6d60ef29f75a673bca820116ad70edcf709 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:14:21 -0700 Subject: [PATCH 578/722] Bump the pip group across 2 directories with 1 update (#119) Bumps the pip group with 1 update in the /python directory: [requests](https://github.com/psf/requests). Bumps the pip group with 1 update in the /template directory: [requests](https://github.com/psf/requests). Updates `requests` from 2.32.3 to 2.32.4 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4) Updates `requests` from 2.32.3 to 2.32.4 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: indirect dependency-group: pip - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 9 +++++---- template/requirements.txt | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 70a17901..0f55d824 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -916,19 +916,19 @@ files = [ [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -943,6 +943,7 @@ description = "Easily download, build, install, upgrade, and uninstall Python pa optional = false python-versions = ">=3.9" groups = ["dev"] +markers = "python_version < \"3.10\"" files = [ {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, diff --git a/template/requirements.txt b/template/requirements.txt index 3adbfdb5..b44f7b9f 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -28,7 +28,7 @@ plotly==6.0.1 pytest==8.3.5 python-docx==1.1.2 pytz==2025.2 -requests==2.32.3 +requests==2.32.4 scikit-image==0.25.2 scikit-learn==1.6.1 scipy==1.13.1 # bump blocked by gensim From 26419ccb726f35f690b00499acfbb2c0713917f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:45:04 +0200 Subject: [PATCH 579/722] Bump protobuf in /python in the pip group across 1 directory (#120) Bumps the pip group with 1 update in the /python directory: [protobuf](https://github.com/protocolbuffers/protobuf). Updates `protobuf` from 5.29.4 to 5.29.5 - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/protobuf_release.bzl) - [Commits](https://github.com/protocolbuffers/protobuf/compare/v5.29.4...v5.29.5) --- updated-dependencies: - dependency-name: protobuf dependency-version: 5.29.5 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 0f55d824..2098ffd0 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -695,23 +695,23 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.29.4" +version = "5.29.5" description = "" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, - {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, - {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, - {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, - {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, - {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, - {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, - {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, - {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, - {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, - {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, + {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, + {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, + {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, + {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, + {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, + {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, + {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, + {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, + {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, + {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, ] [[package]] From 90edc0bd99f6d75df29cd05b53ee15f8be9daebb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 21:54:02 -0700 Subject: [PATCH 580/722] Bump urllib3 in /python in the pip group across 1 directory (#121) Bumps the pip group with 1 update in the /python directory: [urllib3](https://github.com/urllib3/urllib3). Updates `urllib3` from 2.2.3 to 2.5.0 - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.3...2.5.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.5.0 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 2098ffd0..ce0f308b 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1035,14 +1035,14 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] From 30a380863c5c0b50f1e4f47bd5258ac672391d72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:13:10 -0700 Subject: [PATCH 581/722] Bump urllib3 in /template in the pip group across 1 directory (#122) Bumps the pip group with 1 update in the /template directory: [urllib3](https://github.com/urllib3/urllib3). Updates `urllib3` from 2.4.0 to 2.5.0 - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.4.0...2.5.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.5.0 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index b44f7b9f..f0548351 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -37,7 +37,7 @@ soundfile==0.13.1 spacy==3.8.2 # doesn't work on 3.13.x textblob==0.19.0 tornado==6.5.1 -urllib3==2.4.0 +urllib3==2.5.0 xarray==2025.4.0 xlrd==2.0.1 sympy==1.14.0 From 64ffb03849bf5822ce2e5767b193e737436e6f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 19 Jun 2025 16:42:27 -0700 Subject: [PATCH 582/722] Update deps (#123) * Update vite * Update brace expression --- pnpm-lock.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e90731f8..88e9a825 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -563,8 +563,8 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1383,8 +1383,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.6: - resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} + vite@6.2.7: + resolution: {integrity: sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1927,13 +1927,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.1.1(vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.1.1': dependencies: @@ -1995,7 +1995,7 @@ snapshots: dependencies: is-windows: 1.0.2 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -2411,7 +2411,7 @@ snapshots: minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -2809,7 +2809,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -2824,7 +2824,7 @@ snapshots: - tsx - yaml - vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.0 postcss: 8.5.3 @@ -2838,7 +2838,7 @@ snapshots: vitest@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.1.1(vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -2854,7 +2854,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.6(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) vite-node: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: From b0b1dab3d61aa8813fcd9bedbb9a72521ca813f6 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:09:11 +0200 Subject: [PATCH 583/722] Added kaleido to requirements.txt (#128) * added kaleido to requirements.txt * added changeset --- .changeset/early-crabs-sort.md | 5 +++++ template/requirements.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/early-crabs-sort.md diff --git a/.changeset/early-crabs-sort.md b/.changeset/early-crabs-sort.md new file mode 100644 index 00000000..f53d036a --- /dev/null +++ b/.changeset/early-crabs-sort.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +added kaleido that is no longer direct dependency of plotly diff --git a/template/requirements.txt b/template/requirements.txt index f0548351..0180e998 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -25,6 +25,7 @@ numba==0.61.2 opencv-python==4.11.0.86 openpyxl==3.1.5 plotly==6.0.1 +kaleido==1.0.0 pytest==8.3.5 python-docx==1.1.2 pytz==2025.2 From 5e3ec1b5aad1f1531acc1f78597618c33da57677 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 23 Jun 2025 20:00:33 +0200 Subject: [PATCH 584/722] updated python to 3.12 in CI (#129) --- .github/workflows/charts_tests.yml | 2 +- .github/workflows/python_tests.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/release_candidates.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index 6cbc59e1..db3276c2 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: '3.12' - name: Install and configure Poetry uses: snok/install-poetry@v1 diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 22c85536..6af7aa6b 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -30,7 +30,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.9' + python-version: '3.12' - name: Install and configure Poetry uses: snok/install-poetry@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8ee6313b..45546bd4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -128,7 +128,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: '3.12' - name: Install and configure Poetry uses: snok/install-poetry@v1 @@ -272,7 +272,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.9" + python-version: "3.12" - name: Install and configure Poetry uses: snok/install-poetry@v1 diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 52ef52bf..e47b8cfc 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -61,7 +61,7 @@ jobs: uses: actions/setup-python@v4 if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} with: - python-version: "3.9" + python-version: "3.12" - name: Install and configure Poetry uses: snok/install-poetry@v1 From 40f5e1b3b75af7e1a0589c8a02aa21bcc7bb4a9f Mon Sep 17 00:00:00 2001 From: James Murdza Date: Thu, 26 Jun 2025 04:02:40 -0700 Subject: [PATCH 585/722] Fix broken example code in README (#130) --- js/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/README.md b/js/README.md index 90c5c1ac..7ad1d4c3 100644 --- a/js/README.md +++ b/js/README.md @@ -36,7 +36,7 @@ E2B_API_KEY=e2b_*** ```ts import { Sandbox } from '@e2b/code-interpreter' -const sandbox = await Sandbox.create() +const sbx = await Sandbox.create() await sbx.runCode('x = 1') const execution = await sbx.runCode('x+=1; x') From 912b97ef466faf87960ee8b1b3c6e4a3522877f7 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:57:06 +0200 Subject: [PATCH 586/722] bump e2b version, remove outdated changeset (#133) --- .changeset/early-crabs-sort.md | 5 ----- .changeset/weak-ducks-clean.md | 5 +++++ python/poetry.lock | 10 +++++----- python/pyproject.toml | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 .changeset/early-crabs-sort.md create mode 100644 .changeset/weak-ducks-clean.md diff --git a/.changeset/early-crabs-sort.md b/.changeset/early-crabs-sort.md deleted file mode 100644 index f53d036a..00000000 --- a/.changeset/early-crabs-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -added kaleido that is no longer direct dependency of plotly diff --git a/.changeset/weak-ducks-clean.md b/.changeset/weak-ducks-clean.md new file mode 100644 index 00000000..ffe6287b --- /dev/null +++ b/.changeset/weak-ducks-clean.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +updated e2b version diff --git a/python/poetry.lock b/python/poetry.lock index ce0f308b..99c4428d 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -239,7 +239,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -363,14 +363,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.4.0" +version = "1.5.4" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-1.4.0-py3-none-any.whl", hash = "sha256:a489015ece78ecabfdc281463ed495b6e4adf8c66278bb7312069d8ded21ab52"}, - {file = "e2b-1.4.0.tar.gz", hash = "sha256:6a4596d4f91df32340bdbfac429591980a8dedd7ac509aae73f1bbc128175245"}, + {file = "e2b-1.5.4-py3-none-any.whl", hash = "sha256:9c8d22f9203311dff890e037823596daaba3d793300238117f2efc5426888f2c"}, + {file = "e2b-1.5.4.tar.gz", hash = "sha256:49f1c115d0198244beef5854d19cc857fda9382e205f137b98d3dae0e7e0b2d2"}, ] [package.dependencies] @@ -1193,4 +1193,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "e2b926469f1010c15bc330c9866099bbfad8dbcdc157d5e5174a07886945b3bf" +content-hash = "166eb5f8bc1132d916fa088a8b99eb4611498215fcf720e5abe4681b2ab71958" diff --git a/python/pyproject.toml b/python/pyproject.toml index 4208cf65..59b1fdca 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^1.4.0" +e2b = "^1.5.4" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 3ec1fcd3b200b7ce4b8d9bbbc306b3c7129cff59 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 7 Jul 2025 14:58:32 +0000 Subject: [PATCH 587/722] [skip ci] Release new versions --- .changeset/weak-ducks-clean.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v1.5.2/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/weak-ducks-clean.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx diff --git a/.changeset/weak-ducks-clean.md b/.changeset/weak-ducks-clean.md deleted file mode 100644 index ffe6287b..00000000 --- a/.changeset/weak-ducks-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -updated e2b version diff --git a/python/package.json b/python/package.json index 319c24d6..463680a0 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.5.1", + "version": "1.5.2", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 59b1fdca..4344de46 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.5.1" +version = "1.5.2" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx new file mode 100644 index 00000000..80c7f2cd --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + From 8511114cb96730cf6b45aecd15705474b10305a2 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:43:46 +0200 Subject: [PATCH 588/722] Fixes env vars in languages other than Python (#108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * env var handling in languages other than python * added bash to env var processing * reset env variables to global in case of override or delete them after execution * moved kernel pre-init to lifespan * removed unused 0001_envs.py * added tests * changed logic for setting env vars like setting cwd * print > logger * updated JS SDK tests for env vars * env vars tests for Python * added env var tests for r * changed python env var setting using ipython syntax * fixed setting env vars in java * fixes r * updated tests (bash mostly) * testing resetting to default in case of override * fix regression in python test * async http client for requesting env vars * updated tests - use correct template * fixes env vars in java * set global envs on first execution * removed deno tests due timeout * fixes async python tests * fixes sync python tests * fixes r tests * small oversight in r async test --------- Co-authored-by: Jakub Novák --- js/tests/envVars.test.ts | 65 ------------ js/tests/env_vars/bash.test.ts | 69 +++++++++++++ js/tests/env_vars/java.test.ts | 72 +++++++++++++ js/tests/env_vars/js.test.ts | 69 +++++++++++++ js/tests/env_vars/python.test.ts | 69 +++++++++++++ js/tests/env_vars/r.test.ts | 60 +++++++++++ js/tests/setup.ts | 2 + python/tests/async/env_vars/test_bash.py | 47 +++++++++ python/tests/async/env_vars/test_java.py | 52 ++++++++++ python/tests/async/env_vars/test_js.py | 52 ++++++++++ python/tests/async/env_vars/test_python.py | 52 ++++++++++ python/tests/async/env_vars/test_r.py | 52 ++++++++++ python/tests/async/test_async_env_vars.py | 46 --------- python/tests/sync/env_vars/test_bash.py | 47 +++++++++ python/tests/sync/env_vars/test_java.py | 55 ++++++++++ python/tests/sync/env_vars/test_js.py | 55 ++++++++++ python/tests/sync/env_vars/test_python.py | 55 ++++++++++ python/tests/sync/env_vars/test_r.py | 55 ++++++++++ python/tests/sync/test_env_vars.py | 40 ------- template/server/envs.py | 12 ++- template/server/main.py | 41 ++++---- template/server/messaging.py | 115 ++++++++++++++++----- template/start-up.sh | 12 --- template/startup_scripts/0001_envs.py | 65 ------------ 24 files changed, 980 insertions(+), 279 deletions(-) delete mode 100644 js/tests/envVars.test.ts create mode 100644 js/tests/env_vars/bash.test.ts create mode 100644 js/tests/env_vars/java.test.ts create mode 100644 js/tests/env_vars/js.test.ts create mode 100644 js/tests/env_vars/python.test.ts create mode 100644 js/tests/env_vars/r.test.ts create mode 100644 python/tests/async/env_vars/test_bash.py create mode 100644 python/tests/async/env_vars/test_java.py create mode 100644 python/tests/async/env_vars/test_js.py create mode 100644 python/tests/async/env_vars/test_python.py create mode 100644 python/tests/async/env_vars/test_r.py delete mode 100644 python/tests/async/test_async_env_vars.py create mode 100644 python/tests/sync/env_vars/test_bash.py create mode 100644 python/tests/sync/env_vars/test_java.py create mode 100644 python/tests/sync/env_vars/test_js.py create mode 100644 python/tests/sync/env_vars/test_python.py create mode 100644 python/tests/sync/env_vars/test_r.py delete mode 100644 python/tests/sync/test_env_vars.py delete mode 100644 template/startup_scripts/0001_envs.py diff --git a/js/tests/envVars.test.ts b/js/tests/envVars.test.ts deleted file mode 100644 index a4d7f3ca..00000000 --- a/js/tests/envVars.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { expect } from 'vitest' - -import { isDebug, sandboxTest } from './setup' -import { Sandbox } from '../src' - -// Skip this test if we are running in debug mode — the pwd and user in the testing docker container are not the same as in the actual sandbox. -sandboxTest.skipIf(isDebug)('env vars', async () => { - const sandbox = await Sandbox.create({ - envs: { TEST_ENV_VAR: 'supertest' }, - }) - - try { - const result = await sandbox.runCode( - `import os; x = os.getenv('TEST_ENV_VAR'); x` - ) - - expect(result.results[0].text.trim()).toEqual('supertest') - } finally { - await sandbox.kill() - } -}) - -sandboxTest('env vars on sandbox', async ({ sandbox }) => { - const result = await sandbox.runCode( - "import os; os.getenv('FOO')", - { envs: { FOO: 'bar' } } - ) - - expect(result.results[0].text.trim()).toEqual('bar') -}) - -sandboxTest('env vars on sandbox override', async () => { - const sandbox = await Sandbox.create({ - envs: { FOO: 'bar', SBX: 'value' }, - }) - - try { - await sandbox.runCode( - "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'js_runtime'" - ) - const result = await sandbox.runCode( - "import os; os.getenv('FOO')", - { envs: { FOO: 'baz' } } - ) - - expect(result.results[0].text.trim()).toEqual('baz') - - const result2 = await sandbox.runCode( - "import os; os.getenv('RUNTIME_ENV')" - ) - expect(result2.results[0].text.trim()).toEqual('js_runtime') - - if (!isDebug) { - const result3 = await sandbox.runCode( - "import os; os.getenv('SBX')" - ) - expect(result3.results[0].text.trim()).toEqual('value') - } - - const result4 = await sandbox.runCode("import os; os.getenv('FOO')") - expect(result4.results[0].text.trim()).toEqual('bar') - } finally { - await sandbox.kill() - } -}) diff --git a/js/tests/env_vars/bash.test.ts b/js/tests/env_vars/bash.test.ts new file mode 100644 index 00000000..733b96cc --- /dev/null +++ b/js/tests/env_vars/bash.test.ts @@ -0,0 +1,69 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from '../setup' +import { Sandbox } from '../../src' + +// Bash Env Vars +sandboxTest.skipIf(isDebug)('env vars on sandbox (bash)', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `echo $TEST_ENV_VAR`, + { + language: 'bash', + } + ) + + expect(result.logs.stdout[0]).toEqual('supertest\n') + } finally { + await sandbox.kill() + } +}) + +sandboxTest('env vars per execution (bash)', async ({ sandbox }) => { + const result = await sandbox.runCode('echo $FOO', { + envs: { FOO: 'bar' }, + language: 'bash', + }) + + const result_empty = await sandbox.runCode( + 'echo ${FOO:-default}', + { + language: 'bash', + } + ) + + expect(result.logs.stdout[0]).toEqual('bar\n') + expect(result_empty.logs.stdout[0]).toEqual('default\n') +}) + +sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `echo $TEST_ENV_VAR`, + { + language: 'bash', + envs: { TEST_ENV_VAR: 'overwrite' }, + } + ) + + const result_global_default = await sandbox.runCode( + `echo $TEST_ENV_VAR`, + { + language: 'bash', + } + ) + + expect(result.logs.stdout[0]).toEqual('overwrite\n') + expect(result_global_default.logs.stdout[0]).toEqual('supertest\n') + } finally { + await sandbox.kill() + } +}) diff --git a/js/tests/env_vars/java.test.ts b/js/tests/env_vars/java.test.ts new file mode 100644 index 00000000..4058848d --- /dev/null +++ b/js/tests/env_vars/java.test.ts @@ -0,0 +1,72 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from '../setup' +import { Sandbox } from '../../src' + +// Java Env Vars +sandboxTest.skipIf(isDebug)('env vars on sandbox (java)', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `System.getProperty("TEST_ENV_VAR")`, + { + language: 'java', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) + +sandboxTest('env vars per execution (java)', async ({ sandbox }) => { + const result = await sandbox.runCode( + `System.getProperty("FOO")`, + { + envs: { FOO: 'bar' }, + language: 'java', + } + ) + + const result_empty = await sandbox.runCode( + `System.getProperty("FOO", "default")`, + { + language: 'java', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('bar') + expect(result_empty.results[0]?.text.trim()).toEqual('default') +}) + +sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `System.getProperty("TEST_ENV_VAR")`, + { + language: 'java', + envs: { TEST_ENV_VAR: 'overwrite' }, + } + ) + + const result_global_default = await sandbox.runCode( + `System.getProperty("TEST_ENV_VAR")`, + { + language: 'java', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('overwrite') + expect(result_global_default.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) diff --git a/js/tests/env_vars/js.test.ts b/js/tests/env_vars/js.test.ts new file mode 100644 index 00000000..140c36eb --- /dev/null +++ b/js/tests/env_vars/js.test.ts @@ -0,0 +1,69 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from '../setup' +import { Sandbox } from '../../src' + +// JavaScript Env Vars +sandboxTest.skipIf(isDebug)('env vars on sandbox (javascript)', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `process.env.TEST_ENV_VAR`, + { + language: 'javascript', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) + +sandboxTest('env vars per execution (javascript)', async ({ sandbox }) => { + const result = await sandbox.runCode("process.env.FOO", { + envs: { FOO: 'bar' }, + language: 'javascript', + }) + + const result_empty = await sandbox.runCode( + "process.env.FOO || 'default'", + { + language: 'javascript', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('bar') + expect(result_empty.results[0]?.text.trim()).toEqual('default') +}) + +sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `process.env.TEST_ENV_VAR`, + { + language: 'javascript', + envs: { TEST_ENV_VAR: 'overwrite' }, + } + ) + + const result_global_default = await sandbox.runCode( + `process.env.TEST_ENV_VAR`, + { + language: 'javascript', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('overwrite') + expect(result_global_default.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) diff --git a/js/tests/env_vars/python.test.ts b/js/tests/env_vars/python.test.ts new file mode 100644 index 00000000..7c4c34d6 --- /dev/null +++ b/js/tests/env_vars/python.test.ts @@ -0,0 +1,69 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from '../setup' +import { Sandbox } from '../../src' + +// Python Env Vars +sandboxTest.skipIf(isDebug)('env vars on sandbox (python)', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `import os; os.getenv('TEST_ENV_VAR')`, + { + language: 'python', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) + +sandboxTest('env vars per execution (python)', async ({ sandbox }) => { + const result = await sandbox.runCode("import os; os.getenv('FOO')", { + envs: { FOO: 'bar' }, + language: 'python', + }) + + const result_empty = await sandbox.runCode( + "import os; os.getenv('FOO', 'default')", + { + language: 'python', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('bar') + expect(result_empty.results[0]?.text.trim()).toEqual('default') +}) + +sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode( + `import os; os.getenv('TEST_ENV_VAR')`, + { + language: 'python', + envs: { TEST_ENV_VAR: 'overwrite' }, + } + ) + + const result_global_default = await sandbox.runCode( + `import os; os.getenv('TEST_ENV_VAR')`, + { + language: 'python', + } + ) + + expect(result.results[0]?.text.trim()).toEqual('overwrite') + expect(result_global_default.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } +}) diff --git a/js/tests/env_vars/r.test.ts b/js/tests/env_vars/r.test.ts new file mode 100644 index 00000000..a81778b8 --- /dev/null +++ b/js/tests/env_vars/r.test.ts @@ -0,0 +1,60 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from '../setup' +import { Sandbox } from '../../src' + +// R Env Vars +sandboxTest.skipIf(isDebug)('env vars on sandbox (R)', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { + language: 'r', + }) + + expect(result.results[0]?.text.trim()).toEqual(`[1] "supertest"`) + } finally { + await sandbox.kill() + } +}) + +sandboxTest('env vars per execution (R)', async ({ sandbox }) => { + const result = await sandbox.runCode('Sys.getenv("FOO")', { + envs: { FOO: 'bar' }, + language: 'r', + }) + + const result_empty = await sandbox.runCode( + 'Sys.getenv("FOO", unset = "default")', + { + language: 'r', + } + ) + + expect(result.results[0]?.text.trim()).toEqual(`[1] "bar"`) + expect(result_empty.results[0]?.text.trim()).toEqual(`[1] "default"`) +}) + +sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { + language: 'r', + envs: { TEST_ENV_VAR: 'overwrite' }, + }) + + const result_global_default = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { + language: 'r', + }) + + expect(result.results[0]?.text.trim()).toEqual(`[1] "overwrite"`) + expect(result_global_default.results[0]?.text.trim()).toEqual(`[1] "supertest"`) + } finally { + await sandbox.kill() + } +}) diff --git a/js/tests/setup.ts b/js/tests/setup.ts index 52cd7c65..f6ed8cf1 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -7,6 +7,7 @@ const template = process.env.E2B_TESTS_TEMPLATE || 'code-interpreter-v1' interface SandboxFixture { sandbox: Sandbox + template: string } export const sandboxTest = base.extend({ @@ -31,6 +32,7 @@ export const sandboxTest = base.extend({ }, { auto: true }, ], + template }) export const isDebug = process.env.E2B_DEBUG !== undefined diff --git a/python/tests/async/env_vars/test_bash.py b/python/tests/async/env_vars/test_bash.py new file mode 100644 index 00000000..a40bd54c --- /dev/null +++ b/python/tests/async/env_vars/test_bash.py @@ -0,0 +1,47 @@ +import pytest +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +@pytest.mark.skip_debug() +async def test_env_vars_on_sandbox(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash" + ) + assert result.logs.stdout[0] == "supertest\n" + finally: + await sandbox.kill() + +async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + "echo $FOO", + envs={"FOO": "bar"}, + language="bash" + ) + + result_empty = await async_sandbox.run_code( + "echo ${FOO:-default}", + language="bash" + ) + + assert result.logs.stdout[0] == "bar\n" + assert result_empty.logs.stdout[0] == "default\n" + +@pytest.mark.skip_debug() +async def test_env_vars_overwrite(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = await sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash" + ) + assert result.logs.stdout[0] == "overwrite\n" + assert result_global_default.logs.stdout[0] == "supertest\n" + finally: + await sandbox.kill() diff --git a/python/tests/async/env_vars/test_java.py b/python/tests/async/env_vars/test_java.py new file mode 100644 index 00000000..79dc7ecc --- /dev/null +++ b/python/tests/async/env_vars/test_java.py @@ -0,0 +1,52 @@ +import pytest +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +@pytest.mark.skip_debug() +async def test_env_vars_on_sandbox(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + await sandbox.kill() + +async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + 'System.getProperty("FOO")', + envs={"FOO": "bar"}, + language="java" + ) + + result_empty = await async_sandbox.run_code( + 'System.getProperty("FOO", "default")', + language="java" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + +@pytest.mark.skip_debug() +async def test_env_vars_overwrite(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = await sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + await sandbox.kill() diff --git a/python/tests/async/env_vars/test_js.py b/python/tests/async/env_vars/test_js.py new file mode 100644 index 00000000..a8c67943 --- /dev/null +++ b/python/tests/async/env_vars/test_js.py @@ -0,0 +1,52 @@ +import pytest +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +@pytest.mark.skip_debug() +async def test_env_vars_on_sandbox(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + await sandbox.kill() + +async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + "process.env.FOO", + envs={"FOO": "bar"}, + language="javascript" + ) + + result_empty = await async_sandbox.run_code( + "process.env.FOO || 'default'", + language="javascript" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + +@pytest.mark.skip_debug() +async def test_env_vars_overwrite(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = await sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + await sandbox.kill() diff --git a/python/tests/async/env_vars/test_python.py b/python/tests/async/env_vars/test_python.py new file mode 100644 index 00000000..bf13983b --- /dev/null +++ b/python/tests/async/env_vars/test_python.py @@ -0,0 +1,52 @@ +import pytest +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +@pytest.mark.skip_debug() +async def test_env_vars_on_sandbox(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + await sandbox.kill() + +async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + "import os; os.getenv('FOO')", + envs={"FOO": "bar"}, + language="python" + ) + + result_empty = await async_sandbox.run_code( + "import os; os.getenv('FOO', 'default')", + language="python" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + +@pytest.mark.skip_debug() +async def test_env_vars_overwrite(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = await sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + await sandbox.kill() diff --git a/python/tests/async/env_vars/test_r.py b/python/tests/async/env_vars/test_r.py new file mode 100644 index 00000000..4d1a98d5 --- /dev/null +++ b/python/tests/async/env_vars/test_r.py @@ -0,0 +1,52 @@ +import pytest +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + +@pytest.mark.skip_debug() +async def test_env_vars_on_sandbox(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + 'Sys.getenv("TEST_ENV_VAR")', + language="r" + ) + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "supertest"' + finally: + await sandbox.kill() + +async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + 'Sys.getenv("FOO")', + envs={"FOO": "bar"}, + language="r" + ) + + result_empty = await async_sandbox.run_code( + 'Sys.getenv("FOO", unset = "default")', + language="r" + ) + + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "bar"' + assert result_empty.results[0].text is not None + assert result_empty.results[0].text.strip() == '[1] "default"' + +@pytest.mark.skip_debug() +async def test_env_vars_overwrite(template): + sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = await sandbox.run_code( + 'Sys.getenv("TEST_ENV_VAR")', + language="r", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = await sandbox.run_code( + 'Sys.getenv("TEST_ENV_VAR")', + language="r" + ) + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "overwrite"' + assert result_global_default.results[0].text is not None + assert result_global_default.results[0].text.strip() == '[1] "supertest"' + finally: + await sandbox.kill() diff --git a/python/tests/async/test_async_env_vars.py b/python/tests/async/test_async_env_vars.py deleted file mode 100644 index e9ed59c8..00000000 --- a/python/tests/async/test_async_env_vars.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest - -from e2b_code_interpreter.code_interpreter_async import AsyncSandbox - - -# @pytest.mark.skip_debug() -# async def test_env_vars_sandbox(): -# sbx = await AsyncSandbox.create(envs={"FOO": "bar"}) -# try: -# result = await sbx.run_code("import os; os.getenv('FOO')") -# assert result.text == "bar" -# finally: -# await sbx.kill() - - -async def test_env_vars_in_run_code(async_sandbox: AsyncSandbox): - result = await async_sandbox.run_code( - "import os; os.getenv('FOO')", envs={"FOO": "bar"} - ) - assert result.text == "bar" - - -# -# async def test_env_vars_override(debug: bool): -# sbx = await AsyncSandbox.create(envs={"FOO": "bar", "SBX": "value"}) -# -# try: -# await sbx.run_code( -# "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'async_python_runtime'" -# ) -# result = await sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) -# assert result.text == "baz" -# -# # This can fail if running in debug mode (there's a race condition with the restart kernel test) -# result = await sbx.run_code("import os; os.getenv('RUNTIME_ENV')") -# assert result.text == "async_python_runtime" -# -# if not debug: -# result = await sbx.run_code("import os; os.getenv('SBX')") -# assert result.text == "value" -# -# # This can fail if running in debug mode (there's a race condition with the restart kernel test) -# result = await sbx.run_code("import os; os.getenv('FOO')") -# assert result.text == "bar" -# finally: -# await sbx.kill() diff --git a/python/tests/sync/env_vars/test_bash.py b/python/tests/sync/env_vars/test_bash.py new file mode 100644 index 00000000..a77e9b54 --- /dev/null +++ b/python/tests/sync/env_vars/test_bash.py @@ -0,0 +1,47 @@ +import pytest +from e2b_code_interpreter import Sandbox + +@pytest.mark.skip_debug() +def test_env_vars_on_sandbox(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash" + ) + assert result.logs.stdout[0] == "supertest\n" + finally: + sandbox.kill() + +def test_env_vars_per_execution(sandbox: Sandbox): + result = sandbox.run_code( + "echo $FOO", + envs={"FOO": "bar"}, + language="bash" + ) + + result_empty = sandbox.run_code( + "echo ${FOO:-default}", + language="bash" + ) + + assert result.logs.stdout[0] == "bar\n" + assert result_empty.logs.stdout[0] == "default\n" + +@pytest.mark.skip_debug() +def test_env_vars_overwrite(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = sandbox.run_code( + "echo $TEST_ENV_VAR", + language="bash" + ) + assert result.logs.stdout[0] == "overwrite\n" + assert result_global_default.logs.stdout[0] == "supertest\n" + finally: + sandbox.kill() diff --git a/python/tests/sync/env_vars/test_java.py b/python/tests/sync/env_vars/test_java.py new file mode 100644 index 00000000..21a804e5 --- /dev/null +++ b/python/tests/sync/env_vars/test_java.py @@ -0,0 +1,55 @@ +import pytest +from e2b_code_interpreter import Sandbox + +@pytest.mark.skip_debug() +def test_env_vars_on_sandbox(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + sandbox.kill() + +def test_env_vars_per_execution(sandbox: Sandbox): + try: + result = sandbox.run_code( + 'System.getProperty("FOO")', + envs={"FOO": "bar"}, + language="java" + ) + + result_empty = sandbox.run_code( + 'System.getProperty("FOO", "default")', + language="java" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + finally: + sandbox.kill() + +@pytest.mark.skip_debug() +def test_env_vars_overwrite(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = sandbox.run_code( + 'System.getProperty("TEST_ENV_VAR")', + language="java" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + sandbox.kill() diff --git a/python/tests/sync/env_vars/test_js.py b/python/tests/sync/env_vars/test_js.py new file mode 100644 index 00000000..224740ce --- /dev/null +++ b/python/tests/sync/env_vars/test_js.py @@ -0,0 +1,55 @@ +import pytest +from e2b_code_interpreter import Sandbox + +@pytest.mark.skip_debug() +def test_env_vars_on_sandbox(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + sandbox.kill() + +def test_env_vars_per_execution(sandbox: Sandbox): + try: + result = sandbox.run_code( + "process.env.FOO", + envs={"FOO": "bar"}, + language="javascript" + ) + + result_empty = sandbox.run_code( + "process.env.FOO || 'default'", + language="javascript" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + finally: + sandbox.kill() + +@pytest.mark.skip_debug() +def test_env_vars_overwrite(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = sandbox.run_code( + "process.env.TEST_ENV_VAR", + language="javascript" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + sandbox.kill() diff --git a/python/tests/sync/env_vars/test_python.py b/python/tests/sync/env_vars/test_python.py new file mode 100644 index 00000000..1d54d0c5 --- /dev/null +++ b/python/tests/sync/env_vars/test_python.py @@ -0,0 +1,55 @@ +import pytest +from e2b_code_interpreter import Sandbox + +@pytest.mark.skip_debug() +def test_env_vars_on_sandbox(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python" + ) + assert result.text is not None + assert result.text.strip() == "supertest" + finally: + sandbox.kill() + +def test_env_vars_per_execution(sandbox: Sandbox): + try: + result = sandbox.run_code( + "import os; os.getenv('FOO')", + envs={"FOO": "bar"}, + language="python" + ) + + result_empty = sandbox.run_code( + "import os; os.getenv('FOO', 'default')", + language="python" + ) + + assert result.text is not None + assert result.text.strip() == "bar" + assert result_empty.text is not None + assert result_empty.text.strip() == "default" + finally: + sandbox.kill() + +@pytest.mark.skip_debug() +def test_env_vars_overwrite(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = sandbox.run_code( + "import os; os.getenv('TEST_ENV_VAR')", + language="python" + ) + assert result.text is not None + assert result.text.strip() == "overwrite" + assert result_global_default.text is not None + assert result_global_default.text.strip() == "supertest" + finally: + sandbox.kill() diff --git a/python/tests/sync/env_vars/test_r.py b/python/tests/sync/env_vars/test_r.py new file mode 100644 index 00000000..a2984755 --- /dev/null +++ b/python/tests/sync/env_vars/test_r.py @@ -0,0 +1,55 @@ +import pytest +from e2b_code_interpreter import Sandbox + +@pytest.mark.skip_debug() +def test_env_vars_on_sandbox(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "Sys.getenv('TEST_ENV_VAR')", + language="r" + ) + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "supertest"' + finally: + sandbox.kill() + +def test_env_vars_per_execution(sandbox: Sandbox): + try: + result = sandbox.run_code( + "Sys.getenv('FOO')", + envs={"FOO": "bar"}, + language="r" + ) + + result_empty = sandbox.run_code( + "Sys.getenv('FOO', unset = 'default')", + language="r" + ) + + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "bar"' + assert result_empty.results[0].text is not None + assert result_empty.results[0].text.strip() == '[1] "default"' + finally: + sandbox.kill() + +@pytest.mark.skip_debug() +def test_env_vars_overwrite(template): + sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + try: + result = sandbox.run_code( + "Sys.getenv('TEST_ENV_VAR')", + language="r", + envs={"TEST_ENV_VAR": "overwrite"} + ) + result_global_default = sandbox.run_code( + "Sys.getenv('TEST_ENV_VAR')", + language="r" + ) + assert result.results[0].text is not None + assert result.results[0].text.strip() == '[1] "overwrite"' + assert result_global_default.results[0].text is not None + assert result_global_default.results[0].text.strip() == '[1] "supertest"' + finally: + sandbox.kill() diff --git a/python/tests/sync/test_env_vars.py b/python/tests/sync/test_env_vars.py deleted file mode 100644 index 13f87a7b..00000000 --- a/python/tests/sync/test_env_vars.py +++ /dev/null @@ -1,40 +0,0 @@ -import pytest - -from e2b_code_interpreter.code_interpreter_sync import Sandbox - - -# @pytest.mark.skip_debug() -# async def test_env_vars_sandbox(): -# sbx = Sandbox(envs={"FOO": "bar"}) -# result = sbx.run_code("import os; os.getenv('FOO')") -# assert result.text == "bar" -# sbx.kill() - - -async def test_env_vars_in_run_code(sandbox: Sandbox): - result = sandbox.run_code("import os; os.getenv('FOO')", envs={"FOO": "bar"}) - assert result.text == "bar" - - -# -# async def test_env_vars_override(debug: bool): -# sbx = Sandbox(envs={"FOO": "bar", "SBX": "value"}) -# sbx.run_code( -# "import os; os.environ['FOO'] = 'bar'; os.environ['RUNTIME_ENV'] = 'python_runtime'" -# ) -# result = sbx.run_code("import os; os.getenv('FOO')", envs={"FOO": "baz"}) -# assert result.text == "baz" -# -# # This can fail if running in debug mode (there's a race condition with the restart kernel test) -# result = sbx.run_code("import os; os.getenv('RUNTIME_ENV')") -# assert result.text == "python_runtime" -# -# if not debug: -# result = sbx.run_code("import os; os.getenv('SBX')") -# assert result.text == "value" -# -# # This can fail if running in debug mode (there's a race condition with the restart kernel test) -# result = sbx.run_code("import os; os.getenv('FOO')") -# assert result.text == "bar" -# -# sbx.kill() diff --git a/template/server/envs.py b/template/server/envs.py index a8f882af..2456f74d 100644 --- a/template/server/envs.py +++ b/template/server/envs.py @@ -1,12 +1,16 @@ import os -import requests +import httpx LOCAL = os.getenv("E2B_LOCAL", False) ENVD_PORT = 49983 -def get_envs() -> dict: +async def get_envs() -> dict: if LOCAL: - return {} - return requests.get(f"http://localhost:{ENVD_PORT}/envs").json() + return { + "E2B_TEST_VARIABLE": "true" + } + async with httpx.AsyncClient() as client: + response = await client.get(f"http://localhost:{ENVD_PORT}/envs") + return response.json() diff --git a/template/server/main.py b/template/server/main.py index fa7760a9..b353d514 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -17,6 +17,7 @@ from messaging import ContextWebSocket from stream import StreamingListJsonResponse from utils.locks import LockedMap +from envs import get_envs logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) logger = logging.Logger(__name__) @@ -34,31 +35,22 @@ async def lifespan(app: FastAPI): global client client = httpx.AsyncClient() - with open("/root/.jupyter/kernel_id") as file: - default_context_id = file.read().strip() - - default_ws = ContextWebSocket( - default_context_id, - str(uuid.uuid4()), - "python", - "/home/user", - ) - default_websockets["python"] = default_context_id - websockets["default"] = default_ws - websockets[default_context_id] = default_ws - - logger.info("Connecting to default runtime") - await default_ws.connect() - - websockets["default"] = default_ws + try: + default_context = await create_context(client, websockets, "python", "/home/user") + default_websockets["python"] = default_context.id + websockets["default"] = websockets[default_context.id] - logger.info("Connected to default runtime") - yield + logger.info("Connected to default runtime") + yield - for ws in websockets.values(): - await ws.close() + # Will cleanup after application shuts down + for ws in websockets.values(): + await ws.close() - await client.aclose() + await client.aclose() + except Exception as e: + logger.error(f"Failed to initialize default context: {e}") + raise app = FastAPI(lifespan=lifespan) @@ -113,6 +105,11 @@ async def post_execute(request: ExecutionRequest): status_code=404, ) + # set global env vars if not set on first execution + if not ws.global_env_vars: + ws.global_env_vars = await get_envs() + await ws.set_env_vars(ws.global_env_vars) + return StreamingListJsonResponse( ws.execute( request.code, diff --git a/template/server/messaging.py b/template/server/messaging.py index 9fe4e081..7bc2902f 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -3,10 +3,8 @@ import logging import uuid import asyncio -import subprocess from asyncio import Queue -from envs import get_envs from typing import ( Dict, Optional, @@ -49,20 +47,20 @@ def __init__(self, in_background: bool = False): class ContextWebSocket: _ws: Optional[WebSocketClientProtocol] = None _receive_task: Optional[asyncio.Task] = None + global_env_vars: Optional[Dict[StrictStr, str]] = None def __init__( self, context_id: str, session_id: str, language: str, - cwd: str, + cwd: str ): self.language = language self.cwd = cwd self.context_id = context_id self.url = f"ws://localhost:8888/api/kernels/{context_id}/channels" self.session_id = session_id - self._executions: Dict[str, Execution] = {} self._lock = asyncio.Lock() @@ -135,6 +133,84 @@ async def _wait_for_result(self, message_id: str): yield output.model_dump(exclude_none=True) + async def set_env_vars(self, env_vars: Dict[StrictStr, str]): + message_id = str(uuid.uuid4()) + self._executions[message_id] = Execution(in_background=True) + + env_commands = [] + for k, v in env_vars.items(): + if self.language == "python": + env_commands.append(f"import os; os.environ['{k}'] = '{v}'") + elif self.language in ["javascript", "typescript"]: + env_commands.append(f"process.env['{k}'] = '{v}'") + elif self.language == "deno": + env_commands.append(f"Deno.env.set('{k}', '{v}')") + elif self.language == "r": + env_commands.append(f'Sys.setenv({k} = "{v}")') + elif self.language == "java": + env_commands.append(f'System.setProperty("{k}", "{v}");') + elif self.language == "bash": + env_commands.append(f"export {k}='{v}'") + else: + return + + if env_commands: + env_vars_snippet = "\n".join(env_commands) + logger.info(f"Setting env vars: {env_vars_snippet} for {self.language}") + request = self._get_execute_request(message_id, env_vars_snippet, True) + await self._ws.send(request) + + async for item in self._wait_for_result(message_id): + if item["type"] == "error": + raise ExecutionError(f"Error during execution: {item}") + + async def reset_env_vars(self, env_vars: Dict[StrictStr, str]): + # Create a dict of vars to reset and a list of vars to remove + vars_to_reset = {} + vars_to_remove = [] + + for key in env_vars: + if self.global_env_vars and key in self.global_env_vars: + vars_to_reset[key] = self.global_env_vars[key] + else: + vars_to_remove.append(key) + + # Reset vars that exist in global env vars + if vars_to_reset: + await self.set_env_vars(vars_to_reset) + + # Remove vars that don't exist in global env vars + if vars_to_remove: + message_id = str(uuid.uuid4()) + self._executions[message_id] = Execution(in_background=True) + + remove_commands = [] + for key in vars_to_remove: + if self.language == "python": + remove_commands.append(f"import os; del os.environ['{key}']") + elif self.language in ["javascript", "typescript"]: + remove_commands.append(f"delete process.env['{key}']") + elif self.language == "deno": + remove_commands.append(f"Deno.env.delete('{key}')") + elif self.language == "r": + remove_commands.append(f"Sys.unsetenv('{key}')") + elif self.language == "java": + remove_commands.append(f'System.clearProperty("{key}");') + elif self.language == "bash": + remove_commands.append(f"unset {key}") + else: + return + + if remove_commands: + remove_snippet = "\n".join(remove_commands) + logger.info(f"Removing env vars: {remove_snippet} for {self.language}") + request = self._get_execute_request(message_id, remove_snippet, True) + await self._ws.send(request) + + async for item in self._wait_for_result(message_id): + if item["type"] == "error": + raise ExecutionError(f"Error during execution: {item}") + async def change_current_directory( self, path: Union[str, StrictStr], language: str ): @@ -152,9 +228,10 @@ async def change_current_directory( ) elif language == "r": request = self._get_execute_request(message_id, f"setwd('{path}')", True) + # This does not actually change the working directory, but sets the user.dir property elif language == "java": request = self._get_execute_request( - message_id, f"System.setProperty('user.dir', '{path}')", True + message_id, f'System.setProperty("user.dir", "{path}");', True ) else: return @@ -178,26 +255,10 @@ async def execute( if self._ws is None: raise Exception("WebSocket not connected") - global_env_vars = get_envs() - env_vars = {**global_env_vars, **env_vars} if env_vars else global_env_vars async with self._lock: + # set env vars (will override global env vars) if env_vars: - vars_to_set = {**global_env_vars, **env_vars} - - # if there is an indent in the code, we need to add the env vars at the beginning of the code - lines = code.split("\n") - indent = 0 - for i, line in enumerate(lines): - if line.strip() != "": - indent = len(line) - len(line.lstrip()) - break - - if self.language == "python": - code = ( - indent * " " - + f"os.environ.set_envs_for_execution({vars_to_set})\n" - + code - ) + await self.set_env_vars(env_vars) logger.info(code) request = self._get_execute_request(message_id, code, False) @@ -211,6 +272,10 @@ async def execute( del self._executions[message_id] + # reset env vars to their previous values, if they were set globally or remove them + if env_vars: + await self.reset_env_vars(env_vars) + async def _receive_message(self): if not self._ws: logger.error("No WebSocket connection") @@ -276,7 +341,7 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": - logger.debug(f"Execution {parent_msg_ig} received stdout") + logger.debug(f"Execution {parent_msg_ig} received stdout: {data['content']['text']}") await queue.put( Stdout( text=data["content"]["text"], timestamp=data["header"]["date"] @@ -284,7 +349,7 @@ async def _process_message(self, data: dict): ) elif data["content"]["name"] == "stderr": - logger.debug(f"Execution {parent_msg_ig} received stderr") + logger.debug(f"Execution {parent_msg_ig} received stderr: {data['content']['text']}") await queue.put( Stderr( text=data["content"]["text"], timestamp=data["header"]["date"] diff --git a/template/start-up.sh b/template/start-up.sh index 735e5811..5d6223ff 100644 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -13,18 +13,6 @@ function start_jupyter_server() { response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done - response=$(curl -s -X POST "localhost:8888/api/sessions" -H "Content-Type: application/json" -d '{"path": "/home/user", "kernel": {"name": "python3"}, "type": "notebook", "name": "default"}') - status=$(echo "${response}" | jq -r '.kernel.execution_state') - if [[ ${status} != "starting" ]]; then - echo "Error creating kernel: ${response} ${status}" - exit 1 - fi - - sudo mkdir -p /root/.jupyter - kernel_id=$(echo "${response}" | jq -r '.kernel.id') - sudo echo "${kernel_id}" | sudo tee /root/.jupyter/kernel_id >/dev/null - sudo echo "${response}" | sudo tee /root/.jupyter/.session_info >/dev/null - cd /root/.server/ /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } diff --git a/template/startup_scripts/0001_envs.py b/template/startup_scripts/0001_envs.py deleted file mode 100644 index b58a7bba..00000000 --- a/template/startup_scripts/0001_envs.py +++ /dev/null @@ -1,65 +0,0 @@ -import copy -import os -import IPython - - -class E2BEnviron(os._Environ): - return_values = {} - keys_to_remove = set() - - def __setitem__(self, key, value): - super().__setitem__(key, value) - self.return_values.pop(key, None) - self.keys_to_remove.discard(key) - - def __delitem__(self, key): - super().__delitem__(key) - self.return_values.pop(key, None) - self.keys_to_remove.discard(key) - - def set_envs_for_execution(self, update=None): - update = update or {} - - return_values = { - key: self[key] for key in set(self.keys()).intersection(update.keys()) - } - keys_to_remove = set(update.keys()).difference(self.keys()) - - self.update(update) - - self.return_values = return_values - self.keys_to_remove = keys_to_remove - - def reset_envs_for_execution(self): - keys_to_remove = copy.copy(self.keys_to_remove) - for key in keys_to_remove: - self.pop(key) - - return_values = copy.copy(self.return_values) - self.update(return_values) - - self.keys_to_remove.clear() - self.return_values.clear() - - -e2b_environ = E2BEnviron( - {}, - os.environ.encodekey, - os.environ.decodekey, - os.environ.encodekey, - os.environ.decodekey, -) -e2b_environ.update(os.environ) -os.environ = e2b_environ - - -def reset_envs(*args, **kwargs): - try: - if isinstance(os.environ, E2BEnviron): - os.environ.reset_envs_for_execution() - except Exception as e: - print(f"Failed to reset envs: {e}") - - -ip = IPython.get_ipython() -ip.events.register("post_run_cell", reset_envs) From 6e6087ca08a70af99cf86fde8c284ea95c551c93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 04:46:18 -0700 Subject: [PATCH 589/722] Bump pillow in /template in the pip group across 1 directory (#132) Bumps the pip group with 1 update in the /template directory: [pillow](https://github.com/python-pillow/Pillow). Updates `pillow` from 11.2.1 to 11.3.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/11.2.1...11.3.0) --- updated-dependencies: - dependency-name: pillow dependency-version: 11.3.0 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 0180e998..0446aec6 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -6,7 +6,7 @@ ipython==9.2.0 orjson==3.10.18 pandas==2.2.3 matplotlib==3.10.3 -pillow==11.2.1 +pillow==11.3.0 # Latest version for e2b_charts From 344da28452eb99aa606c6b2667b6834a1b73c843 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:26:45 +0200 Subject: [PATCH 590/722] added changeset for #108 (#135) --- .changeset/beige-turkeys-knock.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/beige-turkeys-knock.md diff --git a/.changeset/beige-turkeys-knock.md b/.changeset/beige-turkeys-knock.md new file mode 100644 index 00000000..8aa8a632 --- /dev/null +++ b/.changeset/beige-turkeys-knock.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': minor +--- + +improved env varible support From 8e6b869628b2cea0ffc8cefe42191cb79e06f1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Wed, 9 Jul 2025 07:39:40 -0700 Subject: [PATCH 591/722] Set template in Python correctly (#136) * Default even if empty string is passed * Update python sdk --- .changeset/beige-turkeys-knock.md | 5 ----- python/poetry.lock | 6 +++--- python/tests/conftest.py | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 .changeset/beige-turkeys-knock.md diff --git a/.changeset/beige-turkeys-knock.md b/.changeset/beige-turkeys-knock.md deleted file mode 100644 index 8aa8a632..00000000 --- a/.changeset/beige-turkeys-knock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': minor ---- - -improved env varible support diff --git a/python/poetry.lock b/python/poetry.lock index 99c4428d..da406771 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -363,14 +363,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.5.4" +version = "1.5.5" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-1.5.4-py3-none-any.whl", hash = "sha256:9c8d22f9203311dff890e037823596daaba3d793300238117f2efc5426888f2c"}, - {file = "e2b-1.5.4.tar.gz", hash = "sha256:49f1c115d0198244beef5854d19cc857fda9382e205f137b98d3dae0e7e0b2d2"}, + {file = "e2b-1.5.5-py3-none-any.whl", hash = "sha256:cd6343193f5b941af33504d422cb39c02515a23a5c94c9ef9fdebeb140fb382e"}, + {file = "e2b-1.5.5.tar.gz", hash = "sha256:541dd0bd8b3ff8aa1f56a2719333d5b8e0465c30df7ebd93e2776cc15672503a"}, ] [package.dependencies] diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 796eab91..30276cb1 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -12,7 +12,7 @@ @pytest.fixture() def template(): - return os.getenv("E2B_TESTS_TEMPLATE", "code-interpreter-v1") + return os.getenv("E2B_TESTS_TEMPLATE") or "code-interpreter-v1" @pytest.fixture() From 4cdc7623c75e7abf658574d26c39ab5c6a645f8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 08:31:41 -0700 Subject: [PATCH 592/722] Bump aiohttp in /template in the pip group across 1 directory (#137) Bumps the pip group with 1 update in the /template directory: [aiohttp](https://github.com/aio-libs/aiohttp). Updates `aiohttp` from 3.11.18 to 3.12.14 - [Release notes](https://github.com/aio-libs/aiohttp/releases) - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.11.18...v3.12.14) --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.12.14 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 0446aec6..e0032e56 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -12,7 +12,7 @@ pillow==11.3.0 e2b_charts # Other packages -aiohttp==3.11.18 +aiohttp==3.12.14 beautifulsoup4==4.13.4 bokeh==3.7.3 gensim==4.3.3 # unmaintained, blocking numpy and scipy bump From 14d866a06e5a17180da446dfaf2e6a963b2e9aa8 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 20 Aug 2025 14:33:18 +0200 Subject: [PATCH 593/722] Update R kernel installation, remove dependency on r studio CDN (#140) * update r kernel installation, remove dependency on rstudio cdn * remove unnecessary env vars * fixed env syntax --- template/Dockerfile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/template/Dockerfile b/template/Dockerfile index a4bb24d0..814c14c0 100644 --- a/template/Dockerfile +++ b/template/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.12 RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo fonts-noto-cjk + build-essential curl git util-linux jq sudo fonts-noto-cjk r-base # Install Node.js 20.x from NodeSource RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ @@ -13,17 +13,13 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ JUPYTER_CONFIG_PATH="/root/.jupyter" \ IPYTHON_CONFIG_PATH="/root/.ipython" \ SERVER_PATH="/root/.server" \ - R_VERSION=4.4.2 - -ENV R_HOME=/opt/R/${R_VERSION} \ - JAVA_HOME=/opt/java/openjdk + JAVA_HOME=/opt/java/openjdk # Install Jupyter COPY ./requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user # R Kernel -RUN curl -O https://cdn.rstudio.com/r/debian-12/pkgs/r-${R_VERSION}_1_amd64.deb && sudo apt-get update && sudo apt-get install -y ./r-${R_VERSION}_1_amd64.deb && ln -s ${R_HOME}/bin/R /usr/bin/R RUN R -e "install.packages('IRkernel', repos='https://cloud.r-project.org')" RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" From d6f669540ac2e4f93b5f8d2dc4e6da04b61434ee Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:32:05 +0200 Subject: [PATCH 594/722] Pre-load JavaScript kernel into memory for faster JS startup (#139) * pre-load javascript kernel * added changeset --- .changeset/yellow-peaches-accept.md | 5 +++++ template/server/main.py | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 .changeset/yellow-peaches-accept.md diff --git a/.changeset/yellow-peaches-accept.md b/.changeset/yellow-peaches-accept.md new file mode 100644 index 00000000..8f6ffde3 --- /dev/null +++ b/.changeset/yellow-peaches-accept.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +pre-load js kernel diff --git a/template/server/main.py b/template/server/main.py index b353d514..59b188a2 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -36,9 +36,12 @@ async def lifespan(app: FastAPI): client = httpx.AsyncClient() try: - default_context = await create_context(client, websockets, "python", "/home/user") - default_websockets["python"] = default_context.id - websockets["default"] = websockets[default_context.id] + python_context = await create_context(client, websockets, "python", "/home/user") + default_websockets["python"] = python_context.id + websockets["default"] = websockets[python_context.id] + + javascript_context = await create_context(client, websockets, "javascript", "/home/user") + default_websockets["javascript"] = javascript_context.id logger.info("Connected to default runtime") yield From 76a640622aa92ce3b089143a8e5d0d9819ce6322 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 Aug 2025 13:50:04 +0000 Subject: [PATCH 595/722] [skip ci] Release new versions --- .changeset/yellow-peaches-accept.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/yellow-peaches-accept.md diff --git a/.changeset/yellow-peaches-accept.md b/.changeset/yellow-peaches-accept.md deleted file mode 100644 index 8f6ffde3..00000000 --- a/.changeset/yellow-peaches-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -pre-load js kernel diff --git a/template/package.json b/template/package.json index fd7d6236..39400e5d 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.11" + "version": "0.0.12" } From f56a18219f86652611ba3e96a2e7a6ecb849d02c Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 21 Aug 2025 19:49:00 +0200 Subject: [PATCH 596/722] Fix performance regression when setting env vars on first execution (#141) * inline env var snippet * split env var snippet into two different methods * handle setting global env vars (remove in background) * cursor suggestion * fix identation issues for env blocks * fix a race condition when subsequent request fire too rapidly before the cleanup could complete * make some ContextWebSocket private * fixes underscore var * sequential env var snippets * removed dead code (Cursor) * none check for global env vars * changed env var snippet logic and self._global_env_vars check --- python/tests/conftest.py | 4 +- template/server/main.py | 5 - template/server/messaging.py | 240 ++++++++++++++++++++++------------- 3 files changed, 154 insertions(+), 95 deletions(-) diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 30276cb1..daac9822 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -17,7 +17,7 @@ def template(): @pytest.fixture() def sandbox(template, debug): - sandbox = Sandbox(template, timeout=timeout) + sandbox = Sandbox(template, timeout=timeout, debug=debug) try: yield sandbox @@ -33,7 +33,7 @@ def sandbox(template, debug): @pytest_asyncio.fixture async def async_sandbox(template, debug): - async_sandbox = await AsyncSandbox.create(template, timeout=timeout) + async_sandbox = await AsyncSandbox.create(template, timeout=timeout, debug=debug) try: yield async_sandbox diff --git a/template/server/main.py b/template/server/main.py index 59b188a2..86e57e17 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -108,11 +108,6 @@ async def post_execute(request: ExecutionRequest): status_code=404, ) - # set global env vars if not set on first execution - if not ws.global_env_vars: - ws.global_env_vars = await get_envs() - await ws.set_env_vars(ws.global_env_vars) - return StreamingListJsonResponse( ws.execute( request.code, diff --git a/template/server/messaging.py b/template/server/messaging.py index 7bc2902f..7c295b2d 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -23,6 +23,7 @@ UnexpectedEndOfExecution, ) from errors import ExecutionError +from envs import get_envs logger = logging.getLogger(__name__) @@ -47,7 +48,8 @@ def __init__(self, in_background: bool = False): class ContextWebSocket: _ws: Optional[WebSocketClientProtocol] = None _receive_task: Optional[asyncio.Task] = None - global_env_vars: Optional[Dict[StrictStr, str]] = None + _global_env_vars: Optional[Dict[StrictStr, str]] = None + _cleanup_task: Optional[asyncio.Task] = None def __init__( self, @@ -114,6 +116,113 @@ def _get_execute_request( } ) + def _set_env_var_snippet(self, key: str, value: str) -> str: + """Get environment variable set command for the current language.""" + if self.language == "python": + return f"import os; os.environ['{key}'] = '{value}'" + elif self.language in ["javascript", "typescript"]: + return f"process.env['{key}'] = '{value}'" + elif self.language == "deno": + return f"Deno.env.set('{key}', '{value}')" + elif self.language == "r": + return f'Sys.setenv({key} = "{value}")' + elif self.language == "java": + return f'System.setProperty("{key}", "{value}");' + elif self.language == "bash": + return f"export {key}='{value}'" + return "" + + def _delete_env_var_snippet(self, key: str) -> str: + """Get environment variable delete command for the current language.""" + if self.language == "python": + return f"import os; del os.environ['{key}']" + elif self.language in ["javascript", "typescript"]: + return f"delete process.env['{key}']" + elif self.language == "deno": + return f"Deno.env.delete('{key}')" + elif self.language == "r": + return f"Sys.unsetenv('{key}')" + elif self.language == "java": + return f'System.clearProperty("{key}");' + elif self.language == "bash": + return f"unset {key}" + return "" + + def _set_env_vars_code(self, env_vars: Dict[StrictStr, str]) -> str: + """Build environment variable code for the current language.""" + env_commands = [] + for k, v in env_vars.items(): + command = self._set_env_var_snippet(k, v) + if command: + env_commands.append(command) + + return "\n".join(env_commands) + + def _reset_env_vars_code(self, env_vars: Dict[StrictStr, str]) -> str: + """Build environment variable cleanup code for the current language.""" + cleanup_commands = [] + + for key in env_vars: + # Check if this var exists in global env vars + if self._global_env_vars and key in self._global_env_vars: + # Reset to global value + value = self._global_env_vars[key] + command = self._set_env_var_snippet(key, value) + else: + # Remove the variable + command = self._delete_env_var_snippet(key) + + if command: + cleanup_commands.append(command) + + return "\n".join(cleanup_commands) + + def _get_code_indentation(self, code: str) -> str: + """Get the indentation from the first non-empty line of code.""" + if not code or not code.strip(): + return "" + + lines = code.split('\n') + for line in lines: + if line.strip(): # First non-empty line + return line[:len(line) - len(line.lstrip())] + + return "" + + def _indent_code_with_level(self, code: str, indent_level: str) -> str: + """Apply the given indentation level to each line of code.""" + if not code or not indent_level: + return code + + lines = code.split('\n') + indented_lines = [] + + for line in lines: + if line.strip(): # Non-empty lines + indented_lines.append(indent_level + line) + else: + indented_lines.append(line) + + return '\n'.join(indented_lines) + + async def _cleanup_env_vars(self, env_vars: Dict[StrictStr, str]): + """Clean up environment variables in a separate execution request.""" + message_id = str(uuid.uuid4()) + self._executions[message_id] = Execution(in_background=True) + + try: + cleanup_code = self._reset_env_vars_code(env_vars) + if cleanup_code: + logger.info(f"Cleaning up env vars: {cleanup_code}") + request = self._get_execute_request(message_id, cleanup_code, True) + await self._ws.send(request) + + async for item in self._wait_for_result(message_id): + if item["type"] == "error": + logger.error(f"Error during env var cleanup: {item}") + finally: + del self._executions[message_id] + async def _wait_for_result(self, message_id: str): queue = self._executions[message_id].queue @@ -133,84 +242,6 @@ async def _wait_for_result(self, message_id: str): yield output.model_dump(exclude_none=True) - async def set_env_vars(self, env_vars: Dict[StrictStr, str]): - message_id = str(uuid.uuid4()) - self._executions[message_id] = Execution(in_background=True) - - env_commands = [] - for k, v in env_vars.items(): - if self.language == "python": - env_commands.append(f"import os; os.environ['{k}'] = '{v}'") - elif self.language in ["javascript", "typescript"]: - env_commands.append(f"process.env['{k}'] = '{v}'") - elif self.language == "deno": - env_commands.append(f"Deno.env.set('{k}', '{v}')") - elif self.language == "r": - env_commands.append(f'Sys.setenv({k} = "{v}")') - elif self.language == "java": - env_commands.append(f'System.setProperty("{k}", "{v}");') - elif self.language == "bash": - env_commands.append(f"export {k}='{v}'") - else: - return - - if env_commands: - env_vars_snippet = "\n".join(env_commands) - logger.info(f"Setting env vars: {env_vars_snippet} for {self.language}") - request = self._get_execute_request(message_id, env_vars_snippet, True) - await self._ws.send(request) - - async for item in self._wait_for_result(message_id): - if item["type"] == "error": - raise ExecutionError(f"Error during execution: {item}") - - async def reset_env_vars(self, env_vars: Dict[StrictStr, str]): - # Create a dict of vars to reset and a list of vars to remove - vars_to_reset = {} - vars_to_remove = [] - - for key in env_vars: - if self.global_env_vars and key in self.global_env_vars: - vars_to_reset[key] = self.global_env_vars[key] - else: - vars_to_remove.append(key) - - # Reset vars that exist in global env vars - if vars_to_reset: - await self.set_env_vars(vars_to_reset) - - # Remove vars that don't exist in global env vars - if vars_to_remove: - message_id = str(uuid.uuid4()) - self._executions[message_id] = Execution(in_background=True) - - remove_commands = [] - for key in vars_to_remove: - if self.language == "python": - remove_commands.append(f"import os; del os.environ['{key}']") - elif self.language in ["javascript", "typescript"]: - remove_commands.append(f"delete process.env['{key}']") - elif self.language == "deno": - remove_commands.append(f"Deno.env.delete('{key}')") - elif self.language == "r": - remove_commands.append(f"Sys.unsetenv('{key}')") - elif self.language == "java": - remove_commands.append(f'System.clearProperty("{key}");') - elif self.language == "bash": - remove_commands.append(f"unset {key}") - else: - return - - if remove_commands: - remove_snippet = "\n".join(remove_commands) - logger.info(f"Removing env vars: {remove_snippet} for {self.language}") - request = self._get_execute_request(message_id, remove_snippet, True) - await self._ws.send(request) - - async for item in self._wait_for_result(message_id): - if item["type"] == "error": - raise ExecutionError(f"Error during execution: {item}") - async def change_current_directory( self, path: Union[str, StrictStr], language: str ): @@ -248,20 +279,44 @@ async def execute( env_vars: Dict[StrictStr, str] = None, ): message_id = str(uuid.uuid4()) - logger.debug(f"Sending code for the execution ({message_id}): {code}") - self._executions[message_id] = Execution() if self._ws is None: raise Exception("WebSocket not connected") async with self._lock: - # set env vars (will override global env vars) + # Wait for any pending cleanup task to complete + if self._cleanup_task and not self._cleanup_task.done(): + logger.debug("Waiting for pending cleanup task to complete") + try: + await self._cleanup_task + except Exception as e: + logger.warning(f"Cleanup task failed: {e}") + finally: + self._cleanup_task = None + + # Get the indentation level from the code + code_indent = self._get_code_indentation(code) + + # Build the complete code snippet with env vars + complete_code = code + + global_env_vars_snippet = "" + env_vars_snippet = "" + + if self._global_env_vars is None: + self._global_env_vars = await get_envs() + global_env_vars_snippet = self._set_env_vars_code(self._global_env_vars) + if env_vars: - await self.set_env_vars(env_vars) + env_vars_snippet = self._set_env_vars_code(env_vars) - logger.info(code) - request = self._get_execute_request(message_id, code, False) + if global_env_vars_snippet or env_vars_snippet: + indented_env_code = self._indent_code_with_level(f"{global_env_vars_snippet}\n{env_vars_snippet}", code_indent) + complete_code = f"{indented_env_code}\n{complete_code}" + + logger.info(f"Sending code for the execution ({message_id}): {complete_code}") + request = self._get_execute_request(message_id, complete_code, False) # Send the code for execution await self._ws.send(request) @@ -272,9 +327,9 @@ async def execute( del self._executions[message_id] - # reset env vars to their previous values, if they were set globally or remove them + # Clean up env vars in a separate request after the main code has run if env_vars: - await self.reset_env_vars(env_vars) + self._cleanup_task = asyncio.create_task(self._cleanup_env_vars(env_vars)) async def _receive_message(self): if not self._ws: @@ -434,7 +489,16 @@ async def close(self): if self._ws is not None: await self._ws.close() - self._receive_task.cancel() + if self._receive_task is not None: + self._receive_task.cancel() + + # Cancel any pending cleanup task + if self._cleanup_task and not self._cleanup_task.done(): + self._cleanup_task.cancel() + try: + await self._cleanup_task + except asyncio.CancelledError: + pass for execution in self._executions.values(): execution.queue.put_nowait(UnexpectedEndOfExecution()) From aa451238c1ae74493f9dc1b248d157f2a56813d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Fri, 22 Aug 2025 12:01:08 +0200 Subject: [PATCH 597/722] SDK V2 release (#142) * Update base e2b * Prepare for SDK v2 * Bump e2b * Increase the pytest worker count * Propagate the envs * Rebase * Add changeset * Fix headers * Pass header --- .changeset/new-kings-sleep.md | 6 + .changeset/strange-donkeys-clean.md | 5 + README.md | 2 +- js/package.json | 2 +- js/src/sandbox.ts | 140 +++++++++++------- pnpm-lock.yaml | 32 ++-- python/README.md | 2 +- .../code_interpreter_async.py | 7 +- .../code_interpreter_sync.py | 10 +- python/example.py | 2 +- python/poetry.lock | 10 +- python/pyproject.toml | 2 +- python/pytest.ini | 2 +- python/tests/benchmarking.py | 2 +- python/tests/conftest.py | 2 +- python/tests/sync/env_vars/test_bash.py | 36 ++--- python/tests/sync/env_vars/test_java.py | 28 ++-- python/tests/sync/env_vars/test_js.py | 28 ++-- python/tests/sync/env_vars/test_python.py | 26 ++-- python/tests/sync/env_vars/test_r.py | 28 ++-- template/README.md | 4 +- template/e2b.toml | 2 +- template/server/envs.py | 14 +- template/server/main.py | 33 +++-- template/server/messaging.py | 68 +++++---- 25 files changed, 263 insertions(+), 230 deletions(-) create mode 100644 .changeset/new-kings-sleep.md create mode 100644 .changeset/strange-donkeys-clean.md diff --git a/.changeset/new-kings-sleep.md b/.changeset/new-kings-sleep.md new file mode 100644 index 00000000..d5cbd065 --- /dev/null +++ b/.changeset/new-kings-sleep.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': major +'@e2b/code-interpreter': major +--- + +SDK v2 diff --git a/.changeset/strange-donkeys-clean.md b/.changeset/strange-donkeys-clean.md new file mode 100644 index 00000000..ba41e0e8 --- /dev/null +++ b/.changeset/strange-donkeys-clean.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': minor +--- + +Propagate access token diff --git a/README.md b/README.md index e2d42665..812c3a02 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Python ```py from e2b_code_interpreter import Sandbox -with Sandbox() as sandbox: +with Sandbox.create() as sandbox: sandbox.run_code("x = 1") execution = sandbox.run_code("x+=1; x") print(execution.text) # outputs 2 diff --git a/js/package.json b/js/package.json index 938d5c2e..fa8d1b58 100644 --- a/js/package.json +++ b/js/package.json @@ -66,7 +66,7 @@ "vm" ], "dependencies": { - "e2b": "^1.4.0" + "e2b": "^2.0.1" }, "engines": { "node": ">=18" diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 74db4c9e..89ffdd27 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -1,7 +1,18 @@ import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b' -import { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging' -import { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from "./utils"; +import { + Result, + Execution, + OutputMessage, + parseOutput, + extractError, + ExecutionError, +} from './messaging' +import { + formatExecutionTimeoutError, + formatRequestTimeoutError, + readLines, +} from './utils' import { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts' /** @@ -29,37 +40,37 @@ export interface RunCodeOpts { /** * Callback for handling stdout messages. */ - onStdout?: (output: OutputMessage) => (Promise | any), + onStdout?: (output: OutputMessage) => Promise | any /** * Callback for handling stderr messages. */ - onStderr?: (output: OutputMessage) => (Promise | any), + onStderr?: (output: OutputMessage) => Promise | any /** * Callback for handling the final execution result. */ - onResult?: (data: Result) => (Promise | any), + onResult?: (data: Result) => Promise | any /** * Callback for handling the `ExecutionError` object. */ - onError?: (error: ExecutionError) => (Promise | any), + onError?: (error: ExecutionError) => Promise | any /** * Custom environment variables for code execution. - * + * * @default {} */ - envs?: Record, + envs?: Record /** * Timeout for the code execution in **milliseconds**. - * + * * @default 60_000 // 60 seconds */ - timeoutMs?: number, + timeoutMs?: number /** * Timeout for the request in **milliseconds**. - * + * * @default 30_000 // 30 seconds */ - requestTimeoutMs?: number, + requestTimeoutMs?: number } /** @@ -68,22 +79,22 @@ export interface RunCodeOpts { export interface CreateCodeContextOpts { /** * Working directory for the context. - * + * * @default /home/user */ - cwd?: string, + cwd?: string /** * Language for the context. - * + * * @default python */ - language?: string, + language?: string /** * Timeout for the request in **milliseconds**. - * + * * @default 30_000 // 30 seconds */ - requestTimeoutMs?: number, + requestTimeoutMs?: number } /** @@ -108,18 +119,19 @@ export interface CreateCodeContextOpts { * ``` */ export class Sandbox extends BaseSandbox { - protected static override readonly defaultTemplate: string = 'code-interpreter-v1' + protected static override readonly defaultTemplate: string = + 'code-interpreter-v1' /** * Run the code as Python. - * + * * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - * + * * You can reference previously defined variables, imports, and functions in the code. * * @param code code to execute. * @param opts options for executing the code. - * + * * @returns `Execution` result object. */ async runCode( @@ -127,23 +139,23 @@ export class Sandbox extends BaseSandbox { opts?: RunCodeOpts & { /** * Language to use for code execution. - * + * * If not defined, the default Python context is used. */ - language?: 'python', - }, + language?: 'python' + } ): Promise /** * Run the code for the specified language. - * + * * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. * If no language is specified, Python is used. - * + * * You can reference previously defined variables, imports, and functions in the code. * * @param code code to execute. * @param opts options for executing the code. - * + * * @returns `Execution` result object. */ async runCode( @@ -151,22 +163,22 @@ export class Sandbox extends BaseSandbox { opts?: RunCodeOpts & { /** * Language to use for code execution. - * + * * If not defined, the default Python context is used. */ - language?: string, - }, + language?: string + } ): Promise /** * Runs the code in the specified context, if not specified, the default context is used. - * + * * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - * + * * You can reference previously defined variables, imports, and functions in the code. * * @param code code to execute. * @param opts options for executing the code - * + * * @returns `Execution` result object */ async runCode( @@ -175,35 +187,44 @@ export class Sandbox extends BaseSandbox { /** * Context to run the code in. */ - context?: Context, - }, + context?: Context + } ): Promise async runCode( code: string, opts?: RunCodeOpts & { - language?: string, - context?: Context, - }, + language?: string + context?: Context + } ): Promise { if (opts?.context && opts?.language) { - throw new InvalidArgumentError("You can provide context or language, but not both at the same time.") + throw new InvalidArgumentError( + 'You can provide context or language, but not both at the same time.' + ) } const controller = new AbortController() - const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs + const requestTimeout = + opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs - const reqTimer = requestTimeout ? setTimeout(() => { - controller.abort() - }, requestTimeout) + const reqTimer = requestTimeout + ? setTimeout(() => { + controller.abort() + }, requestTimeout) : undefined + const headers: Record = { + 'Content-Type': 'application/json', + } + if (this.envdAccessToken) { + headers['X-Access-Token'] = this.envdAccessToken + } + try { const res = await fetch(`${this.jupyterUrl}/execute`, { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers, body: JSON.stringify({ code, context_id: opts?.context?.id, @@ -220,7 +241,9 @@ export class Sandbox extends BaseSandbox { } if (!res.body) { - throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`) + throw new Error( + `Not response body: ${res.statusText} ${await res?.text()}` + ) } clearTimeout(reqTimer) @@ -229,16 +252,22 @@ export class Sandbox extends BaseSandbox { const bodyTimer = bodyTimeout ? setTimeout(() => { - controller.abort() - }, bodyTimeout) + controller.abort() + }, bodyTimeout) : undefined const execution = new Execution() - try { for await (const chunk of readLines(res.body)) { - await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError) + await parseOutput( + execution, + chunk, + opts?.onStdout, + opts?.onStderr, + opts?.onResult, + opts?.onError + ) } } catch (error) { throw formatExecutionTimeoutError(error) @@ -256,7 +285,7 @@ export class Sandbox extends BaseSandbox { * Creates a new context to run code in. * * @param opts options for creating the context. - * + * * @returns context object. */ async createCodeContext(opts?: CreateCodeContextOpts): Promise { @@ -265,6 +294,7 @@ export class Sandbox extends BaseSandbox { method: 'POST', headers: { 'Content-Type': 'application/json', + ...this.connectionConfig.headers, }, body: JSON.stringify({ language: opts?.language, @@ -286,6 +316,8 @@ export class Sandbox extends BaseSandbox { } protected get jupyterUrl(): string { - return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}` + return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost( + JUPYTER_PORT + )}` } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88e9a825..5123dd42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ importers: js: dependencies: e2b: - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^2.0.1 + version: 2.0.1 devDependencies: '@types/node': specifier: ^18.18.6 @@ -64,8 +64,8 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.2.2': - resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==} + '@bufbuild/protobuf@2.6.3': + resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} '@changesets/apply-release-plan@7.0.8': resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} @@ -679,8 +679,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@1.4.0: - resolution: {integrity: sha512-KGe5F5UI+1PZ82OBjPHsYqpbw33ck7j0xgcJRSS56mAOWMX/Z6xllXqbZj66Xg6kkO32GmSGXjCAZL4FMSfyug==} + e2b@2.0.1: + resolution: {integrity: sha512-wJgZTV1QFeh5WKQ23n6hWmMODPmyKiiWaQy+uxvV/5M9NH/zMY/ONzhh7j7ONYgeH8jdRZxOS2e+G345EodGeA==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -1502,7 +1502,7 @@ snapshots: '@babel/runtime@7.27.1': {} - '@bufbuild/protobuf@2.2.2': {} + '@bufbuild/protobuf@2.6.3': {} '@changesets/apply-release-plan@7.0.8': dependencies: @@ -1646,14 +1646,14 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3))': dependencies: - '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) + '@bufbuild/protobuf': 2.6.3 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3) - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)': dependencies: - '@bufbuild/protobuf': 2.2.2 + '@bufbuild/protobuf': 2.6.3 '@esbuild/aix-ppc64@0.25.0': optional: true @@ -2089,11 +2089,11 @@ snapshots: dotenv@16.4.7: {} - e2b@1.4.0: + e2b@2.0.1: dependencies: - '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)) + '@bufbuild/protobuf': 2.6.3 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)) compare-versions: 6.1.0 openapi-fetch: 0.9.8 platform: 1.3.6 diff --git a/python/README.md b/python/README.md index 4432c5d5..aec65804 100644 --- a/python/README.md +++ b/python/README.md @@ -36,7 +36,7 @@ E2B_API_KEY=e2b_*** ```py from e2b_code_interpreter import Sandbox -with Sandbox() as sandbox: +with Sandbox.create() as sandbox: sandbox.run_code("x = 1") execution = sandbox.run_code("x+=1; x") print(execution.text) # outputs 2 diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index c521af83..7821eaef 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -6,7 +6,6 @@ from e2b import ( AsyncSandbox as BaseAsyncSandbox, - ConnectionConfig, InvalidArgumentException, ) @@ -189,7 +188,7 @@ async def run_code( ) timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) - request_timeout = request_timeout or self._connection_config.request_timeout + request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None try: @@ -202,6 +201,7 @@ async def run_code( "language": language, "env_vars": envs, }, + headers={"X-Access-Token": self._envd_access_token}, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: @@ -253,8 +253,9 @@ async def create_code_context( try: response = await self._client.post( f"{self._jupyter_url}/contexts", + headers={"X-Access-Token": self._envd_access_token}, json=data, - timeout=request_timeout or self._connection_config.request_timeout, + timeout=request_timeout or self.connection_config.request_timeout, ) err = await aextract_exception(response) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 22c47c0d..978c6dc5 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -41,13 +41,13 @@ class Sandbox(BaseSandbox): Check docs [here](https://e2b.dev/docs). - Use the `Sandbox()` to create a new sandbox. + Use the `Sandbox.create()` to create a new sandbox. Example: ```python from e2b_code_interpreter import Sandbox - sandbox = Sandbox() + sandbox = Sandbox.create() ``` """ @@ -185,7 +185,7 @@ def run_code( ) timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) - request_timeout = request_timeout or self._connection_config.request_timeout + request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None try: @@ -198,6 +198,7 @@ def run_code( "language": language, "env_vars": envs, }, + headers={"X-Access-Token": self._envd_access_token}, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: err = extract_exception(response) @@ -249,7 +250,8 @@ def create_code_context( response = self._client.post( f"{self._jupyter_url}/contexts", json=data, - timeout=request_timeout or self._connection_config.request_timeout, + headers={"X-Access-Token": self._envd_access_token}, + timeout=request_timeout or self.connection_config.request_timeout, ) err = extract_exception(response) diff --git a/python/example.py b/python/example.py index 1557f794..56b447bf 100644 --- a/python/example.py +++ b/python/example.py @@ -34,7 +34,7 @@ async def run(): - sbx = Sandbox(timeout=60) + sbx = Sandbox.create(timeout=60) e = sbx.run_code(code) print(e.results[0].chart) diff --git a/python/poetry.lock b/python/poetry.lock index da406771..93bf6fe1 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -363,14 +363,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "1.5.5" +version = "2.0.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-1.5.5-py3-none-any.whl", hash = "sha256:cd6343193f5b941af33504d422cb39c02515a23a5c94c9ef9fdebeb140fb382e"}, - {file = "e2b-1.5.5.tar.gz", hash = "sha256:541dd0bd8b3ff8aa1f56a2719333d5b8e0465c30df7ebd93e2776cc15672503a"}, + {file = "e2b-2.0.0-py3-none-any.whl", hash = "sha256:a6621b905cb2a883a9c520736ae98343a6184fc90c29b4f2f079d720294a0df0"}, + {file = "e2b-2.0.0.tar.gz", hash = "sha256:4d033d937b0a09b8428e73233321a913cbaef8e7299fc731579c656e9d53a144"}, ] [package.dependencies] @@ -378,7 +378,7 @@ attrs = ">=23.2.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" -protobuf = ">=5.29.4,<6.0.0" +protobuf = ">=4.21.0" python-dateutil = ">=2.8.2" typing-extensions = ">=4.1.0" @@ -1193,4 +1193,4 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "166eb5f8bc1132d916fa088a8b99eb4611498215fcf720e5abe4681b2ab71958" +content-hash = "0e418edc53bd5281cad796e539debdbfbd6634a228b94336211d7198ce98d92b" diff --git a/python/pyproject.toml b/python/pyproject.toml index 4344de46..1630b686 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^1.5.4" +e2b = "^2.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" diff --git a/python/pytest.ini b/python/pytest.ini index e74467d5..7695413b 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -4,4 +4,4 @@ markers = skip_debug: skip test if E2B_DEBUG is set. asyncio_mode=auto -addopts = "--import-mode=importlib" "--numprocesses=1" +addopts = "--import-mode=importlib" "--numprocesses=2" diff --git a/python/tests/benchmarking.py b/python/tests/benchmarking.py index c78d674c..c3a4855c 100644 --- a/python/tests/benchmarking.py +++ b/python/tests/benchmarking.py @@ -14,7 +14,7 @@ for i in range(iterations): print("Iteration:", i + 1) start_time = time.time() - sandbox = Sandbox() + sandbox = Sandbox.create() create_sandbox_time += time.time() - start_time start_time = time.time() diff --git a/python/tests/conftest.py b/python/tests/conftest.py index daac9822..544f2ca5 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -17,7 +17,7 @@ def template(): @pytest.fixture() def sandbox(template, debug): - sandbox = Sandbox(template, timeout=timeout, debug=debug) + sandbox = Sandbox.create(template, timeout=timeout, debug=debug) try: yield sandbox diff --git a/python/tests/sync/env_vars/test_bash.py b/python/tests/sync/env_vars/test_bash.py index a77e9b54..9f5ea728 100644 --- a/python/tests/sync/env_vars/test_bash.py +++ b/python/tests/sync/env_vars/test_bash.py @@ -1,46 +1,34 @@ import pytest from e2b_code_interpreter import Sandbox + @pytest.mark.skip_debug() def test_env_vars_on_sandbox(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: - result = sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash" - ) + result = sandbox.run_code("echo $TEST_ENV_VAR", language="bash") assert result.logs.stdout[0] == "supertest\n" finally: sandbox.kill() + def test_env_vars_per_execution(sandbox: Sandbox): - result = sandbox.run_code( - "echo $FOO", - envs={"FOO": "bar"}, - language="bash" - ) - - result_empty = sandbox.run_code( - "echo ${FOO:-default}", - language="bash" - ) - + result = sandbox.run_code("echo $FOO", envs={"FOO": "bar"}, language="bash") + + result_empty = sandbox.run_code("echo ${FOO:-default}", language="bash") + assert result.logs.stdout[0] == "bar\n" assert result_empty.logs.stdout[0] == "default\n" + @pytest.mark.skip_debug() def test_env_vars_overwrite(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash", - envs={"TEST_ENV_VAR": "overwrite"} - ) - result_global_default = sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash" + "echo $TEST_ENV_VAR", language="bash", envs={"TEST_ENV_VAR": "overwrite"} ) + result_global_default = sandbox.run_code("echo $TEST_ENV_VAR", language="bash") assert result.logs.stdout[0] == "overwrite\n" assert result_global_default.logs.stdout[0] == "supertest\n" finally: diff --git a/python/tests/sync/env_vars/test_java.py b/python/tests/sync/env_vars/test_java.py index 21a804e5..b0950d9d 100644 --- a/python/tests/sync/env_vars/test_java.py +++ b/python/tests/sync/env_vars/test_java.py @@ -1,32 +1,28 @@ import pytest from e2b_code_interpreter import Sandbox + @pytest.mark.skip_debug() def test_env_vars_on_sandbox(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: - result = sandbox.run_code( - 'System.getProperty("TEST_ENV_VAR")', - language="java" - ) + result = sandbox.run_code('System.getProperty("TEST_ENV_VAR")', language="java") assert result.text is not None assert result.text.strip() == "supertest" finally: sandbox.kill() + def test_env_vars_per_execution(sandbox: Sandbox): try: result = sandbox.run_code( - 'System.getProperty("FOO")', - envs={"FOO": "bar"}, - language="java" + 'System.getProperty("FOO")', envs={"FOO": "bar"}, language="java" ) - + result_empty = sandbox.run_code( - 'System.getProperty("FOO", "default")', - language="java" + 'System.getProperty("FOO", "default")', language="java" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None @@ -34,18 +30,18 @@ def test_env_vars_per_execution(sandbox: Sandbox): finally: sandbox.kill() + @pytest.mark.skip_debug() def test_env_vars_overwrite(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( 'System.getProperty("TEST_ENV_VAR")', language="java", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = sandbox.run_code( - 'System.getProperty("TEST_ENV_VAR")', - language="java" + 'System.getProperty("TEST_ENV_VAR")', language="java" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/sync/env_vars/test_js.py b/python/tests/sync/env_vars/test_js.py index 224740ce..6561d65b 100644 --- a/python/tests/sync/env_vars/test_js.py +++ b/python/tests/sync/env_vars/test_js.py @@ -1,32 +1,28 @@ import pytest from e2b_code_interpreter import Sandbox + @pytest.mark.skip_debug() def test_env_vars_on_sandbox(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: - result = sandbox.run_code( - "process.env.TEST_ENV_VAR", - language="javascript" - ) + result = sandbox.run_code("process.env.TEST_ENV_VAR", language="javascript") assert result.text is not None assert result.text.strip() == "supertest" finally: sandbox.kill() + def test_env_vars_per_execution(sandbox: Sandbox): try: result = sandbox.run_code( - "process.env.FOO", - envs={"FOO": "bar"}, - language="javascript" + "process.env.FOO", envs={"FOO": "bar"}, language="javascript" ) - + result_empty = sandbox.run_code( - "process.env.FOO || 'default'", - language="javascript" + "process.env.FOO || 'default'", language="javascript" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None @@ -34,18 +30,18 @@ def test_env_vars_per_execution(sandbox: Sandbox): finally: sandbox.kill() + @pytest.mark.skip_debug() def test_env_vars_overwrite(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( "process.env.TEST_ENV_VAR", language="javascript", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = sandbox.run_code( - "process.env.TEST_ENV_VAR", - language="javascript" + "process.env.TEST_ENV_VAR", language="javascript" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/sync/env_vars/test_python.py b/python/tests/sync/env_vars/test_python.py index 1d54d0c5..95170c75 100644 --- a/python/tests/sync/env_vars/test_python.py +++ b/python/tests/sync/env_vars/test_python.py @@ -1,32 +1,30 @@ import pytest from e2b_code_interpreter import Sandbox + @pytest.mark.skip_debug() def test_env_vars_on_sandbox(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( - "import os; os.getenv('TEST_ENV_VAR')", - language="python" + "import os; os.getenv('TEST_ENV_VAR')", language="python" ) assert result.text is not None assert result.text.strip() == "supertest" finally: sandbox.kill() + def test_env_vars_per_execution(sandbox: Sandbox): try: result = sandbox.run_code( - "import os; os.getenv('FOO')", - envs={"FOO": "bar"}, - language="python" + "import os; os.getenv('FOO')", envs={"FOO": "bar"}, language="python" ) - + result_empty = sandbox.run_code( - "import os; os.getenv('FOO', 'default')", - language="python" + "import os; os.getenv('FOO', 'default')", language="python" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None @@ -34,18 +32,18 @@ def test_env_vars_per_execution(sandbox: Sandbox): finally: sandbox.kill() + @pytest.mark.skip_debug() def test_env_vars_overwrite(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( "import os; os.getenv('TEST_ENV_VAR')", language="python", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = sandbox.run_code( - "import os; os.getenv('TEST_ENV_VAR')", - language="python" + "import os; os.getenv('TEST_ENV_VAR')", language="python" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/sync/env_vars/test_r.py b/python/tests/sync/env_vars/test_r.py index a2984755..c1641116 100644 --- a/python/tests/sync/env_vars/test_r.py +++ b/python/tests/sync/env_vars/test_r.py @@ -1,32 +1,28 @@ import pytest from e2b_code_interpreter import Sandbox + @pytest.mark.skip_debug() def test_env_vars_on_sandbox(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: - result = sandbox.run_code( - "Sys.getenv('TEST_ENV_VAR')", - language="r" - ) + result = sandbox.run_code("Sys.getenv('TEST_ENV_VAR')", language="r") assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "supertest"' finally: sandbox.kill() + def test_env_vars_per_execution(sandbox: Sandbox): try: result = sandbox.run_code( - "Sys.getenv('FOO')", - envs={"FOO": "bar"}, - language="r" + "Sys.getenv('FOO')", envs={"FOO": "bar"}, language="r" ) - + result_empty = sandbox.run_code( - "Sys.getenv('FOO', unset = 'default')", - language="r" + "Sys.getenv('FOO', unset = 'default')", language="r" ) - + assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "bar"' assert result_empty.results[0].text is not None @@ -34,18 +30,18 @@ def test_env_vars_per_execution(sandbox: Sandbox): finally: sandbox.kill() + @pytest.mark.skip_debug() def test_env_vars_overwrite(template): - sandbox = Sandbox(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = Sandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) try: result = sandbox.run_code( "Sys.getenv('TEST_ENV_VAR')", language="r", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = sandbox.run_code( - "Sys.getenv('TEST_ENV_VAR')", - language="r" + "Sys.getenv('TEST_ENV_VAR')", language="r" ) assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "overwrite"' diff --git a/template/README.md b/template/README.md index 6e70302e..c1103acd 100644 --- a/template/README.md +++ b/template/README.md @@ -24,12 +24,12 @@ If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled **Python** ```python from e2b_code_interpreter import Sandbox - sandbox = Sandbox(template="your-custom-sandbox-name") + sandbox = Sandbox.create(template="your-custom-sandbox-name") execution = sandbox.run_code("print('hello')") sandbox.kill() # Or you can use `with` which handles closing the sandbox for you - with Sandbox(template="your-custom-sandbox-name") as sandbox: + with Sandbox.create(template="your-custom-sandbox-name") as sandbox: execution = sandbox.run_code("print('hello')") ``` diff --git a/template/e2b.toml b/template/e2b.toml index a488e5d9..1eb93ae1 100644 --- a/template/e2b.toml +++ b/template/e2b.toml @@ -3,7 +3,7 @@ # Python SDK # from e2b import Sandbox, AsyncSandbox -# sandbox = Sandbox("code-interpreter-v1") # Sync sandbox +# sandbox = Sandbox.create("code-interpreter-v1") # Sync sandbox # sandbox = await AsyncSandbox.create("code-interpreter-v1") # Async sandbox # JS SDK diff --git a/template/server/envs.py b/template/server/envs.py index 2456f74d..8752e7b9 100644 --- a/template/server/envs.py +++ b/template/server/envs.py @@ -1,4 +1,5 @@ import os +from typing import Optional import httpx @@ -6,11 +7,14 @@ ENVD_PORT = 49983 -async def get_envs() -> dict: +async def get_envs(access_token: Optional[str]) -> dict: if LOCAL: - return { - "E2B_TEST_VARIABLE": "true" - } + return {"E2B_TEST_VARIABLE": "true"} async with httpx.AsyncClient() as client: - response = await client.get(f"http://localhost:{ENVD_PORT}/envs") + headers = {} + if access_token: + headers["X-Access-Token"] = f"{access_token}" + response = await client.get( + f"http://localhost:{ENVD_PORT}/envs", headers=headers + ) return response.json() diff --git a/template/server/main.py b/template/server/main.py index 86e57e17..917c87ab 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -1,12 +1,11 @@ import logging import sys -import uuid import httpx from typing import Dict, Union, Literal, Set from contextlib import asynccontextmanager -from fastapi import FastAPI +from fastapi import FastAPI, Request from fastapi.responses import PlainTextResponse from api.models.context import Context @@ -17,7 +16,6 @@ from messaging import ContextWebSocket from stream import StreamingListJsonResponse from utils.locks import LockedMap -from envs import get_envs logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) logger = logging.Logger(__name__) @@ -36,11 +34,15 @@ async def lifespan(app: FastAPI): client = httpx.AsyncClient() try: - python_context = await create_context(client, websockets, "python", "/home/user") + python_context = await create_context( + client, websockets, "python", "/home/user" + ) default_websockets["python"] = python_context.id websockets["default"] = websockets[python_context.id] - javascript_context = await create_context(client, websockets, "javascript", "/home/user") + javascript_context = await create_context( + client, websockets, "javascript", "/home/user" + ) default_websockets["javascript"] = javascript_context.id logger.info("Connected to default runtime") @@ -67,18 +69,18 @@ async def get_health(): @app.post("/execute") -async def post_execute(request: ExecutionRequest): - logger.info(f"Executing code: {request.code}") +async def post_execute(request: Request, exec_request: ExecutionRequest): + logger.info(f"Executing code: {exec_request.code}") - if request.context_id and request.language: + if exec_request.context_id and exec_request.language: return PlainTextResponse( "Only one of context_id or language can be provided", status_code=400, ) context_id = None - if request.language: - language = normalize_language(request.language) + if exec_request.language: + language = normalize_language(exec_request.language) async with await default_websockets.get_lock(language): context_id = default_websockets.get(language) @@ -94,8 +96,8 @@ async def post_execute(request: ExecutionRequest): context_id = context.id default_websockets[language] = context_id - elif request.context_id: - context_id = request.context_id + elif exec_request.context_id: + context_id = exec_request.context_id if context_id: ws = websockets.get(context_id, None) @@ -104,14 +106,15 @@ async def post_execute(request: ExecutionRequest): if not ws: return PlainTextResponse( - f"Context {request.context_id} not found", + f"Context {exec_request.context_id} not found", status_code=404, ) return StreamingListJsonResponse( ws.execute( - request.code, - env_vars=request.env_vars, + exec_request.code, + env_vars=exec_request.env_vars, + access_token=request.headers.get("X-Access-Token", None), ) ) diff --git a/template/server/messaging.py b/template/server/messaging.py index 7c295b2d..e541351f 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -27,6 +27,7 @@ logger = logging.getLogger(__name__) + class Execution: def __init__(self, in_background: bool = False): self.queue = Queue[ @@ -51,13 +52,7 @@ class ContextWebSocket: _global_env_vars: Optional[Dict[StrictStr, str]] = None _cleanup_task: Optional[asyncio.Task] = None - def __init__( - self, - context_id: str, - session_id: str, - language: str, - cwd: str - ): + def __init__(self, context_id: str, session_id: str, language: str, cwd: str): self.language = language self.cwd = cwd self.context_id = context_id @@ -155,13 +150,13 @@ def _set_env_vars_code(self, env_vars: Dict[StrictStr, str]) -> str: command = self._set_env_var_snippet(k, v) if command: env_commands.append(command) - + return "\n".join(env_commands) def _reset_env_vars_code(self, env_vars: Dict[StrictStr, str]) -> str: """Build environment variable cleanup code for the current language.""" cleanup_commands = [] - + for key in env_vars: # Check if this var exists in global env vars if self._global_env_vars and key in self._global_env_vars: @@ -171,39 +166,39 @@ def _reset_env_vars_code(self, env_vars: Dict[StrictStr, str]) -> str: else: # Remove the variable command = self._delete_env_var_snippet(key) - + if command: cleanup_commands.append(command) - + return "\n".join(cleanup_commands) def _get_code_indentation(self, code: str) -> str: """Get the indentation from the first non-empty line of code.""" if not code or not code.strip(): return "" - - lines = code.split('\n') + + lines = code.split("\n") for line in lines: if line.strip(): # First non-empty line - return line[:len(line) - len(line.lstrip())] - + return line[: len(line) - len(line.lstrip())] + return "" def _indent_code_with_level(self, code: str, indent_level: str) -> str: """Apply the given indentation level to each line of code.""" if not code or not indent_level: return code - - lines = code.split('\n') + + lines = code.split("\n") indented_lines = [] - + for line in lines: if line.strip(): # Non-empty lines indented_lines.append(indent_level + line) else: indented_lines.append(line) - - return '\n'.join(indented_lines) + + return "\n".join(indented_lines) async def _cleanup_env_vars(self, env_vars: Dict[StrictStr, str]): """Clean up environment variables in a separate execution request.""" @@ -276,7 +271,8 @@ async def change_current_directory( async def execute( self, code: Union[str, StrictStr], - env_vars: Dict[StrictStr, str] = None, + env_vars: Dict[StrictStr, str], + access_token: str, ): message_id = str(uuid.uuid4()) self._executions[message_id] = Execution() @@ -294,28 +290,32 @@ async def execute( logger.warning(f"Cleanup task failed: {e}") finally: self._cleanup_task = None - + # Get the indentation level from the code code_indent = self._get_code_indentation(code) - + # Build the complete code snippet with env vars complete_code = code - + global_env_vars_snippet = "" env_vars_snippet = "" if self._global_env_vars is None: - self._global_env_vars = await get_envs() + self._global_env_vars = await get_envs(access_token=access_token) global_env_vars_snippet = self._set_env_vars_code(self._global_env_vars) - + if env_vars: env_vars_snippet = self._set_env_vars_code(env_vars) if global_env_vars_snippet or env_vars_snippet: - indented_env_code = self._indent_code_with_level(f"{global_env_vars_snippet}\n{env_vars_snippet}", code_indent) + indented_env_code = self._indent_code_with_level( + f"{global_env_vars_snippet}\n{env_vars_snippet}", code_indent + ) complete_code = f"{indented_env_code}\n{complete_code}" - logger.info(f"Sending code for the execution ({message_id}): {complete_code}") + logger.info( + f"Sending code for the execution ({message_id}): {complete_code}" + ) request = self._get_execute_request(message_id, complete_code, False) # Send the code for execution @@ -329,7 +329,9 @@ async def execute( # Clean up env vars in a separate request after the main code has run if env_vars: - self._cleanup_task = asyncio.create_task(self._cleanup_env_vars(env_vars)) + self._cleanup_task = asyncio.create_task( + self._cleanup_env_vars(env_vars) + ) async def _receive_message(self): if not self._ws: @@ -396,7 +398,9 @@ async def _process_message(self, data: dict): elif data["msg_type"] == "stream": if data["content"]["name"] == "stdout": - logger.debug(f"Execution {parent_msg_ig} received stdout: {data['content']['text']}") + logger.debug( + f"Execution {parent_msg_ig} received stdout: {data['content']['text']}" + ) await queue.put( Stdout( text=data["content"]["text"], timestamp=data["header"]["date"] @@ -404,7 +408,9 @@ async def _process_message(self, data: dict): ) elif data["content"]["name"] == "stderr": - logger.debug(f"Execution {parent_msg_ig} received stderr: {data['content']['text']}") + logger.debug( + f"Execution {parent_msg_ig} received stderr: {data['content']['text']}" + ) await queue.put( Stderr( text=data["content"]["text"], timestamp=data["header"]["date"] From f0011a5ca6c2ea3b241d8228495f5831c970f16c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 22 Aug 2025 10:17:07 +0000 Subject: [PATCH 598/722] [skip ci] Release new versions --- .changeset/new-kings-sleep.md | 6 - .changeset/strange-donkeys-clean.md | 5 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.0.0/charts/page.mdx | 240 ++++++ .../v2.0.0/consts/page.mdx | 13 + .../v2.0.0/index/page.mdx | 103 +++ .../v2.0.0/messaging/page.mdx | 326 ++++++++ .../v2.0.0/sandbox/page.mdx | 312 ++++++++ .../v2.0.0/sandbox/page.mdx | 722 ++++++++++++++++++ template/package.json | 2 +- 12 files changed, 1720 insertions(+), 15 deletions(-) delete mode 100644 .changeset/new-kings-sleep.md delete mode 100644 .changeset/strange-donkeys-clean.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx diff --git a/.changeset/new-kings-sleep.md b/.changeset/new-kings-sleep.md deleted file mode 100644 index d5cbd065..00000000 --- a/.changeset/new-kings-sleep.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': major -'@e2b/code-interpreter': major ---- - -SDK v2 diff --git a/.changeset/strange-donkeys-clean.md b/.changeset/strange-donkeys-clean.md deleted file mode 100644 index ba41e0e8..00000000 --- a/.changeset/strange-donkeys-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': minor ---- - -Propagate access token diff --git a/js/package.json b/js/package.json index fa8d1b58..289407b4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "1.5.1", + "version": "2.0.0", "packageManager": "pnpm@8.7.6", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 463680a0..39f5b70b 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "1.5.2", + "version": "2.0.0", "packageManager": "pnpm@8.7.6", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 1630b686..739eb37c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "1.5.2" +version = "2.0.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx new file mode 100644 index 00000000..a3bb8d72 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + diff --git a/template/package.json b/template/package.json index 39400e5d..f446dd7e 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,5 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.0.12" + "version": "0.1.0" } From 5592fd663be0832505831554b12168167ddea142 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 29 Aug 2025 15:58:11 +0200 Subject: [PATCH 599/722] Added performance benchmarks for Code Interpreter CI/CD (#145) * added performance tests * Update pull_request.yml to include performance-tests in cleanup-build-template dependencies * updated lock file * on PR quick iteration around * Refactor performance tests workflow and enhance performance plot generation - Renamed job from 'publish' to 'performance-tests' for clarity. - Added step to upload performance plot artifact after tests. - Updated boxplot function to use 'tick_labels' for better label handling. * change artifcat directory * relative file path * corrected work dir * iterations count, prod cd * fixed workflow syntax --- .github/workflows/performance_tests.yml | 63 +++ .github/workflows/pull_request.yml | 10 +- python/poetry.lock | 618 +++++++++++++++++++++++- python/pyproject.toml | 1 + python/tests/benchmarking.py | 33 -- python/tests/performance.py | 205 ++++++++ 6 files changed, 893 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/performance_tests.yml delete mode 100644 python/tests/benchmarking.py create mode 100644 python/tests/performance.py diff --git a/.github/workflows/performance_tests.yml b/.github/workflows/performance_tests.yml new file mode 100644 index 00000000..7f1c8bb2 --- /dev/null +++ b/.github/workflows/performance_tests.yml @@ -0,0 +1,63 @@ +name: Performance tests + +on: + workflow_call: + secrets: + E2B_API_KEY: + required: true + inputs: + E2B_DOMAIN: + required: false + type: string + E2B_TESTS_TEMPLATE: + required: false + type: string + E2B_TESTS_BENCHMARK_ITERATIONS_COUNT: + required: false + type: number + default: 20 + +permissions: + contents: read + +jobs: + performance-tests: + defaults: + run: + working-directory: ./python + name: Performance tests + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install dependencies + run: poetry install + + - name: Run performance tests + run: poetry run python tests/performance.py + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} + E2B_TESTS_BENCHMARK_ITERATIONS_COUNT: ${{ inputs.E2B_TESTS_BENCHMARK_ITERATIONS_COUNT }} + - name: Upload performance plot artifact + uses: actions/upload-artifact@v4 + if: always() + with: + name: performance-plot-${{ github.run_number }} + path: ./python/performance_plot.png + retention-days: 30 \ No newline at end of file diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 29aa1e15..5ea47773 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -36,9 +36,17 @@ jobs: with: E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} E2B_TESTS_TEMPLATE: ${{ needs.build-template.outputs.template_id }} + performance-tests: + uses: ./.github/workflows/performance_tests.yml + needs: build-template + secrets: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + with: + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + E2B_TESTS_TEMPLATE: ${{ needs.build-template.outputs.template_id }} cleanup-build-template: uses: ./.github/workflows/cleanup_build_template.yml - needs: [build-template, js-sdk, python-sdk] + needs: [build-template, js-sdk, python-sdk, performance-tests] if: always() && !contains(needs.build-template.result, 'failure') && !contains(needs.build-template.result, 'cancelled') secrets: E2B_TESTS_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} diff --git a/python/poetry.lock b/python/poetry.lock index 93bf6fe1..12ef5869 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -245,6 +245,107 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.3.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "databind" version = "4.5.2" @@ -413,6 +514,87 @@ files = [ [package.extras] testing = ["hatch", "pre-commit", "pytest", "tox"] +[[package]] +name = "fonttools" +version = "4.59.2" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "fonttools-4.59.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2a159e36ae530650acd13604f364b3a2477eff7408dcac6a640d74a3744d2514"}, + {file = "fonttools-4.59.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bd733e47bf4c6dee2b2d8af7a1f7b0c091909b22dbb969a29b2b991e61e5ba4"}, + {file = "fonttools-4.59.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7bb32e0e33795e3b7795bb9b88cb6a9d980d3cbe26dd57642471be547708e17a"}, + {file = "fonttools-4.59.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cdcdf7aad4bab7fd0f2938624a5a84eb4893be269f43a6701b0720b726f24df0"}, + {file = "fonttools-4.59.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4d974312a9f405628e64f475b1f5015a61fd338f0a1b61d15c4822f97d6b045b"}, + {file = "fonttools-4.59.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:12dc4670e6e6cc4553e8de190f86a549e08ca83a036363115d94a2d67488831e"}, + {file = "fonttools-4.59.2-cp310-cp310-win32.whl", hash = "sha256:1603b85d5922042563eea518e272b037baf273b9a57d0f190852b0b075079000"}, + {file = "fonttools-4.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:2543b81641ea5b8ddfcae7926e62aafd5abc604320b1b119e5218c014a7a5d3c"}, + {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:511946e8d7ea5c0d6c7a53c4cb3ee48eda9ab9797cd9bf5d95829a398400354f"}, + {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5e2682cf7be766d84f462ba8828d01e00c8751a8e8e7ce12d7784ccb69a30d"}, + {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5729e12a982dba3eeae650de48b06f3b9ddb51e9aee2fcaf195b7d09a96250e2"}, + {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c52694eae5d652361d59ecdb5a2246bff7cff13b6367a12da8499e9df56d148d"}, + {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f1bbc23ba1312bd8959896f46f667753b90216852d2a8cfa2d07e0cb234144"}, + {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a1bfe5378962825dabe741720885e8b9ae9745ec7ecc4a5ec1f1ce59a6062bf"}, + {file = "fonttools-4.59.2-cp311-cp311-win32.whl", hash = "sha256:e937790f3c2c18a1cbc7da101550a84319eb48023a715914477d2e7faeaba570"}, + {file = "fonttools-4.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:9836394e2f4ce5f9c0a7690ee93bd90aa1adc6b054f1a57b562c5d242c903104"}, + {file = "fonttools-4.59.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82906d002c349cad647a7634b004825a7335f8159d0d035ae89253b4abf6f3ea"}, + {file = "fonttools-4.59.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a10c1bd7644dc58f8862d8ba0cf9fb7fef0af01ea184ba6ce3f50ab7dfe74d5a"}, + {file = "fonttools-4.59.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:738f31f23e0339785fd67652a94bc69ea49e413dfdb14dcb8c8ff383d249464e"}, + {file = "fonttools-4.59.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ec99f9bdfee9cdb4a9172f9e8fd578cce5feb231f598909e0aecf5418da4f25"}, + {file = "fonttools-4.59.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0476ea74161322e08c7a982f83558a2b81b491509984523a1a540baf8611cc31"}, + {file = "fonttools-4.59.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95922a922daa1f77cc72611747c156cfb38030ead72436a2c551d30ecef519b9"}, + {file = "fonttools-4.59.2-cp312-cp312-win32.whl", hash = "sha256:39ad9612c6a622726a6a130e8ab15794558591f999673f1ee7d2f3d30f6a3e1c"}, + {file = "fonttools-4.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:980fd7388e461b19a881d35013fec32c713ffea1fc37aef2f77d11f332dfd7da"}, + {file = "fonttools-4.59.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:381bde13216ba09489864467f6bc0c57997bd729abfbb1ce6f807ba42c06cceb"}, + {file = "fonttools-4.59.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f33839aa091f7eef4e9078f5b7ab1b8ea4b1d8a50aeaef9fdb3611bba80869ec"}, + {file = "fonttools-4.59.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6235fc06bcbdb40186f483ba9d5d68f888ea68aa3c8dac347e05a7c54346fbc8"}, + {file = "fonttools-4.59.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83ad6e5d06ef3a2884c4fa6384a20d6367b5cfe560e3b53b07c9dc65a7020e73"}, + {file = "fonttools-4.59.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d029804c70fddf90be46ed5305c136cae15800a2300cb0f6bba96d48e770dde0"}, + {file = "fonttools-4.59.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:95807a3b5e78f2714acaa26a33bc2143005cc05c0217b322361a772e59f32b89"}, + {file = "fonttools-4.59.2-cp313-cp313-win32.whl", hash = "sha256:b3ebda00c3bb8f32a740b72ec38537d54c7c09f383a4cfefb0b315860f825b08"}, + {file = "fonttools-4.59.2-cp313-cp313-win_amd64.whl", hash = "sha256:a72155928d7053bbde499d32a9c77d3f0f3d29ae72b5a121752481bcbd71e50f"}, + {file = "fonttools-4.59.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d09e487d6bfbe21195801323ba95c91cb3523f0fcc34016454d4d9ae9eaa57fe"}, + {file = "fonttools-4.59.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dec2f22486d7781087b173799567cffdcc75e9fb2f1c045f05f8317ccce76a3e"}, + {file = "fonttools-4.59.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1647201af10993090120da2e66e9526c4e20e88859f3e34aa05b8c24ded2a564"}, + {file = "fonttools-4.59.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47742c33fe65f41eabed36eec2d7313a8082704b7b808752406452f766c573fc"}, + {file = "fonttools-4.59.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:92ac2d45794f95d1ad4cb43fa07e7e3776d86c83dc4b9918cf82831518165b4b"}, + {file = "fonttools-4.59.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fa9ecaf2dcef8941fb5719e16322345d730f4c40599bbf47c9753de40eb03882"}, + {file = "fonttools-4.59.2-cp314-cp314-win32.whl", hash = "sha256:a8d40594982ed858780e18a7e4c80415af65af0f22efa7de26bdd30bf24e1e14"}, + {file = "fonttools-4.59.2-cp314-cp314-win_amd64.whl", hash = "sha256:9cde8b6a6b05f68516573523f2013a3574cb2c75299d7d500f44de82ba947b80"}, + {file = "fonttools-4.59.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:036cd87a2dbd7ef72f7b68df8314ced00b8d9973aee296f2464d06a836aeb9a9"}, + {file = "fonttools-4.59.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:14870930181493b1d740b6f25483e20185e5aea58aec7d266d16da7be822b4bb"}, + {file = "fonttools-4.59.2-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ff58ea1eb8fc7e05e9a949419f031890023f8785c925b44d6da17a6a7d6e85d"}, + {file = "fonttools-4.59.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dee142b8b3096514c96ad9e2106bf039e2fe34a704c587585b569a36df08c3c"}, + {file = "fonttools-4.59.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8991bdbae39cf78bcc9cd3d81f6528df1f83f2e7c23ccf6f990fa1f0b6e19708"}, + {file = "fonttools-4.59.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:53c1a411b7690042535a4f0edf2120096a39a506adeb6c51484a232e59f2aa0c"}, + {file = "fonttools-4.59.2-cp314-cp314t-win32.whl", hash = "sha256:59d85088e29fa7a8f87d19e97a1beae2a35821ee48d8ef6d2c4f965f26cb9f8a"}, + {file = "fonttools-4.59.2-cp314-cp314t-win_amd64.whl", hash = "sha256:7ad5d8d8cc9e43cb438b3eb4a0094dd6d4088daa767b0a24d52529361fd4c199"}, + {file = "fonttools-4.59.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3cdf9d32690f0e235342055f0a6108eedfccf67b213b033bac747eb809809513"}, + {file = "fonttools-4.59.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f9640d6b31d66c0bc54bdbe8ed50983c755521c101576a25e377a8711e8207"}, + {file = "fonttools-4.59.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464d15b58a9fd4304c728735fc1d42cd812fd9ebc27c45b18e78418efd337c28"}, + {file = "fonttools-4.59.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a039c38d5644c691eb53cd65360921338f54e44c90b4e764605711e046c926ee"}, + {file = "fonttools-4.59.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e4f5100e66ec307cce8b52fc03e379b5d1596e9cb8d8b19dfeeccc1e68d86c96"}, + {file = "fonttools-4.59.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:af6dbd463a3530256abf21f675ddf87646272bc48901803a185c49d06287fbf1"}, + {file = "fonttools-4.59.2-cp39-cp39-win32.whl", hash = "sha256:594a6fd2f8296583ac7babc4880c8deee7c4f05ab0141addc6bce8b8e367e996"}, + {file = "fonttools-4.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:fc21c4a05226fd39715f66c1c28214862474db50df9f08fd1aa2f96698887bc3"}, + {file = "fonttools-4.59.2-py3-none-any.whl", hash = "sha256:8bd0f759020e87bb5d323e6283914d9bf4ae35a7307dafb2cbd1e379e720ad37"}, + {file = "fonttools-4.59.2.tar.gz", hash = "sha256:e72c0749b06113f50bcb80332364c6be83a9582d6e3db3fe0b280f996dc2ef22"}, +] + +[package.extras] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr ; sys_platform == \"darwin\""] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] + [[package]] name = "h11" version = "0.16.0" @@ -484,6 +666,30 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "importlib-resources" +version = "6.5.2" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version < \"3.10\"" +files = [ + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -514,6 +720,130 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "kiwisolver" +version = "1.4.7" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + [[package]] name = "markupsafe" version = "2.1.5" @@ -584,6 +914,72 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "matplotlib" +version = "3.9.4" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, + {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, + {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26"}, + {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50"}, + {file = "matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5"}, + {file = "matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d"}, + {file = "matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c"}, + {file = "matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099"}, + {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249"}, + {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423"}, + {file = "matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e"}, + {file = "matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3"}, + {file = "matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70"}, + {file = "matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483"}, + {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f"}, + {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00"}, + {file = "matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0"}, + {file = "matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b"}, + {file = "matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6"}, + {file = "matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45"}, + {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858"}, + {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64"}, + {file = "matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df"}, + {file = "matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799"}, + {file = "matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb"}, + {file = "matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a"}, + {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c"}, + {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764"}, + {file = "matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041"}, + {file = "matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965"}, + {file = "matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c"}, + {file = "matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7"}, + {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e"}, + {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c"}, + {file = "matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb"}, + {file = "matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db"}, + {file = "matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865"}, + {file = "matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -636,6 +1032,61 @@ files = [ deprecated = ">=1.2.0,<2.0.0" typing-extensions = ">=3.0.0" +[[package]] +name = "numpy" +version = "2.0.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + [[package]] name = "packaging" version = "24.1" @@ -660,6 +1111,131 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "pillow" +version = "11.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, + {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, + {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, + {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, + {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, + {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, + {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, + {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, + {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, + {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, + {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, + {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, + {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, + {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, + {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, + {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, + {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, + {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, + {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, + {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, + {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, + {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, + {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, + {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, + {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, + {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, + {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions ; python_version < \"3.10\""] +xmp = ["defusedxml"] + [[package]] name = "platformdirs" version = "4.3.6" @@ -742,6 +1318,21 @@ tomli_w = ">=1.0.0,<2.0.0" watchdog = "*" yapf = ">=0.30.0" +[[package]] +name = "pyparsing" +version = "3.2.3" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, + {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "7.4.4" @@ -827,7 +1418,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -964,7 +1555,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1190,7 +1781,28 @@ files = [ platformdirs = ">=3.5.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +[[package]] +name = "zipp" +version = "3.23.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version < \"3.10\"" +files = [ + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "0e418edc53bd5281cad796e539debdbfbd6634a228b94336211d7198ce98d92b" +content-hash = "12b33617f4e9b7c089143e4e179c810f98d7f97a465ef7013bd7bf6777306fc8" diff --git a/python/pyproject.toml b/python/pyproject.toml index 739eb37c..7c3e9943 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -24,6 +24,7 @@ pytest-asyncio = "^0.23.7" pytest-xdist = "^3.6.1" black = "23.12.1" pydoc-markdown = "^4.8.2" +matplotlib = "^3.8.0" [build-system] requires = ["poetry-core"] diff --git a/python/tests/benchmarking.py b/python/tests/benchmarking.py deleted file mode 100644 index c3a4855c..00000000 --- a/python/tests/benchmarking.py +++ /dev/null @@ -1,33 +0,0 @@ -import time - -from dotenv import load_dotenv - -from e2b_code_interpreter.code_interpreter_sync import Sandbox - -load_dotenv() - -iterations = 10 -create_sandbox_time = 0 -first_exec_time = 0 -second_exec_time = 0 - -for i in range(iterations): - print("Iteration:", i + 1) - start_time = time.time() - sandbox = Sandbox.create() - create_sandbox_time += time.time() - start_time - - start_time = time.time() - sandbox.run_code("x = 1") - first_exec_time += time.time() - start_time - - start_time = time.time() - result = sandbox.run_code("x+=1; x") - second_exec_time += time.time() - start_time - - sandbox.kill() - - -print(f"Average Create Sandbox Time: {create_sandbox_time / iterations}s") -print(f"Average Execute Python x = 1 Time: {first_exec_time / iterations}s") -print(f"Average Execute Python x+=1; x Time: {second_exec_time / iterations}s") diff --git a/python/tests/performance.py b/python/tests/performance.py new file mode 100644 index 00000000..32ae8a95 --- /dev/null +++ b/python/tests/performance.py @@ -0,0 +1,205 @@ +from e2b_code_interpreter import Sandbox +import time +import os +import statistics +import matplotlib.pyplot as plt + +iterations_count = int(os.getenv("E2B_TESTS_BENCHMARK_ITERATIONS_COUNT", 20)) +template = os.getenv("E2B_TESTS_TEMPLATE", "code-interpreter-v1") + +# Lists to store metrics for each iteration +sandbox_creation_times = [] +health_check_times = [] +first_code_run_times = [] +second_code_run_times = [] + +for i in range(iterations_count): + print(f"\n--- Iteration {i + 1}/{iterations_count} ---") + + start_time = time.time() + sbx = Sandbox.create(template=template) + end_time = time.time() + sandbox_creation_time = (end_time - start_time) * 1000 + sandbox_creation_times.append(sandbox_creation_time) + print(f"Sandbox creation time: {sandbox_creation_time:.2f} milliseconds") + + start_time = time.time() + sbx.commands.run("curl http://0.0.0.0:49999/health") + end_time = time.time() + health_check_time = (end_time - start_time) * 1000 + health_check_times.append(health_check_time) + print(f"Health check time: {health_check_time:.2f} milliseconds") + + start_time = time.time() + sbx.run_code("print('Hello, world!')") + end_time = time.time() + first_code_run_time = (end_time - start_time) * 1000 + first_code_run_times.append(first_code_run_time) + print(f"First code run time: {first_code_run_time:.2f} milliseconds") + + start_time = time.time() + sbx.run_code("print('Hello, world!')") + end_time = time.time() + second_code_run_time = (end_time - start_time) * 1000 + second_code_run_times.append(second_code_run_time) + print(f"Second code run time: {second_code_run_time:.2f} milliseconds") + + sbx.kill() + + +# Calculate and print summary statistics +def print_metric_summary(metric_name, times): + if not times: + return + + low = min(times) + high = max(times) + mean = statistics.mean(times) + median = statistics.median(times) + + print(f"\n{metric_name} Summary:") + print(f" Low: {low:.2f} ms") + print(f" High: {high:.2f} ms") + print(f" Mean: {mean:.2f} ms") + print(f" Median: {median:.2f} ms") + + +print("\n" + "=" * 50) +print("PERFORMANCE SUMMARY") +print("=" * 50) + +print_metric_summary("Sandbox Creation Time", sandbox_creation_times) +print_metric_summary("Health Check Time", health_check_times) +print_metric_summary("First Code Run Time", first_code_run_times) +print_metric_summary("Second Code Run Time", second_code_run_times) + + +def create_performance_plot( + template, + iterations_count, + sandbox_creation_times, + health_check_times, + first_code_run_times, + second_code_run_times, +): + """Create and save a performance visualization plot.""" + print(f"\nGenerating performance plot...") + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10)) + + # Plot 1: All metrics over iterations + iterations = list(range(1, iterations_count + 1)) + ax1.plot( + iterations, + sandbox_creation_times, + "b-o", + label="Sandbox Creation", + linewidth=1.5, + markersize=6, + markerfacecolor="blue", + markeredgecolor="darkblue", + markeredgewidth=1, + ) + ax1.plot( + iterations, + health_check_times, + "g-s", + label="Health Check", + linewidth=1.5, + markersize=6, + markerfacecolor="green", + markeredgecolor="darkgreen", + markeredgewidth=1, + ) + ax1.plot( + iterations, + first_code_run_times, + "r-^", + label="First Code Run", + linewidth=1.5, + markersize=6, + markerfacecolor="red", + markeredgecolor="darkred", + markeredgewidth=1, + ) + ax1.plot( + iterations, + second_code_run_times, + "m-d", + label="Second Code Run", + linewidth=1.5, + markersize=6, + markerfacecolor="magenta", + markeredgecolor="darkmagenta", + markeredgewidth=1, + ) + + ax1.set_xlabel("Iteration") + ax1.set_ylabel("Time (ms)") + ax1.set_title( + f"Performance Metrics Over {iterations_count} Iterations - {template}" + ) + ax1.legend() + ax1.grid(True, alpha=0.3) + + # Set x-axis to show each iteration step + ax1.set_xticks(iterations) + ax1.set_xlim(0.5, iterations_count + 0.5) + + # Plot 2: Box plot for distribution + all_metrics = [ + sandbox_creation_times, + health_check_times, + first_code_run_times, + second_code_run_times, + ] + metric_names = [ + "Sandbox\nCreation", + "Health\nCheck", + "First Code\nRun", + "Second Code\nRun", + ] + + box_plot = ax2.boxplot(all_metrics, tick_labels=metric_names, patch_artist=True) + colors = ["lightblue", "lightgreen", "lightcoral", "plum"] + for patch, color in zip(box_plot["boxes"], colors): + patch.set_facecolor(color) + + ax2.set_ylabel("Time (ms)") + ax2.set_title(f"Performance Distribution - {template}") + ax2.grid(True, alpha=0.3) + + plt.tight_layout() + + # Show summary statistics in the plot + stats_text = f"""Summary Statistics: +Sandbox Creation: {statistics.mean(sandbox_creation_times):.1f}ms avg +Health Check: {statistics.mean(health_check_times):.1f}ms avg +First Code Run: {statistics.mean(first_code_run_times):.1f}ms avg +Second Code Run: {statistics.mean(second_code_run_times):.1f}ms avg""" + + fig.text( + 0.02, + 0.02, + stats_text, + fontsize=8, + verticalalignment="bottom", + bbox=dict(boxstyle="round", facecolor="wheat", alpha=0.8), + ) + + # Save the plot + plot_filename = f"performance_plot.png" + plt.savefig(plot_filename, dpi=300, bbox_inches="tight") + print(f"Performance plot saved as: {plot_filename}") + + return plot_filename + + +# Create performance plot +create_performance_plot( + template, + iterations_count, + sandbox_creation_times, + health_check_times, + first_code_run_times, + second_code_run_times, +) From 09efac2a3750445e1ebd58a8043101aa24e85f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Sun, 31 Aug 2025 21:01:47 +0200 Subject: [PATCH 600/722] Add pipeline for linting and formatting (#146) --- .eslintrc.cjs | 26 + .github/workflows/lint.yml | 69 ++ .../e2b_charts/charts/bars.py | 1 - chart_data_extractor/package.json | 9 +- chart_data_extractor/poetry.lock | 74 +- chart_data_extractor/pyproject.toml | 5 + .../tests/charts/test_blank.py | 1 - .../tests/charts/test_categorical_scale.py | 2 - .../tests/charts/test_log_graph.py | 2 +- js/.eslintrc.cjs | 4 + js/example.mts | 53 +- js/package.json | 6 +- js/src/charts.ts | 24 +- js/src/messaging.ts | 12 +- js/src/sandbox.ts | 12 +- js/src/utils.ts | 12 +- js/tests/benchmarking.js | 31 - js/tests/callbacks.test.ts | 10 +- js/tests/charts/boxAndWhisker.test.ts | 6 +- js/tests/charts/line.test.ts | 18 +- js/tests/env_vars/bash.test.ts | 59 +- js/tests/env_vars/java.test.ts | 59 +- js/tests/env_vars/js.test.ts | 54 +- js/tests/env_vars/python.test.ts | 39 +- js/tests/env_vars/r.test.ts | 25 +- js/tests/images/bar.test.ts | 13 +- js/tests/kernels.test.ts | 4 +- js/tests/languages/deno.test.ts | 49 +- js/tests/runtimes/bun/run.test.ts | 22 +- js/tests/setup.ts | 3 +- package.json | 13 +- pnpm-lock.yaml | 954 +++++++++++++++++- python/async_example.py | 2 +- .../code_interpreter_async.py | 1 - python/e2b_code_interpreter/exceptions.py | 4 +- python/package.json | 6 +- python/poetry.lock | 30 +- python/pyproject.toml | 6 +- python/tests/async/env_vars/test_bash.py | 36 +- python/tests/async/env_vars/test_java.py | 30 +- python/tests/async/env_vars/test_js.py | 30 +- python/tests/async/env_vars/test_python.py | 30 +- python/tests/async/env_vars/test_r.py | 32 +- .../tests/async/test_async_default_kernels.py | 15 +- python/tests/charts/test_log_chart.py | 2 +- python/tests/conftest.py | 4 +- python/tests/performance.py | 6 +- python/tests/sync/test_default_kernels.py | 19 +- template/package.json | 6 +- template/server/contexts.py | 4 +- template/server/main.py | 6 +- template/startup_scripts/0002_data.py | 2 +- 52 files changed, 1554 insertions(+), 388 deletions(-) create mode 100644 .eslintrc.cjs create mode 100644 .github/workflows/lint.yml create mode 100644 js/.eslintrc.cjs delete mode 100644 js/tests/benchmarking.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..4746db02 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,26 @@ +module.exports = { + env: { + node: true, + browser: true, + es6: true, + }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + ignorePatterns: ['dist/', 'node_modules/', '*.gen.ts'], + plugins: ['@typescript-eslint', 'unused-imports', '@stylistic/ts'], + rules: { + '@typescript-eslint/member-ordering': 'error', + '@typescript-eslint/ban-ts-comment': 'off', // "move fast" mode + '@typescript-eslint/no-explicit-any': 'off', // "move fast" mode + 'linebreak-style': ['error', 'unix'], + 'unused-imports/no-unused-imports': 'error', + // No double quotes + quotes: ['error', 'single', { avoidEscape: true }], + // No extra semicolon + '@stylistic/ts/semi': ['error', 'never'], + }, +} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..493bea7d --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,69 @@ +name: Lint + +on: + pull_request: + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 9.15.5 + + - name: Setup Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: pnpm + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install Python dependencies + working-directory: python + run: | + poetry install --with dev + pip install ruff=="0.11.12" + + - name: Run linting + run: | + pnpm run lint + + - name: Run formatting + run: | + pnpm run format + + - name: Check for uncommitted changes + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "❌ Files are not formatted properly:" + git status --short + git diff + exit 1 + else + echo "✅ No changes detected." + fi \ No newline at end of file diff --git a/chart_data_extractor/e2b_charts/charts/bars.py b/chart_data_extractor/e2b_charts/charts/bars.py index a386ccdc..3d7a9437 100644 --- a/chart_data_extractor/e2b_charts/charts/bars.py +++ b/chart_data_extractor/e2b_charts/charts/bars.py @@ -37,7 +37,6 @@ def _extract_info(self, ax: Axes) -> None: labels = [label.get_text() for label in ax.get_xticklabels()] values = heights for label, value in zip(labels, values): - bar = BarData(label=label, value=value, group=group_label) self.elements.append(bar) diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 41cb32b8..4015fd6a 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -6,6 +6,13 @@ "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", - "pretest": "poetry install" + "pretest": "poetry install", + "lint": "poetry run ruff check .", + "format": "poetry run ruff format ." + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/parser": "^7.11.0", + "eslint": "^8.57.1" } } diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index 1a4794e9..d1df466b 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,6 +6,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -17,6 +18,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -28,6 +31,7 @@ version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, @@ -112,6 +116,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -127,6 +132,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -141,6 +148,7 @@ version = "4.54.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, @@ -193,18 +201,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "iniconfig" @@ -212,6 +220,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -223,6 +232,7 @@ version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, @@ -346,6 +356,7 @@ version = "3.9.2" description = "Python plotting package" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, @@ -409,6 +420,7 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -454,6 +466,7 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -465,6 +478,7 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -553,7 +567,7 @@ docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -562,6 +576,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -577,6 +592,7 @@ version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, @@ -592,7 +608,7 @@ typing-extensions = [ [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and sys_platform == \"win32\""] [[package]] name = "pydantic-core" @@ -600,6 +616,7 @@ version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, @@ -701,6 +718,7 @@ version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, @@ -715,6 +733,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -737,6 +756,7 @@ version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, @@ -752,6 +772,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -766,6 +787,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -774,12 +796,41 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "ruff" +version = "0.11.13" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"}, + {file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"}, + {file = "ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492"}, + {file = "ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250"}, + {file = "ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3"}, + {file = "ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b"}, + {file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"}, +] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -791,6 +842,8 @@ version = "2.0.2" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, @@ -802,12 +855,13 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" -content-hash = "440d62778fbcd344ce5be61672491bf9e571ba5676add56b26296e30dd2f1bbf" +content-hash = "068c79d18500bf2148afd71e659d29f5cff8a7bc089ddba56de911ba31714bdd" diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 745d7588..1f33bbd0 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -20,6 +20,8 @@ pydantic = "^2.8.2" pytest = "^7.4.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" +ruff = "^0.11.12" + [build-system] requires = ["poetry-core"] @@ -27,3 +29,6 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.urls] "Bug Tracker" = "https://github.com/e2b-dev/code-interpreter/issues" + +[tool.ruff.lint] +ignore = ["F401", "F403"] \ No newline at end of file diff --git a/chart_data_extractor/tests/charts/test_blank.py b/chart_data_extractor/tests/charts/test_blank.py index 5aa77861..7fb95c43 100644 --- a/chart_data_extractor/tests/charts/test_blank.py +++ b/chart_data_extractor/tests/charts/test_blank.py @@ -1,7 +1,6 @@ import matplotlib.pyplot as plt from e2b_charts import chart_figure_to_chart -from e2b_charts.charts import BarChart, ChartType def test_blank_chart(): diff --git a/chart_data_extractor/tests/charts/test_categorical_scale.py b/chart_data_extractor/tests/charts/test_categorical_scale.py index e20ced61..12d87d23 100644 --- a/chart_data_extractor/tests/charts/test_categorical_scale.py +++ b/chart_data_extractor/tests/charts/test_categorical_scale.py @@ -1,6 +1,4 @@ -import numpy as np import matplotlib.pyplot as plt -import datetime from e2b_charts import chart_figure_to_chart from e2b_charts.charts import LineChart diff --git a/chart_data_extractor/tests/charts/test_log_graph.py b/chart_data_extractor/tests/charts/test_log_graph.py index d5482211..b15cb72b 100644 --- a/chart_data_extractor/tests/charts/test_log_graph.py +++ b/chart_data_extractor/tests/charts/test_log_graph.py @@ -40,7 +40,7 @@ def test_log_chart(): assert chart.x_label == "X-axis" assert chart.y_label == "Y-axis (log scale)" - assert chart.x_unit == None + assert chart.x_unit is None assert chart.y_unit == "log scale" assert chart.x_scale == "linear" diff --git a/js/.eslintrc.cjs b/js/.eslintrc.cjs new file mode 100644 index 00000000..b572cd92 --- /dev/null +++ b/js/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '../.eslintrc.cjs', +} diff --git a/js/example.mts b/js/example.mts index 217601bd..f96fd065 100644 --- a/js/example.mts +++ b/js/example.mts @@ -1,38 +1,35 @@ -import dotenv from 'dotenv' +import { config } from 'dotenv' import { Sandbox } from './dist' -dotenv.config() +function log(...args: any[]) { + console.log(...args) +} -const code = ` -import matplotlib.pyplot as plt -import numpy as np +config() -x = np.linspace(0, 20, 100) -y = np.sin(x) +const sbx = await Sandbox.create('bwyvo5fk343pbvxst536') +log('ℹ️ sandbox created', sbx.sandboxId) -plt.plot(x, y) -plt.show() +await sbx.runCode('x = 1') +log('Sandbox code executed') -x = np.linspace(0, 10, 100) -plt.plot(x, y) -plt.show() +const sandboxId = await sbx.betaPause() +log('Sandbox paused', sandboxId) -import pandas -pandas.DataFrame({"a": [1, 2, 3]}) -` +// Resume the sandbox from the same state +const sameSbx = await Sandbox.connect(sbx.sandboxId) +log('Sandbox resumed', sameSbx.sandboxId) -const sandbox = await Sandbox.create() -console.log(sandbox.sandboxId) +const execution = await sameSbx.runCode('x+=1; x') +// Output result +log(execution.text) +log(execution.error) +if (execution.text !== '2') { + log('Test failed:', 'Failed to resume sandbox') + throw new Error('Failed to resume sandbox') +} +log('Sandbox resumed successfully') -const execution = await sandbox.runCode(code, { - onStdout(msg) { - console.log('stdout', msg) - }, - onStderr(msg) { - console.log('stderr', msg) - }, -}) -console.log(execution.results[0].formats()) -console.log(execution.results[0].data) -console.log(execution.results.length) +await sbx.kill() +log('Sandbox deleted') diff --git a/js/package.json b/js/package.json index 289407b4..13b41888 100644 --- a/js/package.json +++ b/js/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter", "version": "2.0.0", - "packageManager": "pnpm@8.7.6", + "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", @@ -34,7 +34,9 @@ "example": "npx tsx example.mts", "test:bun": "bun test tests/runtimes/bun --env-file=.env", "test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks", - "generate-ref": "./scripts/generate_sdk_ref.sh" + "generate-ref": "./scripts/generate_sdk_ref.sh", + "lint": "eslint src/ tests/", + "format": "prettier --write src/ tests/ example.mts" }, "devDependencies": { "@types/node": "^18.18.6", diff --git a/js/src/charts.ts b/js/src/charts.ts index 584026a6..d7d2a674 100644 --- a/js/src/charts.ts +++ b/js/src/charts.ts @@ -11,20 +11,19 @@ export enum ChartType { UNKNOWN = 'unknown', } - /** * Ax scale types */ export enum ScaleType { - LINEAR = "linear", - DATETIME = "datetime", - CATEGORICAL = "categorical", - LOG = "log", - SYMLOG = "symlog", - LOGIT = "logit", - FUNCTION = "function", - FUNCTIONLOG = "functionlog", - ASINH = "asinh", + LINEAR = 'linear', + DATETIME = 'datetime', + CATEGORICAL = 'categorical', + LOG = 'log', + SYMLOG = 'symlog', + LOGIT = 'logit', + FUNCTION = 'function', + FUNCTIONLOG = 'functionlog', + ASINH = 'asinh', } /** @@ -127,13 +126,14 @@ export function deserializeChart(data: any): Chart { return { ...data } as PieChart case ChartType.BOX_AND_WHISKER: return { ...data } as BoxAndWhiskerChart - case ChartType.SUPERCHART: - const charts = data.data.map((g: any) => deserializeChart(g)) + case ChartType.SUPERCHART: { + const charts: Chart[] = data.data.map((g: any) => deserializeChart(g)) delete data.data return { ...data, data: charts, } as SuperChart + } default: return { ...data, type: ChartType.UNKNOWN } as Chart } diff --git a/js/src/messaging.ts b/js/src/messaging.ts index bf08c58e..11b1a981 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -35,7 +35,7 @@ export class OutputMessage { * Whether the output is an error. */ public readonly error: boolean - ) { } + ) {} public toString() { return this.line @@ -60,7 +60,7 @@ export class ExecutionError { * The raw traceback of the error. **/ public traceback: string - ) { } + ) {} } /** @@ -68,7 +68,6 @@ export class ExecutionError { */ export type MIMEType = string - type E2BData = { data: Record chart: ChartTypes @@ -185,7 +184,7 @@ export class Result { 'data', 'chart', 'extra', - "text" + 'text', ].includes(key) ) { this.extra[key] = data[key] @@ -293,7 +292,7 @@ export class Execution { * Execution count of the cell. */ public executionCount?: number - ) { } + ) {} /** * Returns the text representation of the main result of the cell. @@ -329,7 +328,7 @@ export async function parseOutput( const msg = JSON.parse(line) switch (msg.type) { - case 'result': + case 'result': { const result = new Result( { ...msg, type: undefined, is_main_result: undefined }, msg.is_main_result @@ -339,6 +338,7 @@ export async function parseOutput( await onResult(result) } break + } case 'stdout': execution.logs.stdout.push(msg.text) if (onStdout) { diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 89ffdd27..4272d846 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -122,6 +122,12 @@ export class Sandbox extends BaseSandbox { protected static override readonly defaultTemplate: string = 'code-interpreter-v1' + protected get jupyterUrl(): string { + return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost( + JUPYTER_PORT + )}` + } + /** * Run the code as Python. * @@ -314,10 +320,4 @@ export class Sandbox extends BaseSandbox { throw formatRequestTimeoutError(error) } } - - protected get jupyterUrl(): string { - return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost( - JUPYTER_PORT - )}` - } } diff --git a/js/src/utils.ts b/js/src/utils.ts index 4910d5de..0bf73c3c 100644 --- a/js/src/utils.ts +++ b/js/src/utils.ts @@ -2,7 +2,9 @@ import { TimeoutError } from 'e2b' export function formatRequestTimeoutError(error: unknown) { if (error instanceof Error && error.name === 'AbortError') { - return new TimeoutError('Request timed out — the \'requestTimeoutMs\' option can be used to increase this timeout') + return new TimeoutError( + "Request timed out — the 'requestTimeoutMs' option can be used to increase this timeout" + ) } return error @@ -10,19 +12,21 @@ export function formatRequestTimeoutError(error: unknown) { export function formatExecutionTimeoutError(error: unknown) { if (error instanceof Error && error.name === 'AbortError') { - return new TimeoutError('Execution timed out — the \'timeoutMs\' option can be used to increase this timeout') + return new TimeoutError( + "Execution timed out — the 'timeoutMs' option can be used to increase this timeout" + ) } return error } export async function* readLines(stream: ReadableStream) { - const reader = stream.getReader(); + const reader = stream.getReader() let buffer = '' try { while (true) { - const { done, value } = await reader.read(); + const { done, value } = await reader.read() if (value !== undefined) { buffer += new TextDecoder().decode(value) diff --git a/js/tests/benchmarking.js b/js/tests/benchmarking.js deleted file mode 100644 index f7ba5bbf..00000000 --- a/js/tests/benchmarking.js +++ /dev/null @@ -1,31 +0,0 @@ -const { Sandbox } = require('../dist') -const dotenv = require('dotenv') -dotenv.config() - -const iterations = 10 -let createSandboxTime = 0 -let fistExecTime = 0 -let secondExecTime = 0 - -async function main() { - for (let i = 0; i < iterations; i++) { - console.log('Iteration:', i + 1) - let startTime = new Date() - const sandbox = await Sandbox.create() - createSandboxTime += new Date() - startTime - - startTime = new Date() - await sandbox.runCode('x = 1') - fistExecTime += new Date() - startTime - - startTime = new Date() - const result = await sandbox.runCode('x+=1; x') - secondExecTime += new Date() - startTime - - await sandbox.kill() - } - console.log('Average create sandbox time:', createSandboxTime / iterations) - console.log('Average first exec time:', fistExecTime / iterations) - console.log('Average second exec time:', secondExecTime / iterations) -} -main().catch(console.error) diff --git a/js/tests/callbacks.test.ts b/js/tests/callbacks.test.ts index aeb26e22..abc109ad 100644 --- a/js/tests/callbacks.test.ts +++ b/js/tests/callbacks.test.ts @@ -12,7 +12,6 @@ sandboxTest('callback results', async ({ sandbox }) => { expect(result.results[0].text).toBe('1') }) - sandboxTest('callback error', async ({ sandbox }) => { const errors = [] const result = await sandbox.runCode('xyz', { @@ -35,9 +34,12 @@ sandboxTest('callback stdout', async ({ sandbox }) => { sandboxTest('callback stderr', async ({ sandbox }) => { const stderr = [] - const result = await sandbox.runCode('import sys;print("This is an error message", file=sys.stderr)', { - onStderr: (err) => stderr.push(err), - }) + const result = await sandbox.runCode( + 'import sys;print("This is an error message", file=sys.stderr)', + { + onStderr: (err) => stderr.push(err), + } + ) expect(stderr.length).toBe(1) expect(result.logs.stderr).toEqual(['This is an error message\n']) diff --git a/js/tests/charts/boxAndWhisker.test.ts b/js/tests/charts/boxAndWhisker.test.ts index cfa9109e..47f8985a 100644 --- a/js/tests/charts/boxAndWhisker.test.ts +++ b/js/tests/charts/boxAndWhisker.test.ts @@ -49,7 +49,11 @@ plt.show() const bars = chart.elements expect(bars.length).toBe(3) - expect(bars.map((bar) => bar.label)).toEqual(['Class A', 'Class B', 'Class C']) + expect(bars.map((bar) => bar.label)).toEqual([ + 'Class A', + 'Class B', + 'Class C', + ]) expect(bars.map((bar) => bar.outliers)).toEqual([[], [76], []]) expect(bars.map((bar) => bar.min)).toEqual([78, 84, 75]) expect(bars.map((bar) => bar.first_quartile)).toEqual([85, 84.75, 79]) diff --git a/js/tests/charts/line.test.ts b/js/tests/charts/line.test.ts index 5d34da70..1762bf41 100644 --- a/js/tests/charts/line.test.ts +++ b/js/tests/charts/line.test.ts @@ -46,18 +46,18 @@ plt.show() expect(chart.y_unit).toBe('Hz') expect(chart.x_ticks.every((tick: number) => typeof tick === 'string')).toBe( - true, + true ) expect(new Date(chart.x_ticks[0])).toBeInstanceOf(Date) expect(chart.y_ticks.every((tick: number) => typeof tick === 'number')).toBe( - true, + true ) expect( - chart.y_tick_labels.every((label: string) => typeof label === 'string'), + chart.y_tick_labels.every((label: string) => typeof label === 'string') ).toBe(true) expect( - chart.x_tick_labels.every((label: string) => typeof label === 'string'), + chart.x_tick_labels.every((label: string) => typeof label === 'string') ).toBe(true) const lines = chart.elements @@ -70,11 +70,11 @@ plt.show() expect( firstLine.points.every( (point: [number, number]) => - typeof point[0] === 'string' && typeof point[1] === 'number', - ), + typeof point[0] === 'string' && typeof point[1] === 'number' + ) ).toBe(true) expect(new Date(firstLine.points[0][0])).toEqual( - new Date('2023-09-01T00:00:00.000Z'), + new Date('2023-09-01T00:00:00.000Z') ) expect(secondLine.label).toBe('cos(x)') @@ -82,7 +82,7 @@ plt.show() expect( secondLine.points.every( (point: [number, number]) => - typeof point[0] === 'string' && typeof point[1] === 'number', - ), + typeof point[0] === 'string' && typeof point[1] === 'number' + ) ).toBe(true) }) diff --git a/js/tests/env_vars/bash.test.ts b/js/tests/env_vars/bash.test.ts index 733b96cc..49624856 100644 --- a/js/tests/env_vars/bash.test.ts +++ b/js/tests/env_vars/bash.test.ts @@ -4,24 +4,24 @@ import { isDebug, sandboxTest } from '../setup' import { Sandbox } from '../../src' // Bash Env Vars -sandboxTest.skipIf(isDebug)('env vars on sandbox (bash)', async ({ template }) => { - const sandbox = await Sandbox.create(template, { - envs: { TEST_ENV_VAR: 'supertest' }, - }) - - try { - const result = await sandbox.runCode( - `echo $TEST_ENV_VAR`, - { +sandboxTest.skipIf(isDebug)( + 'env vars on sandbox (bash)', + async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode('echo $TEST_ENV_VAR', { language: 'bash', - } - ) + }) - expect(result.logs.stdout[0]).toEqual('supertest\n') - } finally { - await sandbox.kill() + expect(result.logs.stdout[0]).toEqual('supertest\n') + } finally { + await sandbox.kill() + } } -}) +) sandboxTest('env vars per execution (bash)', async ({ sandbox }) => { const result = await sandbox.runCode('echo $FOO', { @@ -29,12 +29,9 @@ sandboxTest('env vars per execution (bash)', async ({ sandbox }) => { language: 'bash', }) - const result_empty = await sandbox.runCode( - 'echo ${FOO:-default}', - { - language: 'bash', - } - ) + const result_empty = await sandbox.runCode('echo ${FOO:-default}', { + language: 'bash', + }) expect(result.logs.stdout[0]).toEqual('bar\n') expect(result_empty.logs.stdout[0]).toEqual('default\n') @@ -46,20 +43,14 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { }) try { - const result = await sandbox.runCode( - `echo $TEST_ENV_VAR`, - { - language: 'bash', - envs: { TEST_ENV_VAR: 'overwrite' }, - } - ) + const result = await sandbox.runCode('echo $TEST_ENV_VAR', { + language: 'bash', + envs: { TEST_ENV_VAR: 'overwrite' }, + }) - const result_global_default = await sandbox.runCode( - `echo $TEST_ENV_VAR`, - { - language: 'bash', - } - ) + const result_global_default = await sandbox.runCode('echo $TEST_ENV_VAR', { + language: 'bash', + }) expect(result.logs.stdout[0]).toEqual('overwrite\n') expect(result_global_default.logs.stdout[0]).toEqual('supertest\n') diff --git a/js/tests/env_vars/java.test.ts b/js/tests/env_vars/java.test.ts index 4058848d..9e7f4d8e 100644 --- a/js/tests/env_vars/java.test.ts +++ b/js/tests/env_vars/java.test.ts @@ -4,36 +4,36 @@ import { isDebug, sandboxTest } from '../setup' import { Sandbox } from '../../src' // Java Env Vars -sandboxTest.skipIf(isDebug)('env vars on sandbox (java)', async ({ template }) => { - const sandbox = await Sandbox.create(template, { - envs: { TEST_ENV_VAR: 'supertest' }, - }) +sandboxTest.skipIf(isDebug)( + 'env vars on sandbox (java)', + async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) - try { - const result = await sandbox.runCode( - `System.getProperty("TEST_ENV_VAR")`, - { - language: 'java', - } - ) + try { + const result = await sandbox.runCode( + 'System.getProperty("TEST_ENV_VAR")', + { + language: 'java', + } + ) - expect(result.results[0]?.text.trim()).toEqual('supertest') - } finally { - await sandbox.kill() + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } } -}) +) sandboxTest('env vars per execution (java)', async ({ sandbox }) => { - const result = await sandbox.runCode( - `System.getProperty("FOO")`, - { - envs: { FOO: 'bar' }, - language: 'java', - } - ) + const result = await sandbox.runCode('System.getProperty("FOO")', { + envs: { FOO: 'bar' }, + language: 'java', + }) const result_empty = await sandbox.runCode( - `System.getProperty("FOO", "default")`, + 'System.getProperty("FOO", "default")', { language: 'java', } @@ -49,16 +49,13 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { }) try { - const result = await sandbox.runCode( - `System.getProperty("TEST_ENV_VAR")`, - { - language: 'java', - envs: { TEST_ENV_VAR: 'overwrite' }, - } - ) + const result = await sandbox.runCode('System.getProperty("TEST_ENV_VAR")', { + language: 'java', + envs: { TEST_ENV_VAR: 'overwrite' }, + }) const result_global_default = await sandbox.runCode( - `System.getProperty("TEST_ENV_VAR")`, + 'System.getProperty("TEST_ENV_VAR")', { language: 'java', } diff --git a/js/tests/env_vars/js.test.ts b/js/tests/env_vars/js.test.ts index 140c36eb..7e87f7bb 100644 --- a/js/tests/env_vars/js.test.ts +++ b/js/tests/env_vars/js.test.ts @@ -4,37 +4,34 @@ import { isDebug, sandboxTest } from '../setup' import { Sandbox } from '../../src' // JavaScript Env Vars -sandboxTest.skipIf(isDebug)('env vars on sandbox (javascript)', async ({ template }) => { - const sandbox = await Sandbox.create(template, { - envs: { TEST_ENV_VAR: 'supertest' }, - }) - - try { - const result = await sandbox.runCode( - `process.env.TEST_ENV_VAR`, - { +sandboxTest.skipIf(isDebug)( + 'env vars on sandbox (javascript)', + async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) + + try { + const result = await sandbox.runCode('process.env.TEST_ENV_VAR', { language: 'javascript', - } - ) + }) - expect(result.results[0]?.text.trim()).toEqual('supertest') - } finally { - await sandbox.kill() + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } } -}) +) sandboxTest('env vars per execution (javascript)', async ({ sandbox }) => { - const result = await sandbox.runCode("process.env.FOO", { + const result = await sandbox.runCode('process.env.FOO', { envs: { FOO: 'bar' }, language: 'javascript', }) - const result_empty = await sandbox.runCode( - "process.env.FOO || 'default'", - { - language: 'javascript', - } - ) + const result_empty = await sandbox.runCode("process.env.FOO || 'default'", { + language: 'javascript', + }) expect(result.results[0]?.text.trim()).toEqual('bar') expect(result_empty.results[0]?.text.trim()).toEqual('default') @@ -46,16 +43,13 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { }) try { - const result = await sandbox.runCode( - `process.env.TEST_ENV_VAR`, - { - language: 'javascript', - envs: { TEST_ENV_VAR: 'overwrite' }, - } - ) + const result = await sandbox.runCode('process.env.TEST_ENV_VAR', { + language: 'javascript', + envs: { TEST_ENV_VAR: 'overwrite' }, + }) const result_global_default = await sandbox.runCode( - `process.env.TEST_ENV_VAR`, + 'process.env.TEST_ENV_VAR', { language: 'javascript', } diff --git a/js/tests/env_vars/python.test.ts b/js/tests/env_vars/python.test.ts index 7c4c34d6..af1b7150 100644 --- a/js/tests/env_vars/python.test.ts +++ b/js/tests/env_vars/python.test.ts @@ -4,27 +4,30 @@ import { isDebug, sandboxTest } from '../setup' import { Sandbox } from '../../src' // Python Env Vars -sandboxTest.skipIf(isDebug)('env vars on sandbox (python)', async ({ template }) => { - const sandbox = await Sandbox.create(template, { - envs: { TEST_ENV_VAR: 'supertest' }, - }) +sandboxTest.skipIf(isDebug)( + 'env vars on sandbox (python)', + async ({ template }) => { + const sandbox = await Sandbox.create(template, { + envs: { TEST_ENV_VAR: 'supertest' }, + }) - try { - const result = await sandbox.runCode( - `import os; os.getenv('TEST_ENV_VAR')`, - { - language: 'python', - } - ) + try { + const result = await sandbox.runCode( + 'import os; os.getenv("TEST_ENV_VAR")', + { + language: 'python', + } + ) - expect(result.results[0]?.text.trim()).toEqual('supertest') - } finally { - await sandbox.kill() + expect(result.results[0]?.text.trim()).toEqual('supertest') + } finally { + await sandbox.kill() + } } -}) +) sandboxTest('env vars per execution (python)', async ({ sandbox }) => { - const result = await sandbox.runCode("import os; os.getenv('FOO')", { + const result = await sandbox.runCode('import os; os.getenv("FOO")', { envs: { FOO: 'bar' }, language: 'python', }) @@ -47,7 +50,7 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { try { const result = await sandbox.runCode( - `import os; os.getenv('TEST_ENV_VAR')`, + 'import os; os.getenv("TEST_ENV_VAR")', { language: 'python', envs: { TEST_ENV_VAR: 'overwrite' }, @@ -55,7 +58,7 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { ) const result_global_default = await sandbox.runCode( - `import os; os.getenv('TEST_ENV_VAR')`, + 'import os; os.getenv("TEST_ENV_VAR")', { language: 'python', } diff --git a/js/tests/env_vars/r.test.ts b/js/tests/env_vars/r.test.ts index a81778b8..0103fec0 100644 --- a/js/tests/env_vars/r.test.ts +++ b/js/tests/env_vars/r.test.ts @@ -10,11 +10,11 @@ sandboxTest.skipIf(isDebug)('env vars on sandbox (R)', async ({ template }) => { }) try { - const result = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { + const result = await sandbox.runCode('Sys.getenv("TEST_ENV_VAR")', { language: 'r', }) - expect(result.results[0]?.text.trim()).toEqual(`[1] "supertest"`) + expect(result.results[0]?.text.trim()).toEqual('[1] "supertest"') } finally { await sandbox.kill() } @@ -33,8 +33,8 @@ sandboxTest('env vars per execution (R)', async ({ sandbox }) => { } ) - expect(result.results[0]?.text.trim()).toEqual(`[1] "bar"`) - expect(result_empty.results[0]?.text.trim()).toEqual(`[1] "default"`) + expect(result.results[0]?.text.trim()).toEqual('[1] "bar"') + expect(result_empty.results[0]?.text.trim()).toEqual('[1] "default"') }) sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { @@ -43,17 +43,22 @@ sandboxTest.skipIf(isDebug)('env vars overwrite', async ({ template }) => { }) try { - const result = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { + const result = await sandbox.runCode('Sys.getenv("TEST_ENV_VAR")', { language: 'r', envs: { TEST_ENV_VAR: 'overwrite' }, }) - const result_global_default = await sandbox.runCode(`Sys.getenv("TEST_ENV_VAR")`, { - language: 'r', - }) + const result_global_default = await sandbox.runCode( + 'Sys.getenv("TEST_ENV_VAR")', + { + language: 'r', + } + ) - expect(result.results[0]?.text.trim()).toEqual(`[1] "overwrite"`) - expect(result_global_default.results[0]?.text.trim()).toEqual(`[1] "supertest"`) + expect(result.results[0]?.text.trim()).toEqual('[1] "overwrite"') + expect(result_global_default.results[0]?.text.trim()).toEqual( + '[1] "supertest"' + ) } finally { await sandbox.kill() } diff --git a/js/tests/images/bar.test.ts b/js/tests/images/bar.test.ts index d8903b75..698b6655 100644 --- a/js/tests/images/bar.test.ts +++ b/js/tests/images/bar.test.ts @@ -37,9 +37,8 @@ sandboxTest('test image represent', async ({ sandbox }) => { expect(image).toBeDefined() }) - - sandboxTest('get image on save', async ({ sandbox }) => { - const code = ` +sandboxTest('get image on save', async ({ sandbox }) => { + const code = ` import numpy from PIL import Image @@ -49,8 +48,8 @@ sandboxTest('test image represent', async ({ sandbox }) => { image.save("test.png") ` - const execution = await sandbox.runCode(code) + const execution = await sandbox.runCode(code) - const image = execution.results[0].png - expect(image).toBeDefined() - }) + const image = execution.results[0].png + expect(image).toBeDefined() +}) diff --git a/js/tests/kernels.test.ts b/js/tests/kernels.test.ts index 810a9c23..b45c59db 100644 --- a/js/tests/kernels.test.ts +++ b/js/tests/kernels.test.ts @@ -16,5 +16,7 @@ sandboxTest('independence of kernels', async ({ sandbox }) => { sandboxTest('pass context and language', async ({ sandbox }) => { const context = await sandbox.createCodeContext() - await expect(sandbox.runCode({context, language: 'python'})).rejects.toThrowError() + await expect( + sandbox.runCode({ context, language: 'python' }) + ).rejects.toThrowError() }) diff --git a/js/tests/languages/deno.test.ts b/js/tests/languages/deno.test.ts index ee3588b6..a595f7a9 100644 --- a/js/tests/languages/deno.test.ts +++ b/js/tests/languages/deno.test.ts @@ -3,65 +3,82 @@ import { expect } from 'vitest' import { sandboxTest } from '../setup' sandboxTest.skip('js simple', async ({ sandbox }) => { - const result = await sandbox.runCode('console.log("Hello, World!")', { language: "deno" }) + const result = await sandbox.runCode('console.log("Hello, World!")', { + language: 'deno', + }) expect(result.logs.stdout.join().trim()).toEqual('Hello, World!') }) sandboxTest.skip('js import', async ({ sandbox }) => { - const result = await sandbox.runCode('import isOdd from "npm:is-odd"\nisOdd(3)', { language: "deno" }) + const result = await sandbox.runCode( + 'import isOdd from "npm:is-odd"\nisOdd(3)', + { language: 'deno' } + ) expect(result.results[0].text).toEqual('true') }) sandboxTest.skip('js top level await', async ({ sandbox }) => { - const result = await sandbox.runCode(` + const result = await sandbox.runCode( + ` async function main() { return 'Hello, World!' } await main() - `, { language: "deno" }) + `, + { language: 'deno' } + ) expect(result.results[0].text).toEqual('Hello, World!') }) sandboxTest.skip('js es6', async ({ sandbox }) => { - const result = await sandbox.runCode(` + const result = await sandbox.runCode( + ` const add = (x, y) => x + y; - add(1, 2)`, { language: "deno" }) + add(1, 2)`, + { language: 'deno' } + ) expect(result.results[0].text).toEqual('3') }) - sandboxTest.skip('js context', async ({ sandbox }) => { - await sandbox.runCode('const z = 1', { language: "deno" }) - const result = await sandbox.runCode('z', { language: "deno" }) + await sandbox.runCode('const z = 1', { language: 'deno' }) + const result = await sandbox.runCode('z', { language: 'deno' }) expect(result.results[0].text).toEqual('1') }) sandboxTest.skip('js cwd', async ({ sandbox }) => { - const result = await sandbox.runCode('process.cwd()', { language: "deno" }) + const result = await sandbox.runCode('process.cwd()', { language: 'deno' }) expect(result.results[0].text).toEqual('/home/user') - const ctx = await sandbox.createCodeContext({ cwd: '/home', language: "deno" }) + const ctx = await sandbox.createCodeContext({ + cwd: '/home', + language: 'deno', + }) const result2 = await sandbox.runCode('process.cwd()', { context: ctx }) expect(result2.results[0].text).toEqual('/home') }) sandboxTest.skip('ts simple', async ({ sandbox }) => { - const result = await sandbox.runCode(` + const result = await sandbox.runCode( + ` function subtract(x: number, y: number): number { return x - y; } subtract(1, 2) -`, { language: "deno" }) +`, + { language: 'deno' } + ) expect(result.results[0].text).toEqual('-1') }) sandboxTest.skip('test display', async ({ sandbox }) => { - const result = await sandbox.runCode(` + const result = await sandbox.runCode( + ` { [Symbol.for("Jupyter.display")]() { return { @@ -73,7 +90,9 @@ sandboxTest.skip('test display', async ({ sandbox }) => { } } } -`, { language: "deno" }) +`, + { language: 'deno' } + ) expect(result.results[0].html).toBe('

    Hello world!

    ') expect(result.results[0].text).toBe('Hello world!') diff --git a/js/tests/runtimes/bun/run.test.ts b/js/tests/runtimes/bun/run.test.ts index 9138e022..71ee3e14 100644 --- a/js/tests/runtimes/bun/run.test.ts +++ b/js/tests/runtimes/bun/run.test.ts @@ -2,13 +2,17 @@ import { expect, test } from 'bun:test' import { Sandbox } from '../../../src' -test('Bun test', async () => { - const sbx = await Sandbox.create({ timeoutMs: 5_000 }) +test( + 'Bun test', + async () => { + const sbx = await Sandbox.create({ timeoutMs: 5_000 }) - try { - const result = await sbx.runCode('print("Hello, World!")') - expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') - } finally { - await sbx.kill() - } -}, { timeout: 30_000 }) + try { + const result = await sbx.runCode('print("Hello, World!")') + expect(result.logs.stdout.join('')).toEqual('Hello, World!\n') + } finally { + await sbx.kill() + } + }, + { timeout: 30_000 } +) diff --git a/js/tests/setup.ts b/js/tests/setup.ts index f6ed8cf1..b11ce4fa 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -12,6 +12,7 @@ interface SandboxFixture { export const sandboxTest = base.extend({ sandbox: [ + // eslint-disable-next-line no-empty-pattern async ({}, use) => { const sandbox = await Sandbox.create(template, { timeoutMs, @@ -32,7 +33,7 @@ export const sandboxTest = base.extend({ }, { auto: true }, ], - template + template, }) export const isDebug = process.env.E2B_DEBUG !== undefined diff --git a/package.json b/package.json index 42c7b0d6..babe115c 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,20 @@ "scripts": { "version": "changeset version && pnpm run -r postVersion", "publish": "changeset publish && pnpm run -r postPublish", - "rm-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +" + "rm-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +", + "lint": "pnpm --if-present --recursive run lint", + "format": "pnpm --if-present --recursive run format" }, - "packageManager": "pnpm@8.7.6", + "packageManager": "pnpm@9.15.5", "devDependencies": { "@changesets/cli": "^2.27.12", "@changesets/read": "^0.6.2", - "changeset": "^0.2.6" + "changeset": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.57.1", + "eslint-plugin-unused-imports": "^3.0.0", + "@stylistic/eslint-plugin-ts": "^1.6.2" }, "engines": { "pnpm": ">=9.0.0 <10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5123dd42..388adb01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,11 +14,36 @@ importers: '@changesets/read': specifier: ^0.6.2 version: 0.6.2 + '@stylistic/eslint-plugin-ts': + specifier: ^1.6.2 + version: 1.8.1(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': + specifier: ^6.7.2 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^6.7.2 + version: 6.21.0(eslint@8.57.1)(typescript@5.7.3) changeset: specifier: ^0.2.6 version: 0.2.6 - - chart_data_extractor: {} + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-plugin-unused-imports: + specifier: ^3.0.0 + version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) + + chart_data_extractor: + devDependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^7.11.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^7.11.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.7.3) + eslint: + specifier: ^8.57.1 + version: 8.57.1 js: dependencies: @@ -283,6 +308,37 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -465,12 +521,30 @@ packages: engines: {node: '>=8.10'} hasBin: true + '@stylistic/eslint-plugin-js@1.8.1': + resolution: {integrity: sha512-c5c2C8Mos5tTQd+NWpqwEu7VT6SSRooAguFPMj1cp2RkTYl1ynKoXo8MWy3k4rkbzoeYHrqC2UlUzsroAN7wtQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-ts@1.8.1': + resolution: {integrity: sha512-/q1m+ZuO1JHfiSF16EATFzv7XSJkc5W6DocfvH5o9oB6WWYFMF77fVoBWnKT3wGptPOc2hkRupRKhmeFROdfWA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -480,9 +554,128 @@ packages: '@types/node@18.19.75': resolution: {integrity: sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -515,10 +708,23 @@ packages: '@vitest/utils@3.1.1': resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -563,6 +769,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -580,6 +789,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -587,6 +800,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} @@ -636,6 +853,9 @@ packages: compare-versions@6.1.0: resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -657,6 +877,9 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -675,6 +898,10 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -718,14 +945,66 @@ packages: engines: {node: '>=18'} hasBin: true + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-unused-imports@3.2.0: + resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': 6 - 7 + eslint: '8' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + expect-type@1.2.1: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} @@ -737,10 +1016,19 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} @@ -752,6 +1040,10 @@ packages: picomatch: optional: true + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -760,6 +1052,17 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -772,6 +1075,9 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -781,11 +1087,23 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -793,6 +1111,13 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} @@ -813,10 +1138,25 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -833,6 +1173,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -864,9 +1208,21 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + knip@5.43.6: resolution: {integrity: sha512-bUCFlg44imdV5vayYxu0pIAB373S8Ufjda0qaI9oRZDH6ltJFwUoAO2j7nafxDmo5G0ZeP4IiLAHqlc3wYIONQ==} engines: {node: '>=18.18.0'} @@ -875,6 +1231,10 @@ packages: '@types/node': '>=18' typescript: '>=5.0.4' + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -893,6 +1253,13 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -949,6 +1316,13 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -975,6 +1349,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + npm-check-updates@17.1.14: resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} @@ -984,6 +1361,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} @@ -993,6 +1373,10 @@ packages: openapi-typescript-helpers@0.0.8: resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -1008,10 +1392,18 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -1027,6 +1419,10 @@ packages: package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -1035,6 +1431,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1098,6 +1498,10 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -1138,6 +1542,10 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1146,6 +1554,11 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rollup@4.39.0: resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1234,6 +1647,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + strip-json-comments@5.0.1: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} @@ -1246,6 +1663,10 @@ packages: summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -1254,6 +1675,9 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1301,6 +1725,12 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -1323,6 +1753,14 @@ packages: typescript: optional: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + typedoc-plugin-markdown@4.2.7: resolution: {integrity: sha512-bLsQdweSm48P9j6kGqQ3/4GCH5zu2EnURSkkxqirNc+uVFE9YK825ogDw+WbNkRHIV6eZK/1U43gT7YfglyYOg==} engines: {node: '>= 18'} @@ -1372,6 +1810,9 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -1470,6 +1911,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1478,6 +1923,9 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -1486,6 +1934,10 @@ packages: engines: {node: '>= 14'} hasBin: true + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + zod-validation-error@3.3.0: resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} engines: {node: '>=18.0.0'} @@ -1730,6 +2182,41 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1900,12 +2387,38 @@ snapshots: ignore: 5.3.1 p-map: 4.0.0 + '@stylistic/eslint-plugin-js@1.8.1(eslint@8.57.1)': + dependencies: + '@types/eslint': 8.56.12 + acorn: 8.15.0 + escape-string-regexp: 4.0.0 + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + + '@stylistic/eslint-plugin-ts@1.8.1(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@stylistic/eslint-plugin-js': 1.8.1(eslint@8.57.1) + '@types/eslint': 8.56.12 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@types/eslint@8.56.12': + dependencies: + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.7': {} '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -1916,8 +2429,177 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/semver@7.7.0': {} + '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + eslint: 8.57.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@1.3.0': {} '@vitest/expect@3.1.1': @@ -1960,11 +2642,24 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1995,6 +2690,11 @@ snapshots: dependencies: is-windows: 1.0.2 + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -2010,6 +2710,8 @@ snapshots: cac@6.7.14: {} + callsites@3.1.0: {} + ccount@2.0.1: {} chai@5.2.0: @@ -2020,6 +2722,11 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + changeset@0.2.6: dependencies: udc: 1.0.1 @@ -2056,6 +2763,8 @@ snapshots: compare-versions@6.1.0: {} + concat-map@0.0.1: {} + consola@3.4.0: {} cross-spawn@7.0.6: @@ -2070,6 +2779,8 @@ snapshots: deep-eql@5.0.2: {} + deep-is@0.1.4: {} + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -2087,6 +2798,10 @@ snapshots: dependencies: path-type: 4.0.0 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dotenv@16.4.7: {} e2b@2.0.1: @@ -2154,12 +2869,91 @@ snapshots: '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 + escape-string-regexp@4.0.0: {} + + eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + + eslint-rule-composer@0.3.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 + esutils@2.0.3: {} + expect-type@1.2.1: {} extendable-error@0.1.7: {} @@ -2170,6 +2964,8 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2178,6 +2974,10 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fastq@1.19.0: dependencies: reusify: 1.0.4 @@ -2186,6 +2986,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2195,6 +2999,19 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.6 @@ -2212,6 +3029,8 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -2219,6 +3038,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@10.3.10: dependencies: foreground-child: 3.1.1 @@ -2227,6 +3050,19 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -2238,6 +3074,10 @@ snapshots: graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -2266,8 +3106,22 @@ snapshots: ignore@5.3.1: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2278,6 +3132,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -2305,10 +3161,20 @@ snapshots: dependencies: argparse: 2.0.1 + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + knip@5.43.6(@types/node@18.19.75)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 @@ -2330,6 +3196,11 @@ snapshots: zod: 3.22.4 zod-validation-error: 3.3.0(zod@3.22.4) + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -2344,6 +3215,12 @@ snapshots: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} lodash.startcase@4.4.0: {} @@ -2409,6 +3286,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -2429,10 +3314,16 @@ snapshots: nanoid@3.3.8: {} + natural-compare@1.4.0: {} + npm-check-updates@17.1.14: {} object-assign@4.1.1: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + oniguruma-to-es@2.3.0: dependencies: emoji-regex-xs: 1.0.0 @@ -2445,6 +3336,15 @@ snapshots: openapi-typescript-helpers@0.0.8: {} + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -2457,10 +3357,18 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@2.1.0: {} p-map@4.0.0: @@ -2471,10 +3379,16 @@ snapshots: package-manager-detector@0.2.9: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-ms@4.0.0: {} path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.10.1: @@ -2514,6 +3428,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + prettier@2.8.8: {} pretty-ms@9.0.0: @@ -2548,10 +3464,16 @@ snapshots: dependencies: regex-utilities: 2.3.0 + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} reusify@1.0.4: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + rollup@4.39.0: dependencies: '@types/estree': 1.0.7 @@ -2659,6 +3581,8 @@ snapshots: strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} + strip-json-comments@5.0.1: {} sucrase@3.35.0: @@ -2673,10 +3597,16 @@ snapshots: summary@2.1.0: {} + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + tapable@2.2.1: {} term-size@2.2.1: {} + text-table@0.2.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2716,6 +3646,10 @@ snapshots: trim-lines@3.0.1: {} + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + ts-interface-checker@0.1.13: {} tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): @@ -2745,6 +3679,12 @@ snapshots: - tsx - yaml + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + typedoc-plugin-markdown@4.2.7(typedoc@0.26.8(typescript@5.7.3)): dependencies: typedoc: 0.26.8(typescript@5.7.3) @@ -2793,6 +3733,10 @@ snapshots: universalify@0.1.2: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -2895,6 +3839,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2907,10 +3853,14 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + yallist@4.0.0: {} yaml@2.7.0: {} + yocto-queue@0.1.0: {} + zod-validation-error@3.3.0(zod@3.22.4): dependencies: zod: 3.22.4 diff --git a/python/async_example.py b/python/async_example.py index a4df65a9..0f7dd78b 100644 --- a/python/async_example.py +++ b/python/async_example.py @@ -47,7 +47,7 @@ async def create_sbx(sbx, i: int): await asyncio.sleep(i * 0.01) - return (await sbx.run_code(f"os.getenv('TEST')", envs={"TEST": str(i)})).text + return (await sbx.run_code("os.getenv('TEST')", envs={"TEST": str(i)})).text async def run(): diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 7821eaef..02c3e99a 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -204,7 +204,6 @@ async def run_code( headers={"X-Access-Token": self._envd_access_token}, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: - err = await aextract_exception(response) if err: raise err diff --git a/python/e2b_code_interpreter/exceptions.py b/python/e2b_code_interpreter/exceptions.py index 8d4da0d6..61896921 100644 --- a/python/e2b_code_interpreter/exceptions.py +++ b/python/e2b_code_interpreter/exceptions.py @@ -3,11 +3,11 @@ def format_request_timeout_error() -> Exception: return TimeoutException( - f"Request timed out — the 'request_timeout' option can be used to increase this timeout", + "Request timed out — the 'request_timeout' option can be used to increase this timeout", ) def format_execution_timeout_error() -> Exception: return TimeoutException( - f"Execution timed out — the 'timeout' option can be used to increase this timeout", + "Execution timed out — the 'timeout' option can be used to increase this timeout", ) diff --git a/python/package.json b/python/package.json index 39f5b70b..73445e9e 100644 --- a/python/package.json +++ b/python/package.json @@ -2,7 +2,7 @@ "name": "@e2b/code-interpreter-python", "private": true, "version": "2.0.0", - "packageManager": "pnpm@8.7.6", + "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", @@ -10,6 +10,8 @@ "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install", - "generate-ref": "poetry install && ./scripts/generate_sdk_ref.sh" + "generate-ref": "poetry install && ./scripts/generate_sdk_ref.sh", + "lint": "poetry run ruff check .", + "format": "poetry run ruff format ." } } diff --git a/python/poetry.lock b/python/poetry.lock index 12ef5869..4454f38d 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1527,6 +1527,34 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "ruff" +version = "0.11.13" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"}, + {file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"}, + {file = "ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492"}, + {file = "ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250"}, + {file = "ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3"}, + {file = "ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b"}, + {file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"}, +] + [[package]] name = "setuptools" version = "78.1.1" @@ -1805,4 +1833,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "12b33617f4e9b7c089143e4e179c810f98d7f97a465ef7013bd7bf6777306fc8" +content-hash = "c327b7c1391aa1fe74d57cca0f797ee783fe7bf5826b62a2cd6e023bb53d2369" diff --git a/python/pyproject.toml b/python/pyproject.toml index 7c3e9943..4997d706 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -22,9 +22,10 @@ python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pytest-asyncio = "^0.23.7" pytest-xdist = "^3.6.1" -black = "23.12.1" pydoc-markdown = "^4.8.2" matplotlib = "^3.8.0" +ruff = "^0.11.12" + [build-system] requires = ["poetry-core"] @@ -32,3 +33,6 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.urls] "Bug Tracker" = "https://github.com/e2b-dev/code-interpreter/issues" + +[tool.ruff.lint] +ignore = ["F401", "F403"] \ No newline at end of file diff --git a/python/tests/async/env_vars/test_bash.py b/python/tests/async/env_vars/test_bash.py index a40bd54c..b94563f9 100644 --- a/python/tests/async/env_vars/test_bash.py +++ b/python/tests/async/env_vars/test_bash.py @@ -1,45 +1,41 @@ import pytest from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + @pytest.mark.skip_debug() async def test_env_vars_on_sandbox(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: - result = await sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash" - ) + result = await sandbox.run_code("echo $TEST_ENV_VAR", language="bash") assert result.logs.stdout[0] == "supertest\n" finally: await sandbox.kill() + async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( - "echo $FOO", - envs={"FOO": "bar"}, - language="bash" + "echo $FOO", envs={"FOO": "bar"}, language="bash" ) - - result_empty = await async_sandbox.run_code( - "echo ${FOO:-default}", - language="bash" - ) - + + result_empty = await async_sandbox.run_code("echo ${FOO:-default}", language="bash") + assert result.logs.stdout[0] == "bar\n" assert result_empty.logs.stdout[0] == "default\n" + @pytest.mark.skip_debug() async def test_env_vars_overwrite(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash", - envs={"TEST_ENV_VAR": "overwrite"} + "echo $TEST_ENV_VAR", language="bash", envs={"TEST_ENV_VAR": "overwrite"} ) result_global_default = await sandbox.run_code( - "echo $TEST_ENV_VAR", - language="bash" + "echo $TEST_ENV_VAR", language="bash" ) assert result.logs.stdout[0] == "overwrite\n" assert result_global_default.logs.stdout[0] == "supertest\n" diff --git a/python/tests/async/env_vars/test_java.py b/python/tests/async/env_vars/test_java.py index 79dc7ecc..d33517c8 100644 --- a/python/tests/async/env_vars/test_java.py +++ b/python/tests/async/env_vars/test_java.py @@ -1,48 +1,50 @@ import pytest from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + @pytest.mark.skip_debug() async def test_env_vars_on_sandbox(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( - 'System.getProperty("TEST_ENV_VAR")', - language="java" + 'System.getProperty("TEST_ENV_VAR")', language="java" ) assert result.text is not None assert result.text.strip() == "supertest" finally: await sandbox.kill() + async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( - 'System.getProperty("FOO")', - envs={"FOO": "bar"}, - language="java" + 'System.getProperty("FOO")', envs={"FOO": "bar"}, language="java" ) - + result_empty = await async_sandbox.run_code( - 'System.getProperty("FOO", "default")', - language="java" + 'System.getProperty("FOO", "default")', language="java" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None assert result_empty.text.strip() == "default" + @pytest.mark.skip_debug() async def test_env_vars_overwrite(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( 'System.getProperty("TEST_ENV_VAR")', language="java", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = await sandbox.run_code( - 'System.getProperty("TEST_ENV_VAR")', - language="java" + 'System.getProperty("TEST_ENV_VAR")', language="java" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/async/env_vars/test_js.py b/python/tests/async/env_vars/test_js.py index a8c67943..3fa21f27 100644 --- a/python/tests/async/env_vars/test_js.py +++ b/python/tests/async/env_vars/test_js.py @@ -1,48 +1,50 @@ import pytest from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + @pytest.mark.skip_debug() async def test_env_vars_on_sandbox(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( - "process.env.TEST_ENV_VAR", - language="javascript" + "process.env.TEST_ENV_VAR", language="javascript" ) assert result.text is not None assert result.text.strip() == "supertest" finally: await sandbox.kill() + async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( - "process.env.FOO", - envs={"FOO": "bar"}, - language="javascript" + "process.env.FOO", envs={"FOO": "bar"}, language="javascript" ) - + result_empty = await async_sandbox.run_code( - "process.env.FOO || 'default'", - language="javascript" + "process.env.FOO || 'default'", language="javascript" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None assert result_empty.text.strip() == "default" + @pytest.mark.skip_debug() async def test_env_vars_overwrite(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( "process.env.TEST_ENV_VAR", language="javascript", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = await sandbox.run_code( - "process.env.TEST_ENV_VAR", - language="javascript" + "process.env.TEST_ENV_VAR", language="javascript" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/async/env_vars/test_python.py b/python/tests/async/env_vars/test_python.py index bf13983b..3173efc9 100644 --- a/python/tests/async/env_vars/test_python.py +++ b/python/tests/async/env_vars/test_python.py @@ -1,48 +1,50 @@ import pytest from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + @pytest.mark.skip_debug() async def test_env_vars_on_sandbox(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( - "import os; os.getenv('TEST_ENV_VAR')", - language="python" + "import os; os.getenv('TEST_ENV_VAR')", language="python" ) assert result.text is not None assert result.text.strip() == "supertest" finally: await sandbox.kill() + async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( - "import os; os.getenv('FOO')", - envs={"FOO": "bar"}, - language="python" - ) + "import os; os.getenv('FOO')", envs={"FOO": "bar"}, language="python" + ) result_empty = await async_sandbox.run_code( - "import os; os.getenv('FOO', 'default')", - language="python" + "import os; os.getenv('FOO', 'default')", language="python" ) - + assert result.text is not None assert result.text.strip() == "bar" assert result_empty.text is not None assert result_empty.text.strip() == "default" + @pytest.mark.skip_debug() async def test_env_vars_overwrite(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( "import os; os.getenv('TEST_ENV_VAR')", language="python", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = await sandbox.run_code( - "import os; os.getenv('TEST_ENV_VAR')", - language="python" + "import os; os.getenv('TEST_ENV_VAR')", language="python" ) assert result.text is not None assert result.text.strip() == "overwrite" diff --git a/python/tests/async/env_vars/test_r.py b/python/tests/async/env_vars/test_r.py index 4d1a98d5..6ba95651 100644 --- a/python/tests/async/env_vars/test_r.py +++ b/python/tests/async/env_vars/test_r.py @@ -1,48 +1,48 @@ import pytest from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + @pytest.mark.skip_debug() async def test_env_vars_on_sandbox(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: - result = await sandbox.run_code( - 'Sys.getenv("TEST_ENV_VAR")', - language="r" - ) + result = await sandbox.run_code('Sys.getenv("TEST_ENV_VAR")', language="r") assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "supertest"' finally: await sandbox.kill() + async def test_env_vars_per_execution(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code( - 'Sys.getenv("FOO")', - envs={"FOO": "bar"}, - language="r" + 'Sys.getenv("FOO")', envs={"FOO": "bar"}, language="r" ) - + result_empty = await async_sandbox.run_code( - 'Sys.getenv("FOO", unset = "default")', - language="r" + 'Sys.getenv("FOO", unset = "default")', language="r" ) - + assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "bar"' assert result_empty.results[0].text is not None assert result_empty.results[0].text.strip() == '[1] "default"' + @pytest.mark.skip_debug() async def test_env_vars_overwrite(template): - sandbox = await AsyncSandbox.create(template=template, envs={"TEST_ENV_VAR": "supertest"}) + sandbox = await AsyncSandbox.create( + template=template, envs={"TEST_ENV_VAR": "supertest"} + ) try: result = await sandbox.run_code( 'Sys.getenv("TEST_ENV_VAR")', language="r", - envs={"TEST_ENV_VAR": "overwrite"} + envs={"TEST_ENV_VAR": "overwrite"}, ) result_global_default = await sandbox.run_code( - 'Sys.getenv("TEST_ENV_VAR")', - language="r" + 'Sys.getenv("TEST_ENV_VAR")', language="r" ) assert result.results[0].text is not None assert result.results[0].text.strip() == '[1] "overwrite"' diff --git a/python/tests/async/test_async_default_kernels.py b/python/tests/async/test_async_default_kernels.py index 23b01b35..b2df1dca 100644 --- a/python/tests/async/test_async_default_kernels.py +++ b/python/tests/async/test_async_default_kernels.py @@ -7,18 +7,25 @@ async def test_js_kernel(async_sandbox: AsyncSandbox): ) assert execution.logs.stdout == ["Hello, World!\n"] + async def test_js_esm_imports(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code(""" + execution = await async_sandbox.run_code( + """ import { readFileSync } from 'fs' console.log(typeof readFileSync) - """, language="js") + """, + language="js", + ) assert execution.logs.stdout == ["function\n"] async def test_js_top_level_await(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code(""" + execution = await async_sandbox.run_code( + """ await Promise.resolve('Hello World!') - """, language="js") + """, + language="js", + ) assert execution.text == "Hello World!" diff --git a/python/tests/charts/test_log_chart.py b/python/tests/charts/test_log_chart.py index 285085e8..e74c9ec5 100644 --- a/python/tests/charts/test_log_chart.py +++ b/python/tests/charts/test_log_chart.py @@ -41,7 +41,7 @@ async def test_log_chart(async_sandbox: AsyncSandbox): assert chart.x_label == "X-axis" assert chart.y_label == "Y-axis (log scale)" - assert chart.x_unit == None + assert chart.x_unit is None assert chart.y_unit == "log scale" assert chart.x_scale == "linear" diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 544f2ca5..3c046928 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -24,7 +24,7 @@ def sandbox(template, debug): finally: try: sandbox.kill() - except: + except: # noqa: E722 if not debug: warning( "Failed to kill sandbox — this is expected if the test runs with local envd." @@ -40,7 +40,7 @@ async def async_sandbox(template, debug): finally: try: await async_sandbox.kill() - except: + except: # noqa: E722 if not debug: warning( "Failed to kill sandbox — this is expected if the test runs with local envd." diff --git a/python/tests/performance.py b/python/tests/performance.py index 32ae8a95..dbaf99ac 100644 --- a/python/tests/performance.py +++ b/python/tests/performance.py @@ -83,7 +83,7 @@ def create_performance_plot( second_code_run_times, ): """Create and save a performance visualization plot.""" - print(f"\nGenerating performance plot...") + print("\nGenerating performance plot...") fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10)) # Plot 1: All metrics over iterations @@ -140,7 +140,7 @@ def create_performance_plot( ) ax1.legend() ax1.grid(True, alpha=0.3) - + # Set x-axis to show each iteration step ax1.set_xticks(iterations) ax1.set_xlim(0.5, iterations_count + 0.5) @@ -187,7 +187,7 @@ def create_performance_plot( ) # Save the plot - plot_filename = f"performance_plot.png" + plot_filename = "performance_plot.png" plt.savefig(plot_filename, dpi=300, bbox_inches="tight") print(f"Performance plot saved as: {plot_filename}") diff --git a/python/tests/sync/test_default_kernels.py b/python/tests/sync/test_default_kernels.py index 998a39e8..8dfd4bf9 100644 --- a/python/tests/sync/test_default_kernels.py +++ b/python/tests/sync/test_default_kernels.py @@ -21,22 +21,29 @@ def test_java_kernel(sandbox: Sandbox): def test_js_esm_imports(sandbox: Sandbox): - execution = sandbox.run_code(""" + execution = sandbox.run_code( + """ import { readFileSync } from 'fs' console.log(typeof readFileSync) - """, language="js") + """, + language="js", + ) assert execution.logs.stdout == ["function\n"] def test_js_top_level_await(sandbox: Sandbox): - execution = sandbox.run_code(""" + execution = sandbox.run_code( + """ await Promise.resolve('Hello World!') - """, language="js") + """, + language="js", + ) assert execution.text == "Hello World!" @pytest.mark.skip_debug() def test_ts_kernel(sandbox: Sandbox): - execution = sandbox.run_code("const message: string = 'Hello, World!'; console.log(message)", language="ts") + execution = sandbox.run_code( + "const message: string = 'Hello, World!'; console.log(message)", language="ts" + ) assert execution.logs.stdout == ["Hello, World!\n"] - diff --git a/template/package.json b/template/package.json index f446dd7e..48ca7bfd 100644 --- a/template/package.json +++ b/template/package.json @@ -1,5 +1,9 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.1.0" + "version": "0.1.0", + "scripts": { + "lint": "ruff check .", + "format": "ruff format ." + } } diff --git a/template/server/contexts.py b/template/server/contexts.py index d078dc6e..773f3fa8 100644 --- a/template/server/contexts.py +++ b/template/server/contexts.py @@ -11,12 +11,14 @@ logger = logging.Logger(__name__) + def get_kernel_for_language(language: str) -> str: if language == "typescript": return "javascript" return language + def normalize_language(language: Optional[str]) -> str: if not language: return "python" @@ -61,7 +63,7 @@ async def create_context(client, websockets: dict, language: str, cwd: str) -> C logger.info(f"Setting working directory to {cwd}") try: await ws.change_current_directory(cwd, language) - except ExecutionError as e: + except ExecutionError: return PlainTextResponse( "Failed to set working directory", status_code=500, diff --git a/template/server/main.py b/template/server/main.py index 917c87ab..ea89a9d8 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -121,7 +121,7 @@ async def post_execute(request: Request, exec_request: ExecutionRequest): @app.post("/contexts") async def post_contexts(request: CreateContext) -> Context: - logger.info(f"Creating a new context") + logger.info("Creating a new context") language = normalize_language(request.language) cwd = request.cwd or "/home/user" @@ -134,7 +134,7 @@ async def post_contexts(request: CreateContext) -> Context: @app.get("/contexts") async def get_contexts() -> Set[Context]: - logger.info(f"Listing contexts") + logger.info("Listing contexts") context_ids = websockets.keys() @@ -197,7 +197,7 @@ async def remove_context(context_id: str) -> None: try: await ws.close() - except: + except: # noqa: E722 pass response = await client.delete(f"{JUPYTER_BASE_URL}/api/kernels/{ws.context_id}") diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 52168f95..1f621904 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -15,7 +15,7 @@ def _figure_repr_e2b_chart_(self: Figure): # Get all Axes objects from the Figure try: return chart_figure_to_dict(self) - except: + except: # noqa: E722 return {} From cacd2b45299b87c6b9de9d8c2fbc1054c3512f2e Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Fri, 3 Oct 2025 16:14:44 -0700 Subject: [PATCH 601/722] Update core E2B package to expose internet access control (#152) * Update e2b core package * Add changeset --- .changeset/sharp-pumas-remain.md | 5 ++++ python/poetry.lock | 45 ++++++++++++++++++++------------ python/pyproject.toml | 2 +- 3 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 .changeset/sharp-pumas-remain.md diff --git a/.changeset/sharp-pumas-remain.md b/.changeset/sharp-pumas-remain.md new file mode 100644 index 00000000..cb8488d7 --- /dev/null +++ b/.changeset/sharp-pumas-remain.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': minor +--- + +Update E2B core package diff --git a/python/poetry.lock b/python/poetry.lock index 4454f38d..8e906369 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -414,6 +414,18 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools ; python_version >= \"3.12\"", "sphinx (<2)", "tox"] +[[package]] +name = "dockerfile-parse" +version = "2.0.1" +description = "Python library for Dockerfile manipulation" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "dockerfile-parse-2.0.1.tar.gz", hash = "sha256:3184ccdc513221983e503ac00e1aa504a2aa8f84e5de673c46b0b6eee99ec7bc"}, + {file = "dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6"}, +] + [[package]] name = "docspec" version = "2.2.1" @@ -464,18 +476,19 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "2.0.0" +version = "2.2.1" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-2.0.0-py3-none-any.whl", hash = "sha256:a6621b905cb2a883a9c520736ae98343a6184fc90c29b4f2f079d720294a0df0"}, - {file = "e2b-2.0.0.tar.gz", hash = "sha256:4d033d937b0a09b8428e73233321a913cbaef8e7299fc731579c656e9d53a144"}, + {file = "e2b-2.2.1-py3-none-any.whl", hash = "sha256:e5f164dbfe23a6fa77b3932427e37492101faaee57003b2134f43427180edad9"}, + {file = "e2b-2.2.1.tar.gz", hash = "sha256:306346db5ae19367aa05d5ccb8944c03aebec6cd3fae177aae2475477b2d4658"}, ] [package.dependencies] attrs = ">=23.2.0" +dockerfile-parse = ">=2.0.1,<3.0.0" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" @@ -1271,23 +1284,21 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.29.5" +version = "6.32.1" description = "" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079"}, - {file = "protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc"}, - {file = "protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015"}, - {file = "protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61"}, - {file = "protobuf-5.29.5-cp38-cp38-win32.whl", hash = "sha256:ef91363ad4faba7b25d844ef1ada59ff1604184c0bcd8b39b8a6bef15e1af238"}, - {file = "protobuf-5.29.5-cp38-cp38-win_amd64.whl", hash = "sha256:7318608d56b6402d2ea7704ff1e1e4597bee46d760e7e4dd42a3d45e24b87f2e"}, - {file = "protobuf-5.29.5-cp39-cp39-win32.whl", hash = "sha256:6f642dc9a61782fa72b90878af134c5afe1917c89a568cd3476d758d3c3a0736"}, - {file = "protobuf-5.29.5-cp39-cp39-win_amd64.whl", hash = "sha256:470f3af547ef17847a28e1f47200a1cbf0ba3ff57b7de50d22776607cd2ea353"}, - {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, - {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, + {file = "protobuf-6.32.1-cp310-abi3-win32.whl", hash = "sha256:a8a32a84bc9f2aad712041b8b366190f71dde248926da517bde9e832e4412085"}, + {file = "protobuf-6.32.1-cp310-abi3-win_amd64.whl", hash = "sha256:b00a7d8c25fa471f16bc8153d0e53d6c9e827f0953f3c09aaa4331c718cae5e1"}, + {file = "protobuf-6.32.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8c7e6eb619ffdf105ee4ab76af5a68b60a9d0f66da3ea12d1640e6d8dab7281"}, + {file = "protobuf-6.32.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:2f5b80a49e1eb7b86d85fcd23fe92df154b9730a725c3b38c4e43b9d77018bf4"}, + {file = "protobuf-6.32.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:b1864818300c297265c83a4982fd3169f97122c299f56a56e2445c3698d34710"}, + {file = "protobuf-6.32.1-cp39-cp39-win32.whl", hash = "sha256:68ff170bac18c8178f130d1ccb94700cf72852298e016a2443bdb9502279e5f1"}, + {file = "protobuf-6.32.1-cp39-cp39-win_amd64.whl", hash = "sha256:d0975d0b2f3e6957111aa3935d08a0eb7e006b1505d825f862a1fffc8348e122"}, + {file = "protobuf-6.32.1-py3-none-any.whl", hash = "sha256:2601b779fc7d32a866c6b4404f9d42a3f67c5b9f3f15b4db3cccabe06b95c346"}, + {file = "protobuf-6.32.1.tar.gz", hash = "sha256:ee2469e4a021474ab9baafea6cd070e5bf27c7d29433504ddea1a4ee5850f68d"}, ] [[package]] @@ -1833,4 +1844,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "c327b7c1391aa1fe74d57cca0f797ee783fe7bf5826b62a2cd6e023bb53d2369" +content-hash = "e0ba1a2b27092bb02611a6c25fee7f8afa0fab0a4276437385138c27cdada86d" diff --git a/python/pyproject.toml b/python/pyproject.toml index 4997d706..5694ea11 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.0.0" +e2b = "^2.2.1" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 93964d55af4208e4afb7d404f0723881bc7ee2c8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 3 Oct 2025 23:17:39 +0000 Subject: [PATCH 602/722] [skip ci] Release new versions --- .changeset/sharp-pumas-remain.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.1.0/sandbox/page.mdx | 722 ++++++++++++++++++ 4 files changed, 724 insertions(+), 7 deletions(-) delete mode 100644 .changeset/sharp-pumas-remain.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx diff --git a/.changeset/sharp-pumas-remain.md b/.changeset/sharp-pumas-remain.md deleted file mode 100644 index cb8488d7..00000000 --- a/.changeset/sharp-pumas-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor ---- - -Update E2B core package diff --git a/python/package.json b/python/package.json index 73445e9e..98779153 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.0.0", + "version": "2.1.0", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 5694ea11..143313ae 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.0.0" +version = "2.1.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx new file mode 100644 index 00000000..8b8082cd --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 4f4ddc3ea4f9bfd829ef04b4fa6d2fec5a8b866f Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 7 Oct 2025 03:04:06 -0700 Subject: [PATCH 603/722] Update CODEOWNERS (#153) --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index fef21ce8..5f4fa93e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence. -* @jakubno @ValentaTomas @0div @mishushakov +* @jakubno @ValentaTomas @mishushakov From be28fb72a14045cfe97f8a007b8265a4dbb9c4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 7 Oct 2025 18:08:41 +0200 Subject: [PATCH 604/722] Handle websocket error gracefully + add retry logic (#149) * Handle websocket error gracefully * Lint * Remove early return * Remove traceback * Add reconnect logic * Fix headers for unsecure sandbox * Update the error message * Lint * Clean up * Don't reconnect in the last iteration * Change the error log * Don't reconnect in the receive task * Wait till the receive task doesn't finish * Revert the interval * Simplify * Address PR comments * Increase the retries * Update template/server/messaging.py Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Disable timeout completely * Fix missing access token * Simplify * Add changeset * Revert unwanted change --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> --- .changeset/curly-pumpkins-kick.md | 5 ++ .changeset/wicked-mirrors-punch.md | 5 ++ .../code_interpreter_async.py | 12 +++- .../code_interpreter_sync.py | 12 +++- template/server/messaging.py | 69 ++++++++++++++++--- 5 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 .changeset/curly-pumpkins-kick.md create mode 100644 .changeset/wicked-mirrors-punch.md diff --git a/.changeset/curly-pumpkins-kick.md b/.changeset/curly-pumpkins-kick.md new file mode 100644 index 00000000..f8b47d56 --- /dev/null +++ b/.changeset/curly-pumpkins-kick.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Add retry diff --git a/.changeset/wicked-mirrors-punch.md b/.changeset/wicked-mirrors-punch.md new file mode 100644 index 00000000..2050d45d --- /dev/null +++ b/.changeset/wicked-mirrors-punch.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Fix issue with secure False diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 02c3e99a..b8129354 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -191,6 +191,10 @@ async def run_code( request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + try: async with self._client.stream( "POST", @@ -201,7 +205,7 @@ async def run_code( "language": language, "env_vars": envs, }, - headers={"X-Access-Token": self._envd_access_token}, + headers=headers, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: err = await aextract_exception(response) @@ -249,10 +253,14 @@ async def create_code_context( if cwd: data["cwd"] = cwd + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + try: response = await self._client.post( f"{self._jupyter_url}/contexts", - headers={"X-Access-Token": self._envd_access_token}, + headers=headers, json=data, timeout=request_timeout or self.connection_config.request_timeout, ) diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 978c6dc5..6cf56c11 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -188,6 +188,10 @@ def run_code( request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + try: with self._client.stream( "POST", @@ -198,7 +202,7 @@ def run_code( "language": language, "env_vars": envs, }, - headers={"X-Access-Token": self._envd_access_token}, + headers=headers, timeout=(request_timeout, timeout, request_timeout, request_timeout), ) as response: err = extract_exception(response) @@ -246,11 +250,15 @@ def create_code_context( if cwd: data["cwd"] = cwd + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + try: response = self._client.post( f"{self._jupyter_url}/contexts", json=data, - headers={"X-Access-Token": self._envd_access_token}, + headers=headers, timeout=request_timeout or self.connection_config.request_timeout, ) diff --git a/template/server/messaging.py b/template/server/messaging.py index e541351f..0b151f8e 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -12,6 +12,10 @@ ) from pydantic import StrictStr from websockets.client import WebSocketClientProtocol, connect +from websockets.exceptions import ( + ConnectionClosedError, + WebSocketException, +) from api.models.error import Error from api.models.logs import Stdout, Stderr @@ -27,6 +31,9 @@ logger = logging.getLogger(__name__) +MAX_RECONNECT_RETRIES = 3 +PING_TIMEOUT = 30 + class Execution: def __init__(self, in_background: bool = False): @@ -61,6 +68,15 @@ def __init__(self, context_id: str, session_id: str, language: str, cwd: str): self._executions: Dict[str, Execution] = {} self._lock = asyncio.Lock() + async def reconnect(self): + if self._ws is not None: + await self._ws.close(reason="Reconnecting") + + if self._receive_task is not None: + await self._receive_task + + await self.connect() + async def connect(self): logger.debug(f"WebSocket connecting to {self.url}") @@ -69,6 +85,7 @@ async def connect(self): self._ws = await connect( self.url, + ping_timeout=PING_TIMEOUT, max_size=None, max_queue=None, logger=ws_logger, @@ -274,9 +291,6 @@ async def execute( env_vars: Dict[StrictStr, str], access_token: str, ): - message_id = str(uuid.uuid4()) - self._executions[message_id] = Execution() - if self._ws is None: raise Exception("WebSocket not connected") @@ -313,13 +327,40 @@ async def execute( ) complete_code = f"{indented_env_code}\n{complete_code}" - logger.info( - f"Sending code for the execution ({message_id}): {complete_code}" - ) - request = self._get_execute_request(message_id, complete_code, False) + message_id = str(uuid.uuid4()) + execution = Execution() + self._executions[message_id] = execution # Send the code for execution - await self._ws.send(request) + # Initial request and retries + for i in range(1 + MAX_RECONNECT_RETRIES): + try: + logger.info( + f"Sending code for the execution ({message_id}): {complete_code}" + ) + request = self._get_execute_request( + message_id, complete_code, False + ) + await self._ws.send(request) + break + except (ConnectionClosedError, WebSocketException) as e: + # Keep the last result, even if error + if i < MAX_RECONNECT_RETRIES: + logger.warning( + f"WebSocket connection lost while sending execution request, {i + 1}. reconnecting...: {str(e)}" + ) + await self.reconnect() + else: + # The retry didn't help, request wasn't sent successfully + logger.error("Failed to send execution request") + await execution.queue.put( + Error( + name="WebSocketError", + value="Failed to send execution request", + traceback="", + ) + ) + await execution.queue.put(UnexpectedEndOfExecution()) # Stream the results async for item in self._wait_for_result(message_id): @@ -343,6 +384,18 @@ async def _receive_message(self): await self._process_message(json.loads(message)) except Exception as e: logger.error(f"WebSocket received error while receiving messages: {str(e)}") + finally: + # To prevent infinite hang, we need to cancel all ongoing execution as we could lost results during the reconnect + # Thanks to the locking, there can be either no ongoing execution or just one. + for key, execution in self._executions.items(): + await execution.queue.put( + Error( + name="WebSocketError", + value="The connections was lost, rerun the code to get the results", + traceback="", + ) + ) + await execution.queue.put(UnexpectedEndOfExecution()) async def _process_message(self, data: dict): """ From bf638b7c4d23617bd14434d7a3cab61d9c648598 Mon Sep 17 00:00:00 2001 From: Tomas Valenta Date: Tue, 7 Oct 2025 17:02:34 -0700 Subject: [PATCH 605/722] Update JS/TS E2B core package (#155) * Update JS/TS e2b core package * Add changeset * Fix node version * Add changeset --- .changeset/many-planets-talk.md | 5 + .changeset/rotten-wombats-hide.md | 5 + .github/workflows/js_tests.yml | 6 +- .github/workflows/release.yml | 28 ++- .github/workflows/release_candidates.yml | 4 +- js/package.json | 12 +- pnpm-lock.yaml | 228 ++++++++++++++++++----- 7 files changed, 218 insertions(+), 70 deletions(-) create mode 100644 .changeset/many-planets-talk.md create mode 100644 .changeset/rotten-wombats-hide.md diff --git a/.changeset/many-planets-talk.md b/.changeset/many-planets-talk.md new file mode 100644 index 00000000..5c775974 --- /dev/null +++ b/.changeset/many-planets-talk.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Fix node version diff --git a/.changeset/rotten-wombats-hide.md b/.changeset/rotten-wombats-hide.md new file mode 100644 index 00000000..edab24e5 --- /dev/null +++ b/.changeset/rotten-wombats-hide.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Update core package diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 144603f6..49e567a5 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -36,8 +36,8 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: '18.x' - registry-url: 'https://registry.npmjs.org' + node-version: "20.x" + registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -81,4 +81,4 @@ jobs: env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} - E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} \ No newline at end of file + E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 45546bd4..1ce7fde8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: "18.x" + node-version: "20.x" registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -71,7 +71,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: "18.x" + node-version: "20.x" registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -108,7 +108,6 @@ jobs: IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/code-interpreter-template") echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" - charts-release: name: Charts release if: needs.changes.outputs.charts == 'true' @@ -128,7 +127,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.12' + python-version: "3.12" - name: Install and configure Poetry uses: snok/install-poetry@v1 @@ -156,7 +155,7 @@ jobs: poetry build poetry config pypi-token.pypi ${PYPI_TOKEN} poetry publish --skip-existing - working-directory: ./chart_data_extractor + working-directory: ./chart_data_extractor env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PYPI_TOKEN: ${{ secrets.CHARTS_PYPI_TOKEN }} @@ -165,7 +164,7 @@ jobs: id: output_version working-directory: ./chart_data_extractor run: | - echo "::set-output name=version::$(pnpm pkg get version --workspaces=false | tr -d \\\")" + echo "::set-output name=version::$(pnpm pkg get version --workspaces=false | tr -d \\\")" build-docker-image: name: Build Docker Image @@ -231,9 +230,9 @@ jobs: python-tests: name: Python Tests needs: [changes, build-template] - if: always() && + if: always() && !contains(needs.*.result, 'failure') && - !contains(needs.*.result, 'cancelled') && + !contains(needs.*.result, 'cancelled') && needs.changes.outputs.template == 'true' uses: ./.github/workflows/python_tests.yml secrets: inherit @@ -241,7 +240,7 @@ jobs: js-tests: name: JS Tests needs: [changes, build-template] - if: always() && + if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && needs.changes.outputs.template == 'true' @@ -250,7 +249,7 @@ jobs: release: needs: [python-tests, js-tests] - if: always() && + if: always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && (needs.changes.outputs.js == 'true' || needs.changes.outputs.python == 'true' || needs.changes.outputs.charts == 'true' || needs.changes.outputs.template == 'true') @@ -268,7 +267,6 @@ jobs: with: token: ${{ steps.app-token.outputs.token }} - - name: Set up Python uses: actions/setup-python@v4 with: @@ -286,10 +284,10 @@ jobs: with: version: 9.5 - - name: Setup Node.js 18 + - name: Setup Node.js 20 uses: actions/setup-node@v3 with: - node-version: '18.x' + node-version: "20.x" cache: pnpm - name: Configure pnpm @@ -304,11 +302,11 @@ jobs: run: pnpm run version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: Generate SDK reference id: sdk-ref run: pnpm run --recursive generate-ref - + - name: Show docs file structure run: | if [ -d "./sdk-reference" ]; then diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index e47b8cfc..3bc8101e 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -22,11 +22,11 @@ jobs: with: version: 9.5 - - name: Setup Node.js 18 + - name: Setup Node.js 20 uses: actions/setup-node@v4 if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} with: - node-version: '18.x' + node-version: "20.x" registry-url: https://registry.npmjs.org cache: pnpm diff --git a/js/package.json b/js/package.json index 13b41888..ded9be12 100644 --- a/js/package.json +++ b/js/package.json @@ -39,7 +39,7 @@ "format": "prettier --write src/ tests/ example.mts" }, "devDependencies": { - "@types/node": "^18.18.6", + "@types/node": "^20.19.19", "dotenv": "^16.4.5", "knip": "^5.25.1", "npm-check-updates": "^17.1.14", @@ -67,13 +67,13 @@ "runtime", "vm" ], - "dependencies": { - "e2b": "^2.0.1" - }, "engines": { - "node": ">=18" + "node": ">=20" }, "browserslist": [ "defaults" - ] + ], + "dependencies": { + "e2b": "^2.2.1" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 388adb01..62dabca3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,18 +48,18 @@ importers: js: dependencies: e2b: - specifier: ^2.0.1 - version: 2.0.1 + specifier: ^2.2.1 + version: 2.2.1 devDependencies: '@types/node': - specifier: ^18.18.6 - version: 18.19.75 + specifier: ^20.19.19 + version: 20.19.19 dotenv: specifier: ^16.4.5 version: 16.4.7 knip: specifier: ^5.25.1 - version: 5.43.6(@types/node@18.19.75)(typescript@5.7.3) + version: 5.43.6(@types/node@20.19.19)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 version: 17.1.14 @@ -77,7 +77,7 @@ importers: version: 5.7.3 vitest: specifier: ^3.0.9 - version: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + version: 3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -89,8 +89,8 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.6.3': - resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} + '@bufbuild/protobuf@2.9.0': + resolution: {integrity: sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==} '@changesets/apply-release-plan@7.0.8': resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} @@ -339,10 +339,22 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -551,8 +563,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.75': - resolution: {integrity: sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -824,6 +836,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -850,8 +866,8 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -898,6 +914,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dockerfile-ast@0.7.1: + resolution: {integrity: sha512-oX/A4I0EhSkGqrFv0YuvPkBUSYp1XiY8O8zAKc8Djglx8ocz+JfOr8gP0ryRMC2myqvDLagmnZaU9ot1vG2ijw==} + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -906,8 +925,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.0.1: - resolution: {integrity: sha512-wJgZTV1QFeh5WKQ23n6hWmMODPmyKiiWaQy+uxvV/5M9NH/zMY/ONzhh7j7ONYgeH8jdRZxOS2e+G345EodGeA==} + e2b@2.2.1: + resolution: {integrity: sha512-uPpK1mcSY4Bn/CKEs8nMiNMCA8Ay2DmIum7VBdV1QTCY35y3XbyAODr0Pb3yj8cGlhL/TfLlscBZ6vInyhXU+w==} engines: {node: '>=18'} eastasianwidth@0.2.0: @@ -1067,6 +1086,10 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1096,6 +1119,11 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1192,6 +1220,10 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -1273,6 +1305,10 @@ packages: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1316,6 +1352,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1334,6 +1374,14 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1416,6 +1464,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} @@ -1443,6 +1494,10 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1671,6 +1726,10 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1788,8 +1847,8 @@ packages: underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -1892,6 +1951,12 @@ packages: jsdom: optional: true + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -1929,6 +1994,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.7.0: resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} @@ -1954,7 +2023,7 @@ snapshots: '@babel/runtime@7.27.1': {} - '@bufbuild/protobuf@2.6.3': {} + '@bufbuild/protobuf@2.9.0': {} '@changesets/apply-release-plan@7.0.8': dependencies: @@ -2098,14 +2167,14 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0))': dependencies: - '@bufbuild/protobuf': 2.6.3 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3) + '@bufbuild/protobuf': 2.9.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)': dependencies: - '@bufbuild/protobuf': 2.6.3 + '@bufbuild/protobuf': 2.9.0 '@esbuild/aix-ppc64@0.25.0': optional: true @@ -2217,6 +2286,12 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2226,6 +2301,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -2425,9 +2504,9 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@18.19.75': + '@types/node@20.19.19': dependencies: - undici-types: 5.26.5 + undici-types: 6.21.0 '@types/semver@7.7.0': {} @@ -2609,13 +2688,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.1.1(vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.1.1': dependencies: @@ -2744,6 +2823,8 @@ snapshots: dependencies: readdirp: 4.1.1 + chownr@3.0.0: {} + ci-info@3.9.0: {} clean-stack@2.2.0: {} @@ -2761,7 +2842,7 @@ snapshots: commander@4.1.1: {} - compare-versions@6.1.0: {} + compare-versions@6.1.1: {} concat-map@0.0.1: {} @@ -2798,20 +2879,28 @@ snapshots: dependencies: path-type: 4.0.0 + dockerfile-ast@0.7.1: + dependencies: + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + doctrine@3.0.0: dependencies: esutils: 2.0.3 dotenv@16.4.7: {} - e2b@2.0.1: + e2b@2.2.1: dependencies: - '@bufbuild/protobuf': 2.6.3 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.6.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.6.3)) - compare-versions: 6.1.0 + '@bufbuild/protobuf': 2.9.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)) + compare-versions: 6.1.1 + dockerfile-ast: 0.7.1 + glob: 11.0.3 openapi-fetch: 0.9.8 platform: 1.3.6 + tar: 7.5.1 eastasianwidth@0.2.0: {} @@ -3017,6 +3106,11 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3050,6 +3144,15 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -3148,6 +3251,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jiti@2.4.2: {} joycon@3.1.1: {} @@ -3175,11 +3282,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.43.6(@types/node@18.19.75)(typescript@5.7.3): + knip@5.43.6(@types/node@20.19.19)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 18.19.75 + '@types/node': 20.19.19 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -3229,6 +3336,8 @@ snapshots: lru-cache@10.2.0: {} + lru-cache@11.2.2: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -3286,6 +3395,10 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -3302,6 +3415,12 @@ snapshots: minipass@7.0.4: {} + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mri@1.2.0: {} ms@2.1.3: {} @@ -3377,6 +3496,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.9: {} parent-module@1.0.1: @@ -3396,6 +3517,11 @@ snapshots: lru-cache: 10.2.0 minipass: 7.0.4 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + path-type@4.0.0: {} pathe@2.0.3: {} @@ -3603,6 +3729,14 @@ snapshots: tapable@2.2.1: {} + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + term-size@2.2.1: {} text-table@0.2.0: {} @@ -3706,7 +3840,7 @@ snapshots: underscore@1.13.6: {} - undici-types@5.26.5: {} + undici-types@6.21.0: {} unist-util-is@6.0.0: dependencies: @@ -3747,13 +3881,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3768,21 +3902,21 @@ snapshots: - tsx - yaml - vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.39.0 optionalDependencies: - '@types/node': 18.19.75 + '@types/node': 20.19.19 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0): + vitest@3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.1.1(vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -3798,11 +3932,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.7(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.1.1(@types/node@18.19.75)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 18.19.75 + '@types/node': 20.19.19 transitivePeerDependencies: - jiti - less @@ -3817,6 +3951,10 @@ snapshots: - tsx - yaml + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -3857,6 +3995,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@2.7.0: {} yocto-queue@0.1.0: {} From 8e84abfe0bbb865cfcb6fc2b2cc0b682b2980d2b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 8 Oct 2025 00:18:28 +0000 Subject: [PATCH 606/722] [skip ci] Release new versions --- .changeset/curly-pumpkins-kick.md | 5 - .changeset/many-planets-talk.md | 5 - .changeset/rotten-wombats-hide.md | 5 - .changeset/wicked-mirrors-punch.md | 5 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.0.1/charts/page.mdx | 240 ++++++ .../v2.0.1/consts/page.mdx | 13 + .../v2.0.1/index/page.mdx | 103 +++ .../v2.0.1/messaging/page.mdx | 326 ++++++++ .../v2.0.1/sandbox/page.mdx | 312 ++++++++ .../v2.1.1/sandbox/page.mdx | 722 ++++++++++++++++++ template/package.json | 2 +- 14 files changed, 1720 insertions(+), 24 deletions(-) delete mode 100644 .changeset/curly-pumpkins-kick.md delete mode 100644 .changeset/many-planets-talk.md delete mode 100644 .changeset/rotten-wombats-hide.md delete mode 100644 .changeset/wicked-mirrors-punch.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx diff --git a/.changeset/curly-pumpkins-kick.md b/.changeset/curly-pumpkins-kick.md deleted file mode 100644 index f8b47d56..00000000 --- a/.changeset/curly-pumpkins-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Add retry diff --git a/.changeset/many-planets-talk.md b/.changeset/many-planets-talk.md deleted file mode 100644 index 5c775974..00000000 --- a/.changeset/many-planets-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Fix node version diff --git a/.changeset/rotten-wombats-hide.md b/.changeset/rotten-wombats-hide.md deleted file mode 100644 index edab24e5..00000000 --- a/.changeset/rotten-wombats-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Update core package diff --git a/.changeset/wicked-mirrors-punch.md b/.changeset/wicked-mirrors-punch.md deleted file mode 100644 index 2050d45d..00000000 --- a/.changeset/wicked-mirrors-punch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Fix issue with secure False diff --git a/js/package.json b/js/package.json index ded9be12..573b7d81 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.0.0", + "version": "2.0.1", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 98779153..20524577 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.1.0", + "version": "2.1.1", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 143313ae..947c8b1c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.1.0" +version = "2.1.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx new file mode 100644 index 00000000..8b8082cd --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + diff --git a/template/package.json b/template/package.json index 48ca7bfd..a6c1cd27 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.1.0", + "version": "0.1.1", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 6f15355632c92c30c14590a4dc4153608621d0f5 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:48:35 +0200 Subject: [PATCH 607/722] e2b version bump (#158) * e2b version bump * Update cold-deers-know.md --- .changeset/cold-deers-know.md | 6 +++ .github/workflows/js_tests.yml | 4 +- js/package.json | 2 +- pnpm-lock.yaml | 35 +++++++++------ python/poetry.lock | 80 ++++++++++++++++++++++++++++++++-- python/pyproject.toml | 2 +- 6 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 .changeset/cold-deers-know.md diff --git a/.changeset/cold-deers-know.md b/.changeset/cold-deers-know.md new file mode 100644 index 00000000..a3c3ebef --- /dev/null +++ b/.changeset/cold-deers-know.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +e2b 2.3.0 bump, includes a new build system 2.0 release diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 49e567a5..e39fcebc 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -72,9 +72,9 @@ jobs: E2B_TESTS_TEMPLATE: ${{ inputs.E2B_TESTS_TEMPLATE }} - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2 with: - deno-version: v1.x + deno-version: v2.x - name: Run Deno tests run: pnpm test:deno diff --git a/js/package.json b/js/package.json index 573b7d81..28bb5a87 100644 --- a/js/package.json +++ b/js/package.json @@ -74,6 +74,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.2.1" + "e2b": "^2.3.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62dabca3..0b80f3b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^2.3.0 + version: 2.3.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -816,6 +816,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} @@ -925,9 +929,9 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.2.1: - resolution: {integrity: sha512-uPpK1mcSY4Bn/CKEs8nMiNMCA8Ay2DmIum7VBdV1QTCY35y3XbyAODr0Pb3yj8cGlhL/TfLlscBZ6vInyhXU+w==} - engines: {node: '>=18'} + e2b@2.3.0: + resolution: {integrity: sha512-EX05vM7XnOuQMBc2IYXg7s5CS0k7cZ6SS++UVjEHSu+AnrBFCqvcaVLfGtjB1xgm7RFdjLvrUuh7sTAoHBTMEg==} + engines: {node: '>=20'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1415,11 +1419,11 @@ packages: oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - openapi-fetch@0.9.8: - resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + openapi-fetch@0.14.1: + resolution: {integrity: sha512-l7RarRHxlEZYjMLd/PR0slfMVse2/vvIAGm75/F7J6MlQ8/b9uUQmUF2kCPrQhJqMXSxmYWObVgeYXbFYzZR+A==} - openapi-typescript-helpers@0.0.8: - resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -2806,6 +2810,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + changeset@0.2.6: dependencies: udc: 1.0.1 @@ -2890,15 +2896,16 @@ snapshots: dotenv@16.4.7: {} - e2b@2.2.1: + e2b@2.3.0: dependencies: '@bufbuild/protobuf': 2.9.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)) + chalk: 5.6.2 compare-versions: 6.1.1 dockerfile-ast: 0.7.1 glob: 11.0.3 - openapi-fetch: 0.9.8 + openapi-fetch: 0.14.1 platform: 1.3.6 tar: 7.5.1 @@ -3449,11 +3456,11 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - openapi-fetch@0.9.8: + openapi-fetch@0.14.1: dependencies: - openapi-typescript-helpers: 0.0.8 + openapi-typescript-helpers: 0.0.15 - openapi-typescript-helpers@0.0.8: {} + openapi-typescript-helpers@0.0.15: {} optionator@0.9.4: dependencies: diff --git a/python/poetry.lock b/python/poetry.lock index 8e906369..e34b7d15 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -476,14 +476,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "2.2.1" +version = "2.3.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-2.2.1-py3-none-any.whl", hash = "sha256:e5f164dbfe23a6fa77b3932427e37492101faaee57003b2134f43427180edad9"}, - {file = "e2b-2.2.1.tar.gz", hash = "sha256:306346db5ae19367aa05d5ccb8944c03aebec6cd3fae177aae2475477b2d4658"}, + {file = "e2b-2.3.0-py3-none-any.whl", hash = "sha256:b686051b50ca2602e227b4dc3861b0eae993c0ed1e2868bf716ef3e9930d0c14"}, + {file = "e2b-2.3.0.tar.gz", hash = "sha256:f9cd504142188356f62a3309d2516e298a5ec88d73be897ea7c5ef37baf05e23"}, ] [package.dependencies] @@ -494,6 +494,7 @@ httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" protobuf = ">=4.21.0" python-dateutil = ">=2.8.2" +rich = ">=14.0.0" typing-extensions = ">=4.1.0" [[package]] @@ -857,6 +858,31 @@ files = [ {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -993,6 +1019,18 @@ python-dateutil = ">=2.7" [package.extras] dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -1329,6 +1367,21 @@ tomli_w = ">=1.0.0,<2.0.0" watchdog = "*" yapf = ">=0.30.0" +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyparsing" version = "3.2.3" @@ -1538,6 +1591,25 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rich" +version = "14.2.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, + {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "ruff" version = "0.11.13" @@ -1844,4 +1916,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "e0ba1a2b27092bb02611a6c25fee7f8afa0fab0a4276437385138c27cdada86d" +content-hash = "c4e5cc5e77cfdb70cab1f5b59a73ab1bba8bdac2492fb7a583f195cae5f3d104" diff --git a/python/pyproject.toml b/python/pyproject.toml index 947c8b1c..d0d398eb 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.2.1" +e2b = "^2.3.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From b1b4af5916110400b42adb4dd3464a23aa2304e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Oct 2025 12:50:13 +0000 Subject: [PATCH 608/722] [skip ci] Release new versions --- .changeset/cold-deers-know.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.1.0/charts/page.mdx | 240 ++++++ .../v2.1.0/consts/page.mdx | 13 + .../v2.1.0/index/page.mdx | 103 +++ .../v2.1.0/messaging/page.mdx | 326 ++++++++ .../v2.1.0/sandbox/page.mdx | 312 ++++++++ .../v2.2.0/sandbox/page.mdx | 722 ++++++++++++++++++ 10 files changed, 1719 insertions(+), 9 deletions(-) delete mode 100644 .changeset/cold-deers-know.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx diff --git a/.changeset/cold-deers-know.md b/.changeset/cold-deers-know.md deleted file mode 100644 index a3c3ebef..00000000 --- a/.changeset/cold-deers-know.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -e2b 2.3.0 bump, includes a new build system 2.0 release diff --git a/js/package.json b/js/package.json index 28bb5a87..d7e34af7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.0.1", + "version": "2.1.0", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 20524577..6fa8f625 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.1.1", + "version": "2.2.0", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index d0d398eb..337be303 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.1.1" +version = "2.2.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx new file mode 100644 index 00000000..8b8082cd --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx @@ -0,0 +1,722 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 699d26c5f41b0296f479a236bcd4793edcfa53a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Mon, 27 Oct 2025 16:02:22 +0100 Subject: [PATCH 609/722] Async Sandbox - Run code output handlers are never awaited (#160) * Await callbacks * Add test for sync version * Add changeset * Simplify --- .changeset/friendly-fireants-begin.md | 5 +++ .../code_interpreter_async.py | 38 ++++++++-------- python/e2b_code_interpreter/models.py | 43 ++++++++++++++++--- python/tests/async/test_async_callbacks.py | 28 +++++++++--- 4 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 .changeset/friendly-fireants-begin.md diff --git a/.changeset/friendly-fireants-begin.md b/.changeset/friendly-fireants-begin.md new file mode 100644 index 00000000..86527dbd --- /dev/null +++ b/.changeset/friendly-fireants-begin.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': patch +--- + +Await async callbacks diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index b8129354..789d6a70 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -20,8 +20,8 @@ Context, Result, aextract_exception, - parse_output, - OutputHandler, + OutputHandlerWithAsync, + async_parse_output, OutputMessage, ) from e2b_code_interpreter.exceptions import ( @@ -69,10 +69,10 @@ async def run_code( self, code: str, language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -103,10 +103,10 @@ async def run_code( self, code: str, language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -138,10 +138,10 @@ async def run_code( self, code: str, context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -172,10 +172,10 @@ async def run_code( code: str, language: Optional[str] = None, context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, envs: Optional[Dict[str, str]] = None, timeout: Optional[float] = None, request_timeout: Optional[float] = None, @@ -215,7 +215,7 @@ async def run_code( execution = Execution() async for line in response.aiter_lines(): - parse_output( + await async_parse_output( execution, line, on_stdout=on_stdout, diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index 13170a4c..ef280e18 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -1,3 +1,4 @@ +import inspect import json import logging @@ -20,8 +21,10 @@ from .charts import Chart, _deserialize_chart T = TypeVar("T") -OutputHandler = Union[ - Callable[[T], Any], +OutputHandler = Union[Callable[[T], Any],] + +OutputHandlerWithAsync = Union[ + OutputHandler[T], Callable[[T], Awaitable[Any]], ] @@ -422,6 +425,32 @@ def parse_output( on_result: Optional[OutputHandler[Result]] = None, on_error: Optional[OutputHandler[ExecutionError]] = None, ): + _parse_output(execution, output, on_stdout, on_stderr, on_result, on_error) + + +async def async_parse_output( + execution: Execution, + output: str, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, +): + none_or_awaitable = _parse_output( + execution, output, on_stdout, on_stderr, on_result, on_error + ) + if inspect.isawaitable(none_or_awaitable): + await none_or_awaitable + + +def _parse_output( + execution: Execution, + output: str, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, +) -> Union[None, Awaitable[Any]]: data = json.loads(output) data_type = data.pop("type") @@ -429,22 +458,24 @@ def parse_output( result = Result(**data) execution.results.append(result) if on_result: - on_result(result) + return on_result(result) elif data_type == "stdout": execution.logs.stdout.append(data["text"]) if on_stdout: - on_stdout(OutputMessage(data["text"], data["timestamp"], False)) + return on_stdout(OutputMessage(data["text"], data["timestamp"], False)) elif data_type == "stderr": execution.logs.stderr.append(data["text"]) if on_stderr: - on_stderr(OutputMessage(data["text"], data["timestamp"], True)) + return on_stderr(OutputMessage(data["text"], data["timestamp"], True)) elif data_type == "error": execution.error = ExecutionError(data["name"], data["value"], data["traceback"]) if on_error: - on_error(execution.error) + return on_error(execution.error) elif data_type == "number_of_executions": execution.execution_count = data["execution_count"] + return None + @dataclass class Context: diff --git a/python/tests/async/test_async_callbacks.py b/python/tests/async/test_async_callbacks.py index a4fb9d0a..49d84903 100644 --- a/python/tests/async/test_async_callbacks.py +++ b/python/tests/async/test_async_callbacks.py @@ -1,8 +1,26 @@ from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -async def test_resuls(async_sandbox: AsyncSandbox): +def async_append_fn(items): + async def async_append(item): + items.append(item) + + return async_append + + +async def test_results(async_sandbox: AsyncSandbox): + results = [] + + execution = await async_sandbox.run_code( + "x = 1;x", on_result=async_append_fn(results) + ) + assert len(results) == 1 + assert execution.results[0].text == "1" + + +async def test_results_sync_callback(async_sandbox: AsyncSandbox): results = [] + execution = await async_sandbox.run_code( "x = 1;x", on_result=lambda result: results.append(result) ) @@ -12,9 +30,7 @@ async def test_resuls(async_sandbox: AsyncSandbox): async def test_error(async_sandbox: AsyncSandbox): errors = [] - execution = await async_sandbox.run_code( - "xyz", on_error=lambda error: errors.append(error) - ) + execution = await async_sandbox.run_code("xyz", on_error=async_append_fn(errors)) assert len(errors) == 1 assert execution.error.name == "NameError" @@ -22,7 +38,7 @@ async def test_error(async_sandbox: AsyncSandbox): async def test_stdout(async_sandbox: AsyncSandbox): stdout = [] execution = await async_sandbox.run_code( - "print('Hello from e2b')", on_stdout=lambda out: stdout.append(out) + "print('Hello from e2b')", on_stdout=async_append_fn(stdout) ) assert len(stdout) == 1 assert execution.logs.stdout == ["Hello from e2b\n"] @@ -32,7 +48,7 @@ async def test_stderr(async_sandbox: AsyncSandbox): stderr = [] execution = await async_sandbox.run_code( 'import sys;print("This is an error message", file=sys.stderr)', - on_stderr=lambda err: stderr.append(err), + on_stderr=async_append_fn(stderr), ) assert len(stderr) == 1 assert execution.logs.stderr == ["This is an error message\n"] From d2ba8fc75f6ec8c1dddad6f312a7ac874b5f65b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 27 Oct 2025 15:04:05 +0000 Subject: [PATCH 610/722] [skip ci] Release new versions --- .changeset/friendly-fireants-begin.md | 5 - python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.2.1/sandbox/page.mdx | 725 ++++++++++++++++++ 4 files changed, 727 insertions(+), 7 deletions(-) delete mode 100644 .changeset/friendly-fireants-begin.md create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx diff --git a/.changeset/friendly-fireants-begin.md b/.changeset/friendly-fireants-begin.md deleted file mode 100644 index 86527dbd..00000000 --- a/.changeset/friendly-fireants-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch ---- - -Await async callbacks diff --git a/python/package.json b/python/package.json index 6fa8f625..6c079243 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.2.0", + "version": "2.2.1", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 337be303..0a8dfbb4 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.2.0" +version = "2.2.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx new file mode 100644 index 00000000..40b9bb92 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx @@ -0,0 +1,725 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 273f9db39681e0ba1a9a38a4f2a51a095a06fb64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 30 Oct 2025 13:22:51 +0100 Subject: [PATCH 611/722] Use OIDC for npm publish (#162) * Use OIDC for npm publish * Update node and npm --- .github/workflows/release.yml | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ce7fde8..3ef0ed82 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,7 @@ on: concurrency: ${{ github.workflow }}-${{ github.ref }} permissions: + id-token: write contents: write jobs: @@ -27,9 +28,9 @@ jobs: version: 9.5 - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "22.x" registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -69,9 +70,9 @@ jobs: version: 9.5 - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "22.x" registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -284,10 +285,11 @@ jobs: with: version: 9.5 - - name: Setup Node.js 20 - uses: actions/setup-node@v3 + - name: Setup Node.js 22 + uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "22.x" + registry-url: 'https://registry.npmjs.org' cache: pnpm - name: Configure pnpm @@ -295,6 +297,11 @@ jobs: pnpm config set auto-install-peers true pnpm config set exclude-links-from-lockfile true + - name: Update npm + run: | + npm install -g npm@^11.6 + npm --version + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -322,7 +329,7 @@ jobs: createGithubReleases: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: "" # See https://github.com/changesets/changesets/issues/1152#issuecomment-3190884868 PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} - name: Update lock file From 345fe4f758d4bd90175e051f94d0cdf7ef708a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Fri, 31 Oct 2025 16:01:07 +0100 Subject: [PATCH 612/722] Update e2b core package (#163) --- .changeset/brave-olives-play.md | 6 ++++++ js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/brave-olives-play.md diff --git a/.changeset/brave-olives-play.md b/.changeset/brave-olives-play.md new file mode 100644 index 00000000..de212927 --- /dev/null +++ b/.changeset/brave-olives-play.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +Update e2b version to use the new connect method diff --git a/js/package.json b/js/package.json index d7e34af7..9459e4a5 100644 --- a/js/package.json +++ b/js/package.json @@ -74,6 +74,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.3.0" + "e2b": "^2.6.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b80f3b9..519e885e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.6.0 + version: 2.6.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -929,8 +929,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.3.0: - resolution: {integrity: sha512-EX05vM7XnOuQMBc2IYXg7s5CS0k7cZ6SS++UVjEHSu+AnrBFCqvcaVLfGtjB1xgm7RFdjLvrUuh7sTAoHBTMEg==} + e2b@2.6.0: + resolution: {integrity: sha512-7hzfZGVZNwh2YU+aviOVRZ0HjFBnKFFQKTNq9CtXuJ0tHlDqeu5G5ZcryejGejnYrgAloxarThK9vE4srqXamQ==} engines: {node: '>=20'} eastasianwidth@0.2.0: @@ -2896,7 +2896,7 @@ snapshots: dotenv@16.4.7: {} - e2b@2.3.0: + e2b@2.6.0: dependencies: '@bufbuild/protobuf': 2.9.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) diff --git a/python/poetry.lock b/python/poetry.lock index e34b7d15..7a4186d0 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -476,14 +476,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "2.3.0" +version = "2.6.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-2.3.0-py3-none-any.whl", hash = "sha256:b686051b50ca2602e227b4dc3861b0eae993c0ed1e2868bf716ef3e9930d0c14"}, - {file = "e2b-2.3.0.tar.gz", hash = "sha256:f9cd504142188356f62a3309d2516e298a5ec88d73be897ea7c5ef37baf05e23"}, + {file = "e2b-2.6.0-py3-none-any.whl", hash = "sha256:74fbf9adf5d651862780d281e5f50cfb0286adbeaba6dceac86f26e5e1c0ad8c"}, + {file = "e2b-2.6.0.tar.gz", hash = "sha256:3c6a8e315748d39efc2b0ff69aa47af548fd9da64be64f6797e5998db324e791"}, ] [package.dependencies] @@ -1916,4 +1916,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "c4e5cc5e77cfdb70cab1f5b59a73ab1bba8bdac2492fb7a583f195cae5f3d104" +content-hash = "f0f0e653869c2ee8fac2dd97f0a87f9a89c150264da41ea3d2845e6c54ad08b5" diff --git a/python/pyproject.toml b/python/pyproject.toml index 0a8dfbb4..871f3697 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.3.0" +e2b = "^2.6.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From a1a2bea8a99e3bfac98943629ec37675497f4e78 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 31 Oct 2025 15:03:19 +0000 Subject: [PATCH 613/722] [skip ci] Release new versions --- .changeset/brave-olives-play.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.2.0/charts/page.mdx | 240 ++++++ .../v2.2.0/consts/page.mdx | 13 + .../v2.2.0/index/page.mdx | 103 +++ .../v2.2.0/messaging/page.mdx | 326 ++++++++ .../v2.2.0/sandbox/page.mdx | 312 ++++++++ .../v2.3.0/sandbox/page.mdx | 725 ++++++++++++++++++ 10 files changed, 1722 insertions(+), 9 deletions(-) delete mode 100644 .changeset/brave-olives-play.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx diff --git a/.changeset/brave-olives-play.md b/.changeset/brave-olives-play.md deleted file mode 100644 index de212927..00000000 --- a/.changeset/brave-olives-play.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -Update e2b version to use the new connect method diff --git a/js/package.json b/js/package.json index 9459e4a5..21c7f587 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.1.0", + "version": "2.2.0", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 6c079243..b6627ad9 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.2.1", + "version": "2.3.0", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 871f3697..573b594f 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.2.1" +version = "2.3.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx new file mode 100644 index 00000000..96eafec5 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx @@ -0,0 +1,312 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx new file mode 100644 index 00000000..40b9bb92 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx @@ -0,0 +1,725 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 053bb21a90e515d1bc2d58477d8ade4a8dfe735d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 4 Nov 2025 17:23:15 +0100 Subject: [PATCH 614/722] Use npx for changeset (#167) * Use npx for changeset * Add prettier * Fix changeset * Lint * Use pnpx --- js/src/messaging.ts | 5 +- package.json | 11 +- pnpm-lock.yaml | 256 ++------------------------------------------ 3 files changed, 17 insertions(+), 255 deletions(-) diff --git a/js/src/messaging.ts b/js/src/messaging.ts index 11b1a981..5f1e4e2c 100644 --- a/js/src/messaging.ts +++ b/js/src/messaging.ts @@ -145,7 +145,10 @@ export class Result { readonly raw: RawData - constructor(rawData: RawData, public readonly isMainResult: boolean) { + constructor( + rawData: RawData, + public readonly isMainResult: boolean + ) { const data = { ...rawData } delete data['type'] delete data['is_main_result'] diff --git a/package.json b/package.json index babe115c..8f5761eb 100644 --- a/package.json +++ b/package.json @@ -2,22 +2,23 @@ "name": "e2b-code-interpreter-root", "private": true, "scripts": { - "version": "changeset version && pnpm run -r postVersion", - "publish": "changeset publish && pnpm run -r postPublish", + "version": "pnpm changeset version && pnpm run -r postVersion", + "publish": "pnpm changeset publish && pnpm run -r postPublish", "rm-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +", "lint": "pnpm --if-present --recursive run lint", - "format": "pnpm --if-present --recursive run format" + "format": "pnpm --if-present --recursive run format", + "changeset": "pnpx @changesets/cli" }, "packageManager": "pnpm@9.15.5", "devDependencies": { - "@changesets/cli": "^2.27.12", "@changesets/read": "^0.6.2", "changeset": "^0.2.6", "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", "eslint": "^8.57.1", "eslint-plugin-unused-imports": "^3.0.0", - "@stylistic/eslint-plugin-ts": "^1.6.2" + "@stylistic/eslint-plugin-ts": "^1.6.2", + "prettier": "^3.6.2" }, "engines": { "pnpm": ">=9.0.0 <10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 519e885e..58c58a7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: devDependencies: - '@changesets/cli': - specifier: ^2.27.12 - version: 2.27.12 '@changesets/read': specifier: ^0.6.2 version: 0.6.2 @@ -32,6 +29,9 @@ importers: eslint-plugin-unused-imports: specifier: ^3.0.0 version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) + prettier: + specifier: ^3.6.2 + version: 3.6.2 chart_data_extractor: devDependencies: @@ -92,34 +92,9 @@ packages: '@bufbuild/protobuf@2.9.0': resolution: {integrity: sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==} - '@changesets/apply-release-plan@7.0.8': - resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} - - '@changesets/assemble-release-plan@6.0.5': - resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} - - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - - '@changesets/cli@2.27.12': - resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} - hasBin: true - - '@changesets/config@3.0.5': - resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} - '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} - - '@changesets/get-release-plan@4.0.6': - resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.2': resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} @@ -129,24 +104,15 @@ packages: '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - '@changesets/read@0.6.2': resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} - '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - '@connectrpc/connect-web@2.0.0-rc.3': resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} peerDependencies: @@ -737,10 +703,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -829,9 +791,6 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -844,10 +803,6 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -907,10 +862,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -952,10 +903,6 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1035,10 +982,6 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1159,13 +1102,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -1299,9 +1235,6 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -1386,10 +1319,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1429,13 +1358,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -1471,9 +1393,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.9: - resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1561,9 +1480,9 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} hasBin: true pretty-ms@9.0.0: @@ -1626,9 +1545,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -1734,10 +1650,6 @@ packages: resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} engines: {node: '>=18'} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -1770,10 +1682,6 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2029,98 +1937,10 @@ snapshots: '@bufbuild/protobuf@2.9.0': {} - '@changesets/apply-release-plan@7.0.8': - dependencies: - '@changesets/config': 3.0.5 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.6.0 - - '@changesets/assemble-release-plan@6.0.5': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.6.0 - - '@changesets/changelog-git@0.2.0': - dependencies: - '@changesets/types': 6.0.0 - - '@changesets/cli@2.27.12': - dependencies: - '@changesets/apply-release-plan': 7.0.8 - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.9 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.6.0 - spawndamnit: 3.0.1 - term-size: 2.2.1 - - '@changesets/config@3.0.5': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 - '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.6.0 - - '@changesets/get-release-plan@4.0.6': - dependencies: - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.2': dependencies: '@changesets/errors': 0.2.0 @@ -2138,13 +1958,6 @@ snapshots: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.1': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - '@changesets/read@0.6.2': dependencies: '@changesets/git': 3.0.2 @@ -2155,22 +1968,10 @@ snapshots: p-filter: 2.1.0 picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.1': - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - '@changesets/types@4.1.0': {} '@changesets/types@6.0.0': {} - '@changesets/write@0.3.2': - dependencies: - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0))': dependencies: '@bufbuild/protobuf': 2.9.0 @@ -2743,8 +2544,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} - ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -2821,8 +2620,6 @@ snapshots: character-entities-legacy@3.0.0: {} - chardet@0.7.0: {} - check-error@2.1.1: {} chokidar@4.0.3: @@ -2831,8 +2628,6 @@ snapshots: chownr@3.0.0: {} - ci-info@3.9.0: {} - clean-stack@2.2.0: {} clone@1.0.4: @@ -2875,8 +2670,6 @@ snapshots: dequal@2.0.3: {} - detect-indent@6.1.0: {} - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2928,11 +2721,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - entities@4.5.0: {} es-module-lexer@1.6.0: {} @@ -3054,12 +2842,6 @@ snapshots: extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -3208,12 +2990,6 @@ snapshots: html-void-elements@3.0.0: {} - human-id@1.0.2: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.1: {} import-fresh@3.3.1: @@ -3337,8 +3113,6 @@ snapshots: lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} - loupe@3.1.3: {} lru-cache@10.2.0: {} @@ -3428,8 +3202,6 @@ snapshots: dependencies: minipass: 7.1.2 - mri@1.2.0: {} - ms@2.1.3: {} mz@2.7.0: @@ -3471,10 +3243,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - os-tmpdir@1.0.2: {} - - outdent@0.5.0: {} - p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -3505,8 +3273,6 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.9: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3563,7 +3329,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@2.8.8: {} + prettier@3.6.2: {} pretty-ms@9.0.0: dependencies: @@ -3637,8 +3403,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - semver@7.6.0: dependencies: lru-cache: 6.0.0 @@ -3744,8 +3508,6 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - term-size@2.2.1: {} - text-table@0.2.0: {} thenify-all@1.6.0: @@ -3771,10 +3533,6 @@ snapshots: tinyspy@3.0.2: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 From 31e8d470a74e031d9bbfb9fc770899ba2f13b7a2 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:52:11 +0100 Subject: [PATCH 615/722] Upgrade Template to new SDK (#166) * initial commit * cursor suggestions * updated * fix template * fmt * removed unused env vars * updated ci * python build ci test * dependencies * removed dotenv from ci * add capture for template id, build id * fixes java test, template name * lint * added changeset * readded cleanup * updated release CI * updated dockerhub push tag * updated readme * remove poetry from template build ci * generate template alias before test run * updated workflow * updated generated template alias for clarity * updated output * removed unused build_id output * corrected outputs * pin r, java, deno versions * install java from source, keep java 11 * make sure python & js kernels always installed * fixes java home * make kernels set --- .changeset/empty-wasps-count.md | 5 + .github/workflows/build_test_template.yml | 35 +++--- .github/workflows/pull_request.yml | 2 +- .github/workflows/release.yml | 32 +++-- Makefile | 2 +- template/Dockerfile | 74 ------------ template/README.md | 74 +++++++----- template/build_ci.py | 11 ++ template/build_docker.py | 5 + template/build_prod.py | 13 +++ template/build_test.py | 13 +++ template/e2b.Dockerfile | 1 - template/e2b.toml | 18 --- template/requirements-dev.txt | 2 + template/start-up.sh | 6 +- template/template.py | 136 ++++++++++++++++++++++ template/test.Dockerfile | 63 ---------- 17 files changed, 273 insertions(+), 219 deletions(-) create mode 100644 .changeset/empty-wasps-count.md delete mode 100644 template/Dockerfile create mode 100644 template/build_ci.py create mode 100644 template/build_docker.py create mode 100644 template/build_prod.py create mode 100644 template/build_test.py delete mode 100644 template/e2b.Dockerfile delete mode 100644 template/e2b.toml create mode 100644 template/requirements-dev.txt mode change 100644 => 100755 template/start-up.sh create mode 100644 template/template.py delete mode 100644 template/test.Dockerfile diff --git a/.changeset/empty-wasps-count.md b/.changeset/empty-wasps-count.md new file mode 100644 index 00000000..019c88f4 --- /dev/null +++ b/.changeset/empty-wasps-count.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': minor +--- + +updated template to new SDK diff --git a/.github/workflows/build_test_template.yml b/.github/workflows/build_test_template.yml index e8d6edb2..3f39bc41 100644 --- a/.github/workflows/build_test_template.yml +++ b/.github/workflows/build_test_template.yml @@ -3,7 +3,7 @@ name: Build Template on: workflow_call: secrets: - E2B_TESTS_ACCESS_TOKEN: + E2B_API_KEY: required: true inputs: E2B_DOMAIN: @@ -22,7 +22,7 @@ jobs: name: Build E2B Template runs-on: ubuntu-latest outputs: - template_id: ${{ steps.build-template.outputs.template_id }} + template_id: ${{ steps.generate-template-id.outputs.template_id }} steps: - name: Checkout repository uses: actions/checkout@v4 @@ -34,22 +34,27 @@ jobs: echo "Version: $VERSION" sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - - name: Install E2B CLI - run: npm install -g @e2b/cli + - uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install development dependencies + working-directory: ./template + run: pip install -r requirements-dev.txt + + - name: Generate Template ID + id: generate-template-id + run: | + E2B_TESTS_TEMPLATE=e2b-code-interpreter-ci-$(uuidgen) + echo "Generated Template ID: $E2B_TESTS_TEMPLATE" + echo "template_id=$E2B_TESTS_TEMPLATE" >> $GITHUB_OUTPUT - name: Build E2B template id: build-template - run: | - rm -f e2b.toml - e2b template build --memory-mb 1024 -c "/root/.jupyter/start-up.sh" -d "Dockerfile" - TEMPLATE_ID=$(grep "template_id" e2b.toml | cut -d '"' -f 2) - echo "Captured Template ID: $TEMPLATE_ID" - echo "template_id=$TEMPLATE_ID" >> $GITHUB_OUTPUT working-directory: ./template + run: | + python build_ci.py env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} - - - name: Output template ID - run: | - echo "Template ID from step output: ${{ steps.build-template.outputs.template_id }}" + E2B_TESTS_TEMPLATE: ${{ steps.generate-template-id.outputs.template_id }} diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 5ea47773..7ed194c9 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -17,7 +17,7 @@ jobs: build-template: uses: ./.github/workflows/build_test_template.yml secrets: - E2B_TESTS_ACCESS_TOKEN: ${{ secrets.E2B_TESTS_ACCESS_TOKEN }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} with: E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} js-sdk: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ef0ed82..06a97a21 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -200,13 +200,13 @@ jobs: sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt - - name: Build Docker image - uses: docker/build-push-action@v6 - with: - context: ./template - push: true - platforms: linux/amd64 - tags: ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest + - name: Build and push to DockerHub + working-directory: ./template + run: | + python build_docker.py | docker buildx build \ + --platform linux/amd64 \ + --push \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/code-interpreter:latest -f - . build-template: name: Build E2B template @@ -219,14 +219,22 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Install E2B CLI - run: npm install -g @e2b/cli + - uses: actions/setup-python@v6 + with: + python-version: '3.13' - - name: Build e2b - run: e2b template build + - name: Install development dependencies working-directory: ./template + run: pip install -r requirements-dev.txt + + - name: Build E2B template + id: build-template + working-directory: ./template + run: | + python build_prod.py env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} python-tests: name: Python Tests diff --git a/Makefile b/Makefile index db252514..99efa3b8 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ start-template-server: - docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(docker build . -q -f ./template/test.Dockerfile) + docker run --rm -e E2B_LOCAL=true -p 49999:49999 -it $$(python template/build_docker.py | docker build -q ./template -f -) kill-template-server: docker kill $(shell docker ps --filter expose=49999 --format {{.ID}}) diff --git a/template/Dockerfile b/template/Dockerfile deleted file mode 100644 index 814c14c0..00000000 --- a/template/Dockerfile +++ /dev/null @@ -1,74 +0,0 @@ -FROM python:3.12 - -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo fonts-noto-cjk r-base - -# Install Node.js 20.x from NodeSource -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get install -y nodejs - -ENV PIP_DEFAULT_TIMEOUT=100 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PIP_NO_CACHE_DIR=1 \ - JUPYTER_CONFIG_PATH="/root/.jupyter" \ - IPYTHON_CONFIG_PATH="/root/.ipython" \ - SERVER_PATH="/root/.server" \ - JAVA_HOME=/opt/java/openjdk - -# Install Jupyter -COPY ./requirements.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user - -# R Kernel -RUN R -e "install.packages('IRkernel', repos='https://cloud.r-project.org')" -RUN R -e "IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')" - -# Javascript Kernel -RUN npm install -g --unsafe-perm git+https://github.com/e2b-dev/ijavascript.git -RUN ijsinstall --install=global - -# Deno Kernel -COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno -RUN chmod +x /usr/bin/deno -RUN deno jupyter --unstable --install -COPY ./deno.json /root/.local/share/jupyter/kernels/deno/kernel.json - -# Bash Kernel -RUN pip install bash_kernel -RUN python -m bash_kernel.install - -# Create separate virtual environment for server -RUN python -m venv $SERVER_PATH/.venv - -# Copy server and its requirements -RUN mkdir -p $SERVER_PATH/ -COPY ./server/requirements.txt $SERVER_PATH -RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt -COPY ./server $SERVER_PATH - -# Copy matplotlibrc -COPY matplotlibrc /root/.config/matplotlib/.matplotlibrc - -# Copy Jupyter configuration -COPY ./start-up.sh $JUPYTER_CONFIG_PATH/ -RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh - -COPY ./jupyter_server_config.py $JUPYTER_CONFIG_PATH/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default -COPY ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup -COPY startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup - - -COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME -RUN ln -s ${JAVA_HOME}/bin/java /usr/bin/java - -# Java Kernel -RUN wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip && \ - unzip ijava-1.3.0.zip && \ - python install.py --sys-prefix - -# Setup entrypoint for local development -ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh diff --git a/template/README.md b/template/README.md index c1103acd..19039fc4 100644 --- a/template/README.md +++ b/template/README.md @@ -1,45 +1,57 @@ # Using custom sandbox with Code Interpreter SDK -If you want to customize the Code Interprerter sandbox (e.g.: add a preinstalled package) you can do that by using a [custom sandbox template](https://e2b.dev/docs/sandbox-template). - +If you want to customize the Code Interpreter sandbox (e.g.: add a preinstalled package) you can do that by creating a [custom sandbox template](https://e2b.dev/docs/template/quickstart). ## Step-by-step guide -1. Create custom sandbox by following [this guide](https://e2b.dev/docs/sandbox-template) -2. Use prebuilt [E2B Code Interpreter image](https://hub.docker.com/r/e2bdev/code-interpreter) by replacing the `FROM` command in your `e2b.Dockerfile` with following +1. Install E2B SDK + +``` +pip install e2b dotenv +``` + +2. Create a custom sandbox template: + +**template.py** + +```python +from e2b import Template + +template = Template().from_template("code-interpreter-v1") +``` + +3. Create a build script: - ```Dockerfile - FROM e2bdev/code-interpreter:latest - ``` +**build.py** -3. Copy [`start-up.sh`](./start-up.sh) to the same directory where's your `e2b.toml` +```python +from dotenv import load_dotenv +from .template import template +from e2b import Template, default_build_logger -4. Run the following in the same directory where's your `e2b.toml` - ```sh - e2b template build -c "/root/.jupyter/start-up.sh" - ``` +load_dotenv() -5. Use your custom sandbox with Code Interpreter SDK +Template.build( + template, + alias="code-interpreter-custom", + cpu_count=2, + memory_mb=2048, + on_build_logs=default_build_logger(), +) +``` - **Python** - ```python - from e2b_code_interpreter import Sandbox - sandbox = Sandbox.create(template="your-custom-sandbox-name") - execution = sandbox.run_code("print('hello')") - sandbox.kill() +3. Build the template: - # Or you can use `with` which handles closing the sandbox for you - with Sandbox.create(template="your-custom-sandbox-name") as sandbox: - execution = sandbox.run_code("print('hello')") - ``` - +``` +python build.py +``` - **JavaScript/TypeScript** +4. Use the custom template: - ```js - import {Sandbox} from '@e2b/code-interpreter' +```python +from e2b import Sandbox -const sandbox = await Sandbox.create({template: 'your-custom-sandbox-name'}) -const execution = await sandbox.runCode('print("hello")') -await sandbox.kill() - ``` +sbx = Sandbox.create(template="code-interpreter-custom") +execution = sbx.run_code("print('Hello, World!')") +print(execution.logs.stdout) +``` diff --git a/template/build_ci.py b/template/build_ci.py new file mode 100644 index 00000000..7455836d --- /dev/null +++ b/template/build_ci.py @@ -0,0 +1,11 @@ +import os +from e2b import Template, default_build_logger +from template import make_template + +Template.build( + make_template(set_user_workdir=True), + alias=os.environ["E2B_TESTS_TEMPLATE"], + cpu_count=2, + memory_mb=2048, + on_build_logs=default_build_logger(), +) diff --git a/template/build_docker.py b/template/build_docker.py new file mode 100644 index 00000000..17c17098 --- /dev/null +++ b/template/build_docker.py @@ -0,0 +1,5 @@ +from template import make_template +from e2b import Template + +tmp = make_template(kernels=["python", "javascript"]) +print(Template.to_dockerfile(tmp)) diff --git a/template/build_prod.py b/template/build_prod.py new file mode 100644 index 00000000..d88c447d --- /dev/null +++ b/template/build_prod.py @@ -0,0 +1,13 @@ +from dotenv import load_dotenv +from e2b import Template, default_build_logger +from template import make_template + +load_dotenv() + +Template.build( + make_template(set_user_workdir=True), + alias="code-interpreter-v1", + cpu_count=2, + memory_mb=2048, + on_build_logs=default_build_logger(), +) diff --git a/template/build_test.py b/template/build_test.py new file mode 100644 index 00000000..2e228785 --- /dev/null +++ b/template/build_test.py @@ -0,0 +1,13 @@ +from dotenv import load_dotenv +from e2b import Template, default_build_logger +from template import make_template + +load_dotenv() + +Template.build( + make_template(kernels=["python", "javascript"], set_user_workdir=True), + alias="code-interpreter-dev", + cpu_count=1, + memory_mb=1024, + on_build_logs=default_build_logger(min_level="debug"), +) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile deleted file mode 100644 index 47fb7712..00000000 --- a/template/e2b.Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM e2bdev/code-interpreter:latest diff --git a/template/e2b.toml b/template/e2b.toml deleted file mode 100644 index 1eb93ae1..00000000 --- a/template/e2b.toml +++ /dev/null @@ -1,18 +0,0 @@ -# This is a config for E2B sandbox template. -# You can use template ID (nlhz8vlwyupq845jsdg9) or template name (code-interpreter-v1) to create a sandbox: - -# Python SDK -# from e2b import Sandbox, AsyncSandbox -# sandbox = Sandbox.create("code-interpreter-v1") # Sync sandbox -# sandbox = await AsyncSandbox.create("code-interpreter-v1") # Async sandbox - -# JS SDK -# import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create('code-interpreter-v1') - -team_id = "460355b3-4f64-48f9-9a16-4442817f79f5" -memory_mb = 1_024 -start_cmd = "/root/.jupyter/start-up.sh" -dockerfile = "e2b.Dockerfile" -template_name = "code-interpreter-v1" -template_id = "nlhz8vlwyupq845jsdg9" diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt new file mode 100644 index 00000000..16a0115f --- /dev/null +++ b/template/requirements-dev.txt @@ -0,0 +1,2 @@ +e2b==2.6.0 +python-dotenv==1.2.1 \ No newline at end of file diff --git a/template/start-up.sh b/template/start-up.sh old mode 100644 new mode 100755 index 5d6223ff..81375084 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -13,10 +13,10 @@ function start_jupyter_server() { response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done - cd /root/.server/ - /root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 + cd /.server/ + .venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } echo "Starting Code Interpreter server..." start_jupyter_server & -MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 +MATPLOTLIBRC=.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 diff --git a/template/template.py b/template/template.py new file mode 100644 index 00000000..36234506 --- /dev/null +++ b/template/template.py @@ -0,0 +1,136 @@ +from e2b import Template, wait_for_url + + +def make_template( + kernels: list[str] = ["python", "r", "javascript", "deno", "bash", "java"], + set_user_workdir: bool = False, +): + enabled_kernels = set(["python", "javascript"] + kernels) + # Start with base template + template = ( + Template() + .from_image("python:3.12") + .set_user("root") + .set_workdir("/") + .set_envs( + { + "PIP_DEFAULT_TIMEOUT": "100", + "PIP_DISABLE_PIP_VERSION_CHECK": "1", + "PIP_NO_CACHE_DIR": "1", + "JUPYTER_CONFIG_PATH": ".jupyter", + "IPYTHON_CONFIG_PATH": ".ipython", + "SERVER_PATH": ".server", + "JAVA_VERSION": "11", + "JAVA_HOME": "/usr/lib/jvm/jdk-${JAVA_VERSION}", + "IJAVA_VERSION": "1.3.0", + "DENO_INSTALL": "/opt/deno", + "DENO_VERSION": "v2.4.0", + "R_VERSION": "4.5.*", + } + ) + .apt_install( + [ + "build-essential", + "curl", + "git", + "util-linux", + "jq", + "sudo", + "fonts-noto-cjk", + "ca-certificates", + ] + ) + .run_cmd("curl -fsSL https://deb.nodesource.com/setup_20.x | bash -") + .apt_install("nodejs") + .copy("requirements.txt", "requirements.txt") + .pip_install("--no-cache-dir -r requirements.txt") + ) + + if "python" in enabled_kernels: + template = template.run_cmd("ipython kernel install --name 'python3' --user") + + # Install R Kernel if requested + if "r" in enabled_kernels: + template = ( + template.run_cmd( + [ + "sudo gpg --keyserver keyserver.ubuntu.com --recv-key 95C0FAF38DB3CCAD0C080A7BDC78B2DDEABC47B7", + "sudo gpg --armor --export 95C0FAF38DB3CCAD0C080A7BDC78B2DDEABC47B7 | sudo tee /etc/apt/trusted.gpg.d/cran_debian_key.asc", + 'echo "deb https://cloud.r-project.org/bin/linux/debian trixie-cran40/" | sudo tee /etc/apt/sources.list.d/cran.list', + ] + ) + .apt_install("r-base=${R_VERSION} r-base-dev") + .run_cmd( + [ + "R -e \"install.packages('IRkernel', repos='https://cloud.r-project.org')\"", + "R -e \"IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')\"", + ] + ) + ) + + # Install JavaScript Kernel if requested + if "javascript" in enabled_kernels: + template = template.npm_install( + "--unsafe-perm git+https://github.com/e2b-dev/ijavascript.git", + g=True, + ).run_cmd("ijsinstall --install=global") + + # Install Deno Kernel if requested + if "deno" in enabled_kernels: + template = template.run_cmd( + [ + "curl -fsSL https://deno.land/install.sh | sh -s ${DENO_VERSION}", + "PATH=$DENO_INSTALL/bin:$PATH", + "deno jupyter --unstable --install", + ] + ).copy("deno.json", ".local/share/jupyter/kernels/deno/kernel.json") + + # Install Bash Kernel if requested + if "bash" in enabled_kernels: + template = template.pip_install("bash_kernel").run_cmd( + "python -m bash_kernel.install" + ) + + # Install Java and Java Kernel if requested + if "java" in enabled_kernels: + template = template.run_cmd( + [ + "mkdir -p /usr/lib/jvm", + "curl -fsSL https://download.java.net/java/ga/jdk${JAVA_VERSION}/openjdk-${JAVA_VERSION}_linux-x64_bin.tar.gz | tar -xz -C /usr/lib/jvm", + "update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-${JAVA_VERSION}/bin/java 1", + "update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-${JAVA_VERSION}/bin/javac 1", + "wget https://github.com/SpencerPark/IJava/releases/download/v${IJAVA_VERSION}/ijava-${IJAVA_VERSION}.zip", + "unzip ijava-${IJAVA_VERSION}.zip", + "python install.py --sys-prefix", + ] + ) + + # Common setup steps (always run) + template = ( + template + # Create server virtual environment + .copy("server", ".server") + .run_cmd("python -m venv .server/.venv") + # Copy and install server requirements + .run_cmd( + ".server/.venv/bin/pip install --no-cache-dir -r .server/requirements.txt" + ) + ) + + if set_user_workdir: + template = template.set_user("user").set_workdir("/home/user") + + # Copy configuration files + template = ( + template.copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") + .copy("start-up.sh", ".jupyter/start-up.sh") + .run_cmd("chmod +x .jupyter/start-up.sh") + .copy("jupyter_server_config.py", ".jupyter/") + .make_dir(".ipython/profile_default/startup") + .copy("ipython_kernel_config.py", ".ipython/profile_default/") + .copy("startup_scripts", ".ipython/profile_default/startup") + ) + + return template.set_start_cmd( + ".jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") + ) diff --git a/template/test.Dockerfile b/template/test.Dockerfile deleted file mode 100644 index 14eb0005..00000000 --- a/template/test.Dockerfile +++ /dev/null @@ -1,63 +0,0 @@ -FROM python:3.12 - -ENV JAVA_HOME=/opt/java/openjdk -COPY --from=eclipse-temurin:11-jdk $JAVA_HOME $JAVA_HOME -ENV PATH="${JAVA_HOME}/bin:${PATH}" - -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ - build-essential curl git util-linux jq sudo fonts-noto-cjk - -# Install Node.js 20.x from NodeSource -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get install -y nodejs - -ENV PIP_DEFAULT_TIMEOUT=100 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PIP_NO_CACHE_DIR=1 \ - JUPYTER_CONFIG_PATH="/root/.jupyter" \ - IPYTHON_CONFIG_PATH="/root/.ipython" \ - SERVER_PATH="/root/.server" - -# Install Jupyter -COPY ./template/requirements.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt && ipython kernel install --name "python3" --user - -# Javascript Kernel -RUN npm install -g --unsafe-perm git+https://github.com/e2b-dev/ijavascript.git -RUN ijsinstall --install=global - -# Deno Kernel -COPY --from=denoland/deno:bin-2.0.4 /deno /usr/bin/deno -RUN chmod +x /usr/bin/deno -RUN deno jupyter --unstable --install -COPY ./template/deno.json /root/.local/share/jupyter/kernels/deno/kernel.json - -# Create separate virtual environment for server -RUN python -m venv $SERVER_PATH/.venv - -# Copy server and its requirements -RUN mkdir -p $SERVER_PATH/ -COPY ./template/server/requirements.txt $SERVER_PATH -RUN $SERVER_PATH/.venv/bin/pip install --no-cache-dir -r $SERVER_PATH/requirements.txt -COPY ./template/server $SERVER_PATH - -# Copy matplotlibrc -COPY ./template/matplotlibrc /root/.config/matplotlib/matplotlibrc - -# Copy Jupyter configuration -COPY ./template/start-up.sh $JUPYTER_CONFIG_PATH/ -RUN chmod +x $JUPYTER_CONFIG_PATH/start-up.sh - -COPY ./template/jupyter_server_config.py $JUPYTER_CONFIG_PATH/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default -COPY ./template/ipython_kernel_config.py $IPYTHON_CONFIG_PATH/profile_default/ - -RUN mkdir -p $IPYTHON_CONFIG_PATH/profile_default/startup -COPY ./template/startup_scripts/* $IPYTHON_CONFIG_PATH/profile_default/startup - -# Setup entrypoint for local development -WORKDIR /home/user -COPY ./chart_data_extractor ./chart_data_extractor -RUN pip install -e ./chart_data_extractor -ENTRYPOINT $JUPYTER_CONFIG_PATH/start-up.sh From 36f7c7f8ce742aab887529a12b49815eac4930b0 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 6 Nov 2025 12:29:08 +0100 Subject: [PATCH 616/722] add missing dependencies to release CI pipeline (#168) --- .github/workflows/release.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 06a97a21..ac06b145 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -200,6 +200,14 @@ jobs: sed -i "s/e2b_charts/e2b_charts==${VERSION}/g" requirements.txt + - uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install development dependencies + working-directory: ./template + run: pip install -r requirements-dev.txt + - name: Build and push to DockerHub working-directory: ./template run: | From 6a01b27b93d2f07d9ffea069fd53cb0469fdca27 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 6 Nov 2025 12:49:05 +0100 Subject: [PATCH 617/722] Update E2B version in dev dependencies (#169) * add missing dependencies to release CI pipeline * update e2b version in dev dependencies --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index 16a0115f..425d5987 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.6.0 +e2b==2.6.2 python-dotenv==1.2.1 \ No newline at end of file From acee15834973a339dff3a7fc1a16539a25cacc18 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:58:39 +0100 Subject: [PATCH 618/722] use e2b prod api key for template publish (#170) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac06b145..c90384de 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -241,7 +241,7 @@ jobs: run: | python build_prod.py env: - E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_API_KEY: ${{ secrets.E2B_PROD_API_KEY }} E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} python-tests: From 2cf2991f11f2798ec4615fef93d3acb55c07dc3d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 6 Nov 2025 15:37:29 +0000 Subject: [PATCH 619/722] [skip ci] Release new versions --- .changeset/empty-wasps-count.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/empty-wasps-count.md diff --git a/.changeset/empty-wasps-count.md b/.changeset/empty-wasps-count.md deleted file mode 100644 index 019c88f4..00000000 --- a/.changeset/empty-wasps-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': minor ---- - -updated template to new SDK diff --git a/template/package.json b/template/package.json index a6c1cd27..e1257056 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.1.1", + "version": "0.2.0", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 496f28a911e2508def57d73daba48365e4f9e2d5 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:12:28 +0100 Subject: [PATCH 620/722] Moved configuration files to /root (as legacy) and mimic user setup in Docker (#171) * moved configuration files to /root (as legacy) and match user in docker * fix ci * use absolute env paths * lint * remove user ownership for /root --- template/build_ci.py | 2 +- template/build_docker.py | 2 +- template/build_prod.py | 2 +- template/build_test.py | 6 +++--- template/start-up.sh | 4 ++-- template/template.py | 27 ++++++++++++++++++--------- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/template/build_ci.py b/template/build_ci.py index 7455836d..1c89b472 100644 --- a/template/build_ci.py +++ b/template/build_ci.py @@ -3,7 +3,7 @@ from template import make_template Template.build( - make_template(set_user_workdir=True), + make_template(), alias=os.environ["E2B_TESTS_TEMPLATE"], cpu_count=2, memory_mb=2048, diff --git a/template/build_docker.py b/template/build_docker.py index 17c17098..7d1438a8 100644 --- a/template/build_docker.py +++ b/template/build_docker.py @@ -1,5 +1,5 @@ from template import make_template from e2b import Template -tmp = make_template(kernels=["python", "javascript"]) +tmp = make_template(kernels=["python", "javascript"], is_docker=True) print(Template.to_dockerfile(tmp)) diff --git a/template/build_prod.py b/template/build_prod.py index d88c447d..5274d8c4 100644 --- a/template/build_prod.py +++ b/template/build_prod.py @@ -5,7 +5,7 @@ load_dotenv() Template.build( - make_template(set_user_workdir=True), + make_template(), alias="code-interpreter-v1", cpu_count=2, memory_mb=2048, diff --git a/template/build_test.py b/template/build_test.py index 2e228785..a11128ca 100644 --- a/template/build_test.py +++ b/template/build_test.py @@ -5,9 +5,9 @@ load_dotenv() Template.build( - make_template(kernels=["python", "javascript"], set_user_workdir=True), + make_template(kernels=["python", "javascript"]), alias="code-interpreter-dev", - cpu_count=1, - memory_mb=1024, + cpu_count=2, + memory_mb=2048, on_build_logs=default_build_logger(min_level="debug"), ) diff --git a/template/start-up.sh b/template/start-up.sh index 81375084..d30cfc9e 100755 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -13,10 +13,10 @@ function start_jupyter_server() { response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done - cd /.server/ + cd /root/.server/ .venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } echo "Starting Code Interpreter server..." start_jupyter_server & -MATPLOTLIBRC=.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 +MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 diff --git a/template/template.py b/template/template.py index 36234506..7fb2f1e0 100644 --- a/template/template.py +++ b/template/template.py @@ -3,7 +3,7 @@ def make_template( kernels: list[str] = ["python", "r", "javascript", "deno", "bash", "java"], - set_user_workdir: bool = False, + is_docker: bool = False, ): enabled_kernels = set(["python", "javascript"] + kernels) # Start with base template @@ -11,15 +11,15 @@ def make_template( Template() .from_image("python:3.12") .set_user("root") - .set_workdir("/") + .set_workdir("/root") .set_envs( { "PIP_DEFAULT_TIMEOUT": "100", "PIP_DISABLE_PIP_VERSION_CHECK": "1", "PIP_NO_CACHE_DIR": "1", - "JUPYTER_CONFIG_PATH": ".jupyter", - "IPYTHON_CONFIG_PATH": ".ipython", - "SERVER_PATH": ".server", + "JUPYTER_CONFIG_PATH": "/root/.jupyter", + "IPYTHON_CONFIG_PATH": "/root/.ipython", + "SERVER_PATH": "/root/.server", "JAVA_VERSION": "11", "JAVA_HOME": "/usr/lib/jvm/jdk-${JAVA_VERSION}", "IJAVA_VERSION": "1.3.0", @@ -117,9 +117,6 @@ def make_template( ) ) - if set_user_workdir: - template = template.set_user("user").set_workdir("/home/user") - # Copy configuration files template = ( template.copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") @@ -131,6 +128,18 @@ def make_template( .copy("startup_scripts", ".ipython/profile_default/startup") ) + if is_docker: + # create user user and /home/user + template = template.run_cmd("useradd -m user") + template = template.run_cmd("mkdir -p /home/user") + template = template.run_cmd("chown -R user:user /home/user") + # add to sudoers + template = template.run_cmd( + "echo 'user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers" + ) + + template = template.set_user("user").set_workdir("/home/user") + return template.set_start_cmd( - ".jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") + "sudo /root/.jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") ) From c6b195352184b8b1b60909e77036198348e242a2 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:28:41 +0100 Subject: [PATCH 621/722] added changeset (#172) --- .changeset/stale-heads-sip.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stale-heads-sip.md diff --git a/.changeset/stale-heads-sip.md b/.changeset/stale-heads-sip.md new file mode 100644 index 00000000..977b947d --- /dev/null +++ b/.changeset/stale-heads-sip.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Moved configuration files to /root (as legacy) and mimic user setup in Docker From fd241fc22f41795265ad4640ea42e1e3599006b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 11 Nov 2025 17:48:37 +0000 Subject: [PATCH 622/722] [skip ci] Release new versions --- .changeset/stale-heads-sip.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/stale-heads-sip.md diff --git a/.changeset/stale-heads-sip.md b/.changeset/stale-heads-sip.md deleted file mode 100644 index 977b947d..00000000 --- a/.changeset/stale-heads-sip.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Moved configuration files to /root (as legacy) and mimic user setup in Docker diff --git a/template/package.json b/template/package.json index e1257056..d8c5dc6b 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.2.0", + "version": "0.2.1", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 8df1ba6306de47808205937d37cdc7c224cee266 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:23:48 +0100 Subject: [PATCH 623/722] update e2b dev dependency (#173) --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index 425d5987..c27bd916 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.6.2 +e2b==2.6.4 python-dotenv==1.2.1 \ No newline at end of file From 483830eae91d6d321edeb18b071003a7af34393f Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Thu, 20 Nov 2025 10:25:10 +0100 Subject: [PATCH 624/722] Update e2b dependency to latest version (#176) Co-authored-by: jakub.dobry Co-authored-by: Cursor Agent --- js/package.json | 2 +- pnpm-lock.yaml | 31 +++++----------- python/poetry.lock | 77 +++++++++++++++++++++++++++------------- python/pyproject.toml | 6 ++-- python/tests/conftest.py | 59 +++++++++++++++++++++++------- 5 files changed, 111 insertions(+), 64 deletions(-) diff --git a/js/package.json b/js/package.json index 21c7f587..027e4242 100644 --- a/js/package.json +++ b/js/package.json @@ -74,6 +74,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.6.0" + "e2b": "^2.7.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58c58a7b..7e3f8587 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.7.0 + version: 2.7.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -880,8 +880,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.6.0: - resolution: {integrity: sha512-7hzfZGVZNwh2YU+aviOVRZ0HjFBnKFFQKTNq9CtXuJ0tHlDqeu5G5ZcryejGejnYrgAloxarThK9vE4srqXamQ==} + e2b@2.7.0: + resolution: {integrity: sha512-pbCbkkdkkY+yIhhtdSE7lM/vhIROtHNI0hNpj8lBphDILNH2qmmjhxU7/wam8/xWRbiWbfuQaOsv100lD32nag==} engines: {node: '>=20'} eastasianwidth@0.2.0: @@ -1029,10 +1029,6 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1307,10 +1303,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -2689,7 +2681,7 @@ snapshots: dotenv@16.4.7: {} - e2b@2.6.0: + e2b@2.7.0: dependencies: '@bufbuild/protobuf': 2.9.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) @@ -2890,11 +2882,6 @@ snapshots: flatted@3.3.3: {} - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -2927,10 +2914,10 @@ snapshots: glob@10.3.10: dependencies: - foreground-child: 3.1.1 + foreground-child: 3.3.1 jackspeak: 2.3.6 minimatch: 9.0.5 - minipass: 7.0.4 + minipass: 7.1.2 path-scurry: 1.10.1 glob@11.0.3: @@ -3194,8 +3181,6 @@ snapshots: minimist@1.2.8: {} - minipass@7.0.4: {} - minipass@7.1.2: {} minizlib@3.1.0: @@ -3288,7 +3273,7 @@ snapshots: path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 path-scurry@2.0.0: dependencies: diff --git a/python/poetry.lock b/python/poetry.lock index 7a4186d0..3ee1c72f 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "anyio" @@ -90,6 +90,18 @@ d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \" jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bracex" +version = "2.6" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952"}, + {file = "bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7"}, +] + [[package]] name = "certifi" version = "2024.7.4" @@ -476,14 +488,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "2.6.0" +version = "2.7.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-2.6.0-py3-none-any.whl", hash = "sha256:74fbf9adf5d651862780d281e5f50cfb0286adbeaba6dceac86f26e5e1c0ad8c"}, - {file = "e2b-2.6.0.tar.gz", hash = "sha256:3c6a8e315748d39efc2b0ff69aa47af548fd9da64be64f6797e5998db324e791"}, + {file = "e2b-2.7.0-py3-none-any.whl", hash = "sha256:cc3d0a2def205e3e3e2ac635c59d12f41adea3c32a479e578716e4abcdd8898d"}, + {file = "e2b-2.7.0.tar.gz", hash = "sha256:e276101c017ab4425688a9935a91d79c8ea43fc73bf7089d10028a4b21915016"}, ] [package.dependencies] @@ -496,6 +508,7 @@ protobuf = ">=4.21.0" python-dateutil = ">=2.8.2" rich = ">=14.0.0" typing-extensions = ">=4.1.0" +wcmatch = ">=10.1,<11.0" [[package]] name = "exceptiongroup" @@ -687,7 +700,7 @@ description = "Read resources from Python packages" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -1373,7 +1386,7 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -1399,41 +1412,42 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "0.23.8" +version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, - {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, + {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, + {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, ] [package.dependencies] -pytest = ">=7.0.0,<9" +pytest = ">=8.2,<9" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] @@ -1645,7 +1659,7 @@ description = "Easily download, build, install, upgrade, and uninstall Python pa optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, @@ -1801,6 +1815,21 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "wcmatch" +version = "10.1" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a"}, + {file = "wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + [[package]] name = "wrapt" version = "1.17.0" @@ -1899,7 +1928,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.10\"" +markers = "python_version == \"3.9\"" files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, @@ -1916,4 +1945,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "f0f0e653869c2ee8fac2dd97f0a87f9a89c150264da41ea3d2845e6c54ad08b5" +content-hash = "f3c2463ae3e3af850183625fdf71af742aa448ecaf85261a3fce2b30cb879743" diff --git a/python/pyproject.toml b/python/pyproject.toml index 573b594f..3324b91b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,13 +14,13 @@ python = "^3.9" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.6.0" +e2b = "^2.7.0" [tool.poetry.group.dev.dependencies] -pytest = "^7.4.0" +pytest = "^8.2.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" -pytest-asyncio = "^0.23.7" +pytest-asyncio = "^0.24.0" pytest-xdist = "^3.6.1" pydoc-markdown = "^4.8.2" matplotlib = "^3.8.0" diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 3c046928..bc853e85 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -1,6 +1,7 @@ import pytest import pytest_asyncio import os +import asyncio from logging import warning @@ -10,6 +11,19 @@ timeout = 60 +# Override the event loop so it never closes during test execution +# This helps with pytest-xdist and prevents "Event loop is closed" errors +@pytest.fixture(scope="session") +def event_loop(): + """Create a session-scoped event loop for all async tests.""" + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + yield loop + loop.close() + + @pytest.fixture() def template(): return os.getenv("E2B_TESTS_TEMPLATE") or "code-interpreter-v1" @@ -31,20 +45,39 @@ def sandbox(template, debug): ) -@pytest_asyncio.fixture -async def async_sandbox(template, debug): - async_sandbox = await AsyncSandbox.create(template, timeout=timeout, debug=debug) +@pytest.fixture +def async_sandbox_factory(request, template, debug, event_loop): + """Factory for creating async sandboxes with proper cleanup.""" - try: - yield async_sandbox - finally: - try: - await async_sandbox.kill() - except: # noqa: E722 - if not debug: - warning( - "Failed to kill sandbox — this is expected if the test runs with local envd." - ) + async def factory(template_override=None, **kwargs): + template_name = template_override or template + kwargs.setdefault("timeout", timeout) + kwargs.setdefault("debug", debug) + + sandbox = await AsyncSandbox.create(template_name, **kwargs) + + def kill(): + async def _kill(): + try: + await sandbox.kill() + except: # noqa: E722 + if not debug: + warning( + "Failed to kill sandbox — this is expected if the test runs with local envd." + ) + + event_loop.run_until_complete(_kill()) + + request.addfinalizer(kill) + return sandbox + + return factory + + +@pytest.fixture +async def async_sandbox(async_sandbox_factory): + """Default async sandbox fixture.""" + return await async_sandbox_factory() @pytest.fixture From 66eabba605865729579c8d6b8d23f2a37d7461ed Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:31:42 +0100 Subject: [PATCH 625/722] added context methods to the SDK + tests (#179) * added context methods to the SDK + tests * lint * format * remove body return on delete context --- .changeset/open-lamps-drop.md | 6 ++ js/src/sandbox.ts | 92 +++++++++++++++++++ js/tests/contexts.test.ts | 63 +++++++++++++ .../code_interpreter_async.py | 88 +++++++++++++++++- .../code_interpreter_sync.py | 88 +++++++++++++++++- python/tests/async/test_async_contexts.py | 62 +++++++++++++ python/tests/sync/test_contexts.py | 62 +++++++++++++ template/server/main.py | 19 ++-- 8 files changed, 468 insertions(+), 12 deletions(-) create mode 100644 .changeset/open-lamps-drop.md create mode 100644 js/tests/contexts.test.ts create mode 100644 python/tests/async/test_async_contexts.py create mode 100644 python/tests/sync/test_contexts.py diff --git a/.changeset/open-lamps-drop.md b/.changeset/open-lamps-drop.md new file mode 100644 index 00000000..2fc5b72a --- /dev/null +++ b/.changeset/open-lamps-drop.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +added context methods to the sdk diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 4272d846..0a87d20f 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -320,4 +320,96 @@ export class Sandbox extends BaseSandbox { throw formatRequestTimeoutError(error) } } + + /** + * Removes a context. + * + * @param context context to remove. + * + * @returns void. + */ + async removeCodeContext(context: Context | string): Promise { + try { + const id = typeof context === 'string' ? context : context.id + const res = await fetch(`${this.jupyterUrl}/contexts/${id}`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + ...this.connectionConfig.headers, + }, + keepalive: true, + signal: this.connectionConfig.getSignal( + this.connectionConfig.requestTimeoutMs + ), + }) + + const error = await extractError(res) + if (error) { + throw error + } + } catch (error) { + throw formatRequestTimeoutError(error) + } + } + + /** + * List all contexts. + * + * @returns list of contexts. + */ + async listCodeContexts(): Promise { + try { + const res = await fetch(`${this.jupyterUrl}/contexts`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + ...this.connectionConfig.headers, + }, + keepalive: true, + signal: this.connectionConfig.getSignal( + this.connectionConfig.requestTimeoutMs + ), + }) + + const error = await extractError(res) + if (error) { + throw error + } + + return await res.json() + } catch (error) { + throw formatRequestTimeoutError(error) + } + } + + /** + * Restart a context. + * + * @param context context to restart. + * + * @returns void. + */ + async restartCodeContext(context: Context | string): Promise { + try { + const id = typeof context === 'string' ? context : context.id + const res = await fetch(`${this.jupyterUrl}/contexts/${id}/restart`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...this.connectionConfig.headers, + }, + keepalive: true, + signal: this.connectionConfig.getSignal( + this.connectionConfig.requestTimeoutMs + ), + }) + + const error = await extractError(res) + if (error) { + throw error + } + } catch (error) { + throw formatRequestTimeoutError(error) + } + } } diff --git a/js/tests/contexts.test.ts b/js/tests/contexts.test.ts new file mode 100644 index 00000000..7dda2090 --- /dev/null +++ b/js/tests/contexts.test.ts @@ -0,0 +1,63 @@ +import { expect } from 'vitest' + +import { sandboxTest } from './setup' + +sandboxTest('create context with no options', async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + const contexts = await sandbox.listCodeContexts() + const lastContext = contexts[contexts.length - 1] + + expect(lastContext.id).toBe(context.id) + expect(lastContext.language).toBe(context.language) + expect(lastContext.cwd).toBe(context.cwd) +}) + +sandboxTest('create context with options', async ({ sandbox }) => { + const context = await sandbox.createCodeContext({ + language: 'python', + cwd: '/root', + }) + + const contexts = await sandbox.listCodeContexts() + const lastContext = contexts[contexts.length - 1] + + expect(lastContext.id).toBe(context.id) + expect(lastContext.language).toBe(context.language) + expect(lastContext.cwd).toBe(context.cwd) +}) + +sandboxTest('remove context', async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + await sandbox.removeCodeContext(context.id) + const contexts = await sandbox.listCodeContexts() + + expect(contexts.map((context) => context.id)).not.toContain(context.id) +}) + +sandboxTest('list contexts', async ({ sandbox }) => { + const contexts = await sandbox.listCodeContexts() + + // default contexts should include python and javascript + expect(contexts.map((context) => context.language)).toContain('python') + expect(contexts.map((context) => context.language)).toContain('javascript') +}) + +sandboxTest('restart context', async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + // set a variable in the context + await sandbox.runCode('x = 1', { context: context }) + + // restart the context + await sandbox.restartCodeContext(context.id) + + // check that the variable no longer exists + const execution = await sandbox.runCode('x', { context: context }) + + // check for an NameError with message "name 'x' is not defined" + expect(execution.error).toBeDefined() + expect(execution.error?.name).toBe('NameError') + expect(execution.error?.value).toBe("name 'x' is not defined") +}) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 789d6a70..98f59dd0 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload, Union, Literal +from typing import Optional, Dict, overload, Union, Literal, List from httpx import AsyncClient from e2b import ( @@ -273,3 +273,89 @@ async def create_code_context( return Context.from_json(data) except httpx.TimeoutException: raise format_request_timeout_error() + + async def remove_code_context( + self, + context: Union[Context, str], + ) -> None: + """ + Removes a context. + + :param context: Context to remove. Can be a Context object or a context ID string. + + :return: None + """ + context_id = context.id if isinstance(context, Context) else context + + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = await self._client.delete( + f"{self._jupyter_url}/contexts/{context_id}", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = await aextract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() + + async def list_code_contexts(self) -> List[Context]: + """ + List all contexts. + + :return: List of contexts. + """ + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = await self._client.get( + f"{self._jupyter_url}/contexts", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = await aextract_exception(response) + if err: + raise err + + data = response.json() + return [Context.from_json(context_data) for context_data in data] + except httpx.TimeoutException: + raise format_request_timeout_error() + + async def restart_code_context( + self, + context: Union[Context, str], + ) -> None: + """ + Restart a context. + + :param context: Context to restart. Can be a Context object or a context ID string. + + :return: None + """ + context_id = context.id if isinstance(context, Context) else context + + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = await self._client.post( + f"{self._jupyter_url}/contexts/{context_id}/restart", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = await aextract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 6cf56c11..67492398 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload, Literal, Union +from typing import Optional, Dict, overload, Literal, Union, List from httpx import Client from e2b import Sandbox as BaseSandbox, InvalidArgumentException @@ -270,3 +270,89 @@ def create_code_context( return Context.from_json(data) except httpx.TimeoutException: raise format_request_timeout_error() + + def remove_code_context( + self, + context: Union[Context, str], + ) -> None: + """ + Removes a context. + + :param context: Context to remove. Can be a Context object or a context ID string. + + :return: None + """ + context_id = context.id if isinstance(context, Context) else context + + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = self._client.delete( + f"{self._jupyter_url}/contexts/{context_id}", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = extract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() + + def list_code_contexts(self) -> List[Context]: + """ + List all contexts. + + :return: List of contexts. + """ + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = self._client.get( + f"{self._jupyter_url}/contexts", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = extract_exception(response) + if err: + raise err + + data = response.json() + return [Context.from_json(context_data) for context_data in data] + except httpx.TimeoutException: + raise format_request_timeout_error() + + def restart_code_context( + self, + context: Union[Context, str], + ) -> None: + """ + Restart a context. + + :param context: Context to restart. Can be a Context object or a context ID string. + + :return: None + """ + context_id = context.id if isinstance(context, Context) else context + + headers: Dict[str, str] = {} + if self._envd_access_token: + headers = {"X-Access-Token": self._envd_access_token} + + try: + response = self._client.post( + f"{self._jupyter_url}/contexts/{context_id}/restart", + headers=headers, + timeout=self.connection_config.request_timeout, + ) + + err = extract_exception(response) + if err: + raise err + except httpx.TimeoutException: + raise format_request_timeout_error() diff --git a/python/tests/async/test_async_contexts.py b/python/tests/async/test_async_contexts.py new file mode 100644 index 00000000..6be07734 --- /dev/null +++ b/python/tests/async/test_async_contexts.py @@ -0,0 +1,62 @@ +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def test_create_context_with_no_options(async_sandbox: AsyncSandbox): + context = await async_sandbox.create_code_context() + + contexts = await async_sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +async def test_create_context_with_options(async_sandbox: AsyncSandbox): + context = await async_sandbox.create_code_context( + language="python", + cwd="/root", + ) + + contexts = await async_sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +async def test_remove_context(async_sandbox: AsyncSandbox): + context = await async_sandbox.create_code_context() + + await async_sandbox.remove_code_context(context.id) + + contexts = await async_sandbox.list_code_contexts() + assert context.id not in [ctx.id for ctx in contexts] + + +async def test_list_contexts(async_sandbox: AsyncSandbox): + contexts = await async_sandbox.list_code_contexts() + + # default contexts should include python and javascript + languages = [context.language for context in contexts] + assert "python" in languages + assert "javascript" in languages + + +async def test_restart_context(async_sandbox: AsyncSandbox): + context = await async_sandbox.create_code_context() + + # set a variable in the context + await async_sandbox.run_code("x = 1", context=context) + + # restart the context + await async_sandbox.restart_code_context(context.id) + + # check that the variable no longer exists + execution = await async_sandbox.run_code("x", context=context) + + # check for a NameError with message "name 'x' is not defined" + assert execution.error is not None + assert execution.error.name == "NameError" + assert execution.error.value == "name 'x' is not defined" diff --git a/python/tests/sync/test_contexts.py b/python/tests/sync/test_contexts.py new file mode 100644 index 00000000..a7cbd884 --- /dev/null +++ b/python/tests/sync/test_contexts.py @@ -0,0 +1,62 @@ +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +def test_create_context_with_no_options(sandbox: Sandbox): + context = sandbox.create_code_context() + + contexts = sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +def test_create_context_with_options(sandbox: Sandbox): + context = sandbox.create_code_context( + language="python", + cwd="/root", + ) + + contexts = sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +def test_remove_context(sandbox: Sandbox): + context = sandbox.create_code_context() + + sandbox.remove_code_context(context.id) + + contexts = sandbox.list_code_contexts() + assert context.id not in [ctx.id for ctx in contexts] + + +def test_list_contexts(sandbox: Sandbox): + contexts = sandbox.list_code_contexts() + + # default contexts should include python and javascript + languages = [context.language for context in contexts] + assert "python" in languages + assert "javascript" in languages + + +def test_restart_context(sandbox: Sandbox): + context = sandbox.create_code_context() + + # set a variable in the context + sandbox.run_code("x = 1", context=context) + + # restart the context + sandbox.restart_code_context(context.id) + + # check that the variable no longer exists + execution = sandbox.run_code("x", context=context) + + # check for a NameError with message "name 'x' is not defined" + assert execution.error is not None + assert execution.error.name == "NameError" + assert execution.error.value == "name 'x' is not defined" diff --git a/template/server/main.py b/template/server/main.py index ea89a9d8..1f296926 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -2,7 +2,7 @@ import sys import httpx -from typing import Dict, Union, Literal, Set +from typing import Dict, Union, Literal, List from contextlib import asynccontextmanager from fastapi import FastAPI, Request @@ -133,19 +133,18 @@ async def post_contexts(request: CreateContext) -> Context: @app.get("/contexts") -async def get_contexts() -> Set[Context]: +async def get_contexts() -> List[Context]: logger.info("Listing contexts") - context_ids = websockets.keys() - - return set( + return [ Context( - id=websockets[context_id].context_id, - language=websockets[context_id].language, - cwd=websockets[context_id].cwd, + id=ws.context_id, + language=ws.language, + cwd=ws.cwd, ) - for context_id in context_ids - ) + for key, ws in websockets.items() + if key != "default" + ] @app.post("/contexts/{context_id}/restart") From 6acf33ae1d5f5a6cea925ff09facc5c76d4adb51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 26 Nov 2025 10:33:28 +0000 Subject: [PATCH 626/722] [skip ci] Release new versions --- .changeset/open-lamps-drop.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.3.0/charts/page.mdx | 240 +++++ .../v2.3.0/consts/page.mdx | 13 + .../v2.3.0/index/page.mdx | 103 +++ .../v2.3.0/messaging/page.mdx | 326 +++++++ .../v2.3.0/sandbox/page.mdx | 366 ++++++++ .../v2.4.0/sandbox/page.mdx | 819 ++++++++++++++++++ 10 files changed, 1870 insertions(+), 9 deletions(-) delete mode 100644 .changeset/open-lamps-drop.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx diff --git a/.changeset/open-lamps-drop.md b/.changeset/open-lamps-drop.md deleted file mode 100644 index 2fc5b72a..00000000 --- a/.changeset/open-lamps-drop.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -added context methods to the sdk diff --git a/js/package.json b/js/package.json index 027e4242..223cb1ca 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.2.0", + "version": "2.3.0", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index b6627ad9..8320fc5d 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.3.0", + "version": "2.4.0", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 3324b91b..6d84f0d2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.3.0" +version = "2.4.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx new file mode 100644 index 00000000..93c26893 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx @@ -0,0 +1,366 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### listCodeContexts() + +```ts +listCodeContexts(): Promise +``` + +List all contexts. + +###### Returns + +`Promise`\<`Context`[]\> + +list of contexts. + +### removeCodeContext() + +```ts +removeCodeContext(context: string | Context): Promise +``` + +Removes a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to remove. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### restartCodeContext() + +```ts +restartCodeContext(context: string | Context): Promise +``` + +Restart a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to restart. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx new file mode 100644 index 00000000..d6466bf3 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx @@ -0,0 +1,819 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + +### remove\_code\_context + +```python +def remove_code_context(context: Union[Context, str]) -> None +``` + +Removes a context. + +**Arguments**: + +- `context`: Context to remove. Can be a Context object or a context ID string. + +**Returns**: + +None + + +### list\_code\_contexts + +```python +def list_code_contexts() -> List[Context] +``` + +List all contexts. + +**Returns**: + +List of contexts. + + +### restart\_code\_context + +```python +def restart_code_context(context: Union[Context, str]) -> None +``` + +Restart a context. + +**Arguments**: + +- `context`: Context to restart. Can be a Context object or a context ID string. + +**Returns**: + +None + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + +### remove\_code\_context + +```python +async def remove_code_context(context: Union[Context, str]) -> None +``` + +Removes a context. + +**Arguments**: + +- `context`: Context to remove. Can be a Context object or a context ID string. + +**Returns**: + +None + + +### list\_code\_contexts + +```python +async def list_code_contexts() -> List[Context] +``` + +List all contexts. + +**Returns**: + +List of contexts. + + +### restart\_code\_context + +```python +async def restart_code_context(context: Union[Context, str]) -> None +``` + +Restart a context. + +**Arguments**: + +- `context`: Context to restart. Can be a Context object or a context ID string. + +**Returns**: + +None + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 59ec6f4932a100d3c36bef9d32ef95e91d7c3a95 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 26 Nov 2025 19:10:53 +0100 Subject: [PATCH 627/722] Added secure traffic access (#180) * secure traffic access * changed type syntax * bugbot suggestions * update test setup conf * format * cursor suggestion * increase default timeout * sandbox not callable * nit --- .changeset/fast-dogs-brush.md | 6 ++ js/src/sandbox.ts | 56 ++++++++---- js/tests/basic.test.ts | 9 +- js/tests/contexts.test.ts | 64 ++++++++++++- js/tests/setup.ts | 45 ++++++++-- pnpm-lock.yaml | 1 + .../code_interpreter_async.py | 54 ++++++----- .../code_interpreter_sync.py | 50 ++++++----- python/tests/async/test_async_basic.py | 10 +++ python/tests/async/test_async_contexts.py | 65 ++++++++++++++ python/tests/conftest.py | 89 ++++++++++--------- python/tests/sync/test_basic.py | 10 +++ python/tests/sync/test_contexts.py | 58 ++++++++++++ 13 files changed, 404 insertions(+), 113 deletions(-) create mode 100644 .changeset/fast-dogs-brush.md diff --git a/.changeset/fast-dogs-brush.md b/.changeset/fast-dogs-brush.md new file mode 100644 index 00000000..74bc63ff --- /dev/null +++ b/.changeset/fast-dogs-brush.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': patch +'@e2b/code-interpreter': patch +--- + +secure traffic access diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index 0a87d20f..a02b9d9e 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -223,6 +223,10 @@ export class Sandbox extends BaseSandbox { const headers: Record = { 'Content-Type': 'application/json', } + + if (this.trafficAccessToken) { + headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken + } if (this.envdAccessToken) { headers['X-Access-Token'] = this.envdAccessToken } @@ -296,12 +300,17 @@ export class Sandbox extends BaseSandbox { */ async createCodeContext(opts?: CreateCodeContextOpts): Promise { try { + const headers: Record = { + 'Content-Type': 'application/json', + } + + if (this.trafficAccessToken) { + headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken + } + const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...this.connectionConfig.headers, - }, + headers, body: JSON.stringify({ language: opts?.language, cwd: opts?.cwd, @@ -331,12 +340,17 @@ export class Sandbox extends BaseSandbox { async removeCodeContext(context: Context | string): Promise { try { const id = typeof context === 'string' ? context : context.id + const headers: Record = { + 'Content-Type': 'application/json', + } + + if (this.trafficAccessToken) { + headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken + } + const res = await fetch(`${this.jupyterUrl}/contexts/${id}`, { method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - ...this.connectionConfig.headers, - }, + headers, keepalive: true, signal: this.connectionConfig.getSignal( this.connectionConfig.requestTimeoutMs @@ -359,12 +373,17 @@ export class Sandbox extends BaseSandbox { */ async listCodeContexts(): Promise { try { + const headers: Record = { + 'Content-Type': 'application/json', + } + + if (this.trafficAccessToken) { + headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken + } + const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'GET', - headers: { - 'Content-Type': 'application/json', - ...this.connectionConfig.headers, - }, + headers, keepalive: true, signal: this.connectionConfig.getSignal( this.connectionConfig.requestTimeoutMs @@ -392,12 +411,17 @@ export class Sandbox extends BaseSandbox { async restartCodeContext(context: Context | string): Promise { try { const id = typeof context === 'string' ? context : context.id + const headers: Record = { + 'Content-Type': 'application/json', + } + + if (this.trafficAccessToken) { + headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken + } + const res = await fetch(`${this.jupyterUrl}/contexts/${id}/restart`, { method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...this.connectionConfig.headers, - }, + headers, keepalive: true, signal: this.connectionConfig.getSignal( this.connectionConfig.requestTimeoutMs diff --git a/js/tests/basic.test.ts b/js/tests/basic.test.ts index c0360d02..2f0b9837 100644 --- a/js/tests/basic.test.ts +++ b/js/tests/basic.test.ts @@ -1,9 +1,14 @@ import { expect } from 'vitest' - -import { sandboxTest } from './setup' +import { isDebug, sandboxTest, secureSandboxTest } from './setup' sandboxTest('basic', async ({ sandbox }) => { const result = await sandbox.runCode('x =1; x') expect(result.text).toEqual('1') }) + +secureSandboxTest.skipIf(isDebug)('secure access', async ({ sandbox }) => { + const result = await sandbox.runCode('x =1; x') + + expect(result.text).toEqual('1') +}) diff --git a/js/tests/contexts.test.ts b/js/tests/contexts.test.ts index 7dda2090..b0cf9567 100644 --- a/js/tests/contexts.test.ts +++ b/js/tests/contexts.test.ts @@ -1,6 +1,6 @@ import { expect } from 'vitest' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest, secureSandboxTest } from './setup' sandboxTest('create context with no options', async ({ sandbox }) => { const context = await sandbox.createCodeContext() @@ -61,3 +61,65 @@ sandboxTest('restart context', async ({ sandbox }) => { expect(execution.error?.name).toBe('NameError') expect(execution.error?.value).toBe("name 'x' is not defined") }) + +secureSandboxTest.skipIf(isDebug)( + 'create context (secure traffic)', + async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + const contexts = await sandbox.listCodeContexts() + const lastContext = contexts[contexts.length - 1] + + expect(lastContext.id).toBe(context.id) + expect(lastContext.language).toBe(context.language) + expect(lastContext.cwd).toBe(context.cwd) + } +) + +secureSandboxTest.skipIf(isDebug)( + 'remove context (secure traffic)', + async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + await sandbox.removeCodeContext(context.id) + const contexts = await sandbox.listCodeContexts() + + expect(contexts.map((context) => context.id)).not.toContain(context.id) + + await sandbox.kill() + } +) + +secureSandboxTest.skipIf(isDebug)( + 'list contexts (secure traffic)', + async ({ sandbox }) => { + const contexts = await sandbox.listCodeContexts() + + // default contexts should include python and javascript + expect(contexts.map((context) => context.language)).toContain('python') + expect(contexts.map((context) => context.language)).toContain('javascript') + + await sandbox.kill() + } +) + +secureSandboxTest.skipIf(isDebug)( + 'restart context (secure traffic)', + async ({ sandbox }) => { + const context = await sandbox.createCodeContext() + + // set a variable in the context + await sandbox.runCode('x = 1', { context: context }) + + // restart the context + await sandbox.restartCodeContext(context.id) + + // check that the variable no longer exists + const execution = await sandbox.runCode('x', { context: context }) + + // check for an NameError with message "name 'x' is not defined" + expect(execution.error).toBeDefined() + expect(execution.error?.name).toBe('NameError') + expect(execution.error?.value).toBe("name 'x' is not defined") + } +) diff --git a/js/tests/setup.ts b/js/tests/setup.ts index b11ce4fa..2f4be79c 100644 --- a/js/tests/setup.ts +++ b/js/tests/setup.ts @@ -1,21 +1,31 @@ -import { Sandbox } from '../src' import { test as base } from 'vitest' - -const timeoutMs = 60_000 - -const template = process.env.E2B_TESTS_TEMPLATE || 'code-interpreter-v1' +import { Sandbox, SandboxOpts } from '../src' interface SandboxFixture { sandbox: Sandbox template: string + sandboxTestId: string + sandboxOpts: Partial } +const template = process.env.E2B_TESTS_TEMPLATE || 'code-interpreter-v1' + export const sandboxTest = base.extend({ - sandbox: [ + template, + sandboxTestId: [ // eslint-disable-next-line no-empty-pattern async ({}, use) => { + const id = `test-${generateRandomString()}` + await use(id) + }, + { auto: true }, + ], + sandboxOpts: {}, + sandbox: [ + async ({ sandboxTestId, sandboxOpts }, use) => { const sandbox = await Sandbox.create(template, { - timeoutMs, + metadata: { sandboxTestId }, + ...sandboxOpts, }) try { await use(sandbox) @@ -31,13 +41,30 @@ export const sandboxTest = base.extend({ } } }, - { auto: true }, + { auto: false }, ], - template, }) export const isDebug = process.env.E2B_DEBUG !== undefined +export const isIntegrationTest = process.env.E2B_INTEGRATION_TEST !== undefined + +export const secureSandboxTest = sandboxTest.extend({ + sandboxOpts: { + secure: true, + network: { + allowPublicTraffic: false, + }, + }, +}) + +function generateRandomString(length: number = 8): string { + return Math.random() + .toString(36) + .substring(2, length + 2) +} export async function wait(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)) } + +export { template } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e3f8587..c1caf8b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1575,6 +1575,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 98f59dd0..de938240 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -190,12 +190,15 @@ async def run_code( timeout = None if timeout == 0 else (timeout or DEFAULT_TIMEOUT) request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None - - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers = { + "Content-Type": "application/json", + } + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + async with self._client.stream( "POST", f"{self._jupyter_url}/execute", @@ -253,11 +256,13 @@ async def create_code_context( if cwd: data["cwd"] = cwd - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers = { + "Content-Type": "application/json", + } + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = await self._client.post( f"{self._jupyter_url}/contexts", headers=headers, @@ -287,11 +292,13 @@ async def remove_code_context( """ context_id = context.id if isinstance(context, Context) else context - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers = { + "Content-Type": "application/json", + } + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = await self._client.delete( f"{self._jupyter_url}/contexts/{context_id}", headers=headers, @@ -310,11 +317,13 @@ async def list_code_contexts(self) -> List[Context]: :return: List of contexts. """ - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers = { + "Content-Type": "application/json", + } + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = await self._client.get( f"{self._jupyter_url}/contexts", headers=headers, @@ -342,12 +351,13 @@ async def restart_code_context( :return: None """ context_id = context.id if isinstance(context, Context) else context - - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers = { + "Content-Type": "application/json", + } + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = await self._client.post( f"{self._jupyter_url}/contexts/{context_id}/restart", headers=headers, diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 67492398..3adb2804 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -188,11 +188,13 @@ def run_code( request_timeout = request_timeout or self.connection_config.request_timeout context_id = context.id if context else None - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers: Dict[str, str] = {"Content-Type": "application/json"} + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + with self._client.stream( "POST", f"{self._jupyter_url}/execute", @@ -250,11 +252,13 @@ def create_code_context( if cwd: data["cwd"] = cwd - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers: Dict[str, str] = {"Content-Type": "application/json"} + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = self._client.post( f"{self._jupyter_url}/contexts", json=data, @@ -284,11 +288,13 @@ def remove_code_context( """ context_id = context.id if isinstance(context, Context) else context - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers: Dict[str, str] = {"Content-Type": "application/json"} + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = self._client.delete( f"{self._jupyter_url}/contexts/{context_id}", headers=headers, @@ -307,11 +313,13 @@ def list_code_contexts(self) -> List[Context]: :return: List of contexts. """ - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers: Dict[str, str] = {"Content-Type": "application/json"} + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = self._client.get( f"{self._jupyter_url}/contexts", headers=headers, @@ -340,11 +348,13 @@ def restart_code_context( """ context_id = context.id if isinstance(context, Context) else context - headers: Dict[str, str] = {} - if self._envd_access_token: - headers = {"X-Access-Token": self._envd_access_token} - try: + headers: Dict[str, str] = {"Content-Type": "application/json"} + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token + if self.traffic_access_token: + headers["E2B-Traffic-Access-Token"] = self.traffic_access_token + response = self._client.post( f"{self._jupyter_url}/contexts/{context_id}/restart", headers=headers, diff --git a/python/tests/async/test_async_basic.py b/python/tests/async/test_async_basic.py index 486fd219..cf1b0bb1 100644 --- a/python/tests/async/test_async_basic.py +++ b/python/tests/async/test_async_basic.py @@ -1,6 +1,16 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox async def test_basic(async_sandbox: AsyncSandbox): result = await async_sandbox.run_code("x =1; x") assert result.text == "1" + + +@pytest.mark.skip_debug +async def test_secure_access(async_sandbox_factory): + # Create sandbox with public traffic disabled (secure access) + async_sandbox = await async_sandbox_factory(network={"allow_public_traffic": False}) + result = await async_sandbox.run_code("x =1; x") + assert result.text == "1" diff --git a/python/tests/async/test_async_contexts.py b/python/tests/async/test_async_contexts.py index 6be07734..0f533f8f 100644 --- a/python/tests/async/test_async_contexts.py +++ b/python/tests/async/test_async_contexts.py @@ -1,3 +1,5 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox @@ -60,3 +62,66 @@ async def test_restart_context(async_sandbox: AsyncSandbox): assert execution.error is not None assert execution.error.name == "NameError" assert execution.error.value == "name 'x' is not defined" + + +@pytest.mark.skip_debug +async def test_create_context_secure_traffic(async_sandbox_factory): + async_sandbox = await async_sandbox_factory( + secure=True, network={"allow_public_traffic": False} + ) + context = await async_sandbox.create_code_context() + + contexts = await async_sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +@pytest.mark.skip_debug +async def test_remove_context_secure_traffic(async_sandbox_factory): + async_sandbox = await async_sandbox_factory( + secure=True, network={"allow_public_traffic": False} + ) + context = await async_sandbox.create_code_context() + + await async_sandbox.remove_code_context(context.id) + + contexts = await async_sandbox.list_code_contexts() + assert context.id not in [ctx.id for ctx in contexts] + + +@pytest.mark.skip_debug +async def test_list_contexts_secure_traffic(async_sandbox_factory): + async_sandbox = await async_sandbox_factory( + secure=True, network={"allow_public_traffic": False} + ) + contexts = await async_sandbox.list_code_contexts() + + # default contexts should include python and javascript + languages = [context.language for context in contexts] + assert "python" in languages + assert "javascript" in languages + + +@pytest.mark.skip_debug +async def test_restart_context_secure_traffic(async_sandbox_factory): + async_sandbox = await async_sandbox_factory( + secure=True, network={"allow_public_traffic": False} + ) + context = await async_sandbox.create_code_context() + + # set a variable in the context + await async_sandbox.run_code("x = 1", context=context) + + # restart the context + await async_sandbox.restart_code_context(context.id) + + # check that the variable no longer exists + execution = await async_sandbox.run_code("x", context=context) + + # check for a NameError with message "name 'x' is not defined" + assert execution.error is not None + assert execution.error.name == "NameError" + assert execution.error.value == "name 'x' is not defined" diff --git a/python/tests/conftest.py b/python/tests/conftest.py index bc853e85..a571e00a 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -1,27 +1,18 @@ -import pytest -import pytest_asyncio -import os import asyncio +import os -from logging import warning - -from e2b_code_interpreter.code_interpreter_async import AsyncSandbox -from e2b_code_interpreter.code_interpreter_sync import Sandbox +import pytest -timeout = 60 +from e2b_code_interpreter import ( + AsyncSandbox, + Sandbox, +) +import uuid -# Override the event loop so it never closes during test execution -# This helps with pytest-xdist and prevents "Event loop is closed" errors @pytest.fixture(scope="session") -def event_loop(): - """Create a session-scoped event loop for all async tests.""" - try: - loop = asyncio.get_running_loop() - except RuntimeError: - loop = asyncio.new_event_loop() - yield loop - loop.close() +def sandbox_test_id(): + return f"test_{uuid.uuid4()}" @pytest.fixture() @@ -30,45 +21,58 @@ def template(): @pytest.fixture() -def sandbox(template, debug): - sandbox = Sandbox.create(template, timeout=timeout, debug=debug) +def sandbox_factory(request, template, sandbox_test_id): + def factory(*, template_name: str = template, **kwargs): + kwargs.setdefault("secure", False) + kwargs.setdefault("timeout", 60) + metadata = kwargs.setdefault("metadata", dict()) + metadata.setdefault("sandbox_test_id", sandbox_test_id) + + sandbox = Sandbox.create(template_name, **kwargs) + + request.addfinalizer(lambda: sandbox.kill()) + + return sandbox + + return factory + + +@pytest.fixture() +def sandbox(sandbox_factory): + return sandbox_factory() + + +# override the event loop so it never closes +# this helps us with the global-scoped async http transport +@pytest.fixture(scope="session") +def event_loop(): try: - yield sandbox - finally: - try: - sandbox.kill() - except: # noqa: E722 - if not debug: - warning( - "Failed to kill sandbox — this is expected if the test runs with local envd." - ) + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + yield loop + loop.close() @pytest.fixture -def async_sandbox_factory(request, template, debug, event_loop): - """Factory for creating async sandboxes with proper cleanup.""" +def async_sandbox_factory(request, template, sandbox_test_id, event_loop): + async def factory(*, template_name: str = template, **kwargs): + kwargs.setdefault("timeout", 60) - async def factory(template_override=None, **kwargs): - template_name = template_override or template - kwargs.setdefault("timeout", timeout) - kwargs.setdefault("debug", debug) + metadata = kwargs.setdefault("metadata", dict()) + metadata.setdefault("sandbox_test_id", sandbox_test_id) sandbox = await AsyncSandbox.create(template_name, **kwargs) def kill(): async def _kill(): - try: - await sandbox.kill() - except: # noqa: E722 - if not debug: - warning( - "Failed to kill sandbox — this is expected if the test runs with local envd." - ) + await sandbox.kill() event_loop.run_until_complete(_kill()) request.addfinalizer(kill) + return sandbox return factory @@ -76,7 +80,6 @@ async def _kill(): @pytest.fixture async def async_sandbox(async_sandbox_factory): - """Default async sandbox fixture.""" return await async_sandbox_factory() diff --git a/python/tests/sync/test_basic.py b/python/tests/sync/test_basic.py index 4bfc503d..30f94983 100644 --- a/python/tests/sync/test_basic.py +++ b/python/tests/sync/test_basic.py @@ -1,6 +1,16 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox def test_basic(sandbox: Sandbox): result = sandbox.run_code("x =1; x") assert result.text == "1" + + +@pytest.mark.skip_debug +def test_secure_access(sandbox_factory): + sandbox = sandbox_factory(secure=True, network={"allow_public_traffic": False}) + # Create sandbox with public traffic disabled (secure access) + result = sandbox.run_code("x =1; x") + assert result.text == "1" diff --git a/python/tests/sync/test_contexts.py b/python/tests/sync/test_contexts.py index a7cbd884..0b8278f5 100644 --- a/python/tests/sync/test_contexts.py +++ b/python/tests/sync/test_contexts.py @@ -1,3 +1,5 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox @@ -60,3 +62,59 @@ def test_restart_context(sandbox: Sandbox): assert execution.error is not None assert execution.error.name == "NameError" assert execution.error.value == "name 'x' is not defined" + + +# Secure traffic tests (public traffic disabled) +@pytest.mark.skip_debug +def test_create_context_secure_traffic(sandbox_factory): + sandbox = sandbox_factory(secure=True, network={"allow_public_traffic": False}) + context = sandbox.create_code_context() + + contexts = sandbox.list_code_contexts() + last_context = contexts[-1] + + assert last_context.id == context.id + assert last_context.language == context.language + assert last_context.cwd == context.cwd + + +@pytest.mark.skip_debug +def test_remove_context_secure_traffic(sandbox_factory): + sandbox = sandbox_factory(secure=True, network={"allow_public_traffic": False}) + context = sandbox.create_code_context() + + sandbox.remove_code_context(context.id) + + contexts = sandbox.list_code_contexts() + assert context.id not in [ctx.id for ctx in contexts] + + +@pytest.mark.skip_debug +def test_list_contexts_secure_traffic(sandbox_factory): + sandbox = sandbox_factory(secure=True, network={"allow_public_traffic": False}) + contexts = sandbox.list_code_contexts() + + # default contexts should include python and javascript + languages = [context.language for context in contexts] + assert "python" in languages + assert "javascript" in languages + + +@pytest.mark.skip_debug +def test_restart_context_secure_traffic(sandbox_factory): + sandbox = sandbox_factory(secure=True, network={"allow_public_traffic": False}) + context = sandbox.create_code_context() + + # set a variable in the context + sandbox.run_code("x = 1", context=context) + + # restart the context + sandbox.restart_code_context(context.id) + + # check that the variable no longer exists + execution = sandbox.run_code("x", context=context) + + # check for a NameError with message "name 'x' is not defined" + assert execution.error is not None + assert execution.error.name == "NameError" + assert execution.error.value == "name 'x' is not defined" From b07dc448d821b88c403cbf086fa5bc67e2114148 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 26 Nov 2025 18:12:44 +0000 Subject: [PATCH 628/722] [skip ci] Release new versions --- .changeset/fast-dogs-brush.md | 6 - js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- .../v2.3.1/charts/page.mdx | 240 +++++ .../v2.3.1/consts/page.mdx | 13 + .../v2.3.1/index/page.mdx | 103 +++ .../v2.3.1/messaging/page.mdx | 326 +++++++ .../v2.3.1/sandbox/page.mdx | 366 ++++++++ .../v2.4.1/sandbox/page.mdx | 819 ++++++++++++++++++ 10 files changed, 1870 insertions(+), 9 deletions(-) delete mode 100644 .changeset/fast-dogs-brush.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx create mode 100644 sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx diff --git a/.changeset/fast-dogs-brush.md b/.changeset/fast-dogs-brush.md deleted file mode 100644 index 74bc63ff..00000000 --- a/.changeset/fast-dogs-brush.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': patch -'@e2b/code-interpreter': patch ---- - -secure traffic access diff --git a/js/package.json b/js/package.json index 223cb1ca..9091a24b 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.3.0", + "version": "2.3.1", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 8320fc5d..0972551b 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.4.0", + "version": "2.4.1", "packageManager": "pnpm@9.15.5", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 6d84f0d2..6896147c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.4.0" +version = "2.4.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx new file mode 100644 index 00000000..93c26893 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx @@ -0,0 +1,366 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### listCodeContexts() + +```ts +listCodeContexts(): Promise +``` + +List all contexts. + +###### Returns + +`Promise`\<`Context`[]\> + +list of contexts. + +### removeCodeContext() + +```ts +removeCodeContext(context: string | Context): Promise +``` + +Removes a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to remove. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### restartCodeContext() + +```ts +restartCodeContext(context: string | Context): Promise +``` + +Restart a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to restart. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx new file mode 100644 index 00000000..d6466bf3 --- /dev/null +++ b/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx @@ -0,0 +1,819 @@ + + + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + +### remove\_code\_context + +```python +def remove_code_context(context: Union[Context, str]) -> None +``` + +Removes a context. + +**Arguments**: + +- `context`: Context to remove. Can be a Context object or a context ID string. + +**Returns**: + +None + + +### list\_code\_contexts + +```python +def list_code_contexts() -> List[Context] +``` + +List all contexts. + +**Returns**: + +List of contexts. + + +### restart\_code\_context + +```python +def restart_code_context(context: Union[Context, str]) -> None +``` + +Restart a context. + +**Arguments**: + +- `context`: Context to restart. Can be a Context object or a context ID string. + +**Returns**: + +None + + + + + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + +## AsyncSandbox + +```python +class AsyncSandbox(BaseAsyncSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `AsyncSandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import AsyncSandbox +sandbox = await AsyncSandbox.create() +``` + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +async def run_code( + code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, + on_result: Optional[OutputHandlerWithAsync[Result]] = None, + on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +async def create_code_context( + cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + +### remove\_code\_context + +```python +async def remove_code_context(context: Union[Context, str]) -> None +``` + +Removes a context. + +**Arguments**: + +- `context`: Context to remove. Can be a Context object or a context ID string. + +**Returns**: + +None + + +### list\_code\_contexts + +```python +async def list_code_contexts() -> List[Context] +``` + +List all contexts. + +**Returns**: + +List of contexts. + + +### restart\_code\_context + +```python +async def restart_code_context(context: Union[Context, str]) -> None +``` + +Restart a context. + +**Arguments**: + +- `context`: Context to restart. Can be a Context object or a context ID string. + +**Returns**: + +None + + + + +## OutputMessage + +```python +@dataclass +class OutputMessage() +``` + +Represents an output message from the sandbox code execution. + + +### line + +The output line. + + +### timestamp + +Unix epoch in nanoseconds + + +### error + +Whether the output is an error. + + +## ExecutionError + +```python +@dataclass +class ExecutionError() +``` + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + + +### name + +Name of the error. + + +### value + +Value of the error. + + +### traceback + +The raw traceback of the error. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Error object. + + +## MIMEType + +```python +class MIMEType(str) +``` + +Represents a MIME type. + + +## Result + +```python +@dataclass +class Result() +``` + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + + +### is\_main\_result + +Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. + + +### extra + +Extra data that can be included. Not part of the standard types. + + +### formats + +```python +def formats() -> Iterable[str] +``` + +Returns all available formats of the result. + +**Returns**: + +All available formats of the result in MIME types. + + +### \_\_str\_\_ + +```python +def __str__() -> Optional[str] +``` + +Returns the text representation of the data. + +**Returns**: + +The text representation of the data. + + +### \_repr\_html\_ + +```python +def _repr_html_() -> Optional[str] +``` + +Returns the HTML representation of the data. + +**Returns**: + +The HTML representation of the data. + + +### \_repr\_markdown\_ + +```python +def _repr_markdown_() -> Optional[str] +``` + +Returns the Markdown representation of the data. + +**Returns**: + +The Markdown representation of the data. + + +### \_repr\_svg\_ + +```python +def _repr_svg_() -> Optional[str] +``` + +Returns the SVG representation of the data. + +**Returns**: + +The SVG representation of the data. + + +### \_repr\_png\_ + +```python +def _repr_png_() -> Optional[str] +``` + +Returns the base64 representation of the PNG data. + +**Returns**: + +The base64 representation of the PNG data. + + +### \_repr\_jpeg\_ + +```python +def _repr_jpeg_() -> Optional[str] +``` + +Returns the base64 representation of the JPEG data. + +**Returns**: + +The base64 representation of the JPEG data. + + +### \_repr\_pdf\_ + +```python +def _repr_pdf_() -> Optional[str] +``` + +Returns the PDF representation of the data. + +**Returns**: + +The PDF representation of the data. + + +### \_repr\_latex\_ + +```python +def _repr_latex_() -> Optional[str] +``` + +Returns the LaTeX representation of the data. + +**Returns**: + +The LaTeX representation of the data. + + +### \_repr\_json\_ + +```python +def _repr_json_() -> Optional[dict] +``` + +Returns the JSON representation of the data. + +**Returns**: + +The JSON representation of the data. + + +### \_repr\_javascript\_ + +```python +def _repr_javascript_() -> Optional[str] +``` + +Returns the JavaScript representation of the data. + +**Returns**: + +The JavaScript representation of the data. + + +## Logs + +```python +@dataclass(repr=False) +class Logs() +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + + +### stdout + +List of strings printed to stdout by prints, subprocesses, etc. + + +### stderr + +List of strings printed to stderr by prints, subprocesses, etc. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Logs object. + + +### serialize\_results + +```python +def serialize_results(results: List[Result]) -> List[Dict[str, str]] +``` + +Serializes the results to JSON. + + +## Execution + +```python +@dataclass(repr=False) +class Execution() +``` + +Represents the result of a cell execution. + + +### results + +List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). + + +### logs + +Logs printed to stdout and stderr during execution. + + +### error + +Error object if an error occurred, None otherwise. + + +### execution\_count + +Execution count of the cell. + + +### text + +```python +@property +def text() -> Optional[str] +``` + +Returns the text representation of the result. + +**Returns**: + +The text representation of the result. + + +### to\_json + +```python +def to_json() -> str +``` + +Returns the JSON representation of the Execution object. + + +## Context + +```python +@dataclass +class Context() +``` + +Represents a context for code execution. + + +### id + +The ID of the context. + + +### language + +The language of the context. + + +### cwd + +The working directory of the context. + From 867e191422dac6ca6699a0865c92a9c6e381bc95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 06:15:59 -0800 Subject: [PATCH 629/722] Bump fonttools (#182) Bumps the pip group with 1 update in the /chart_data_extractor directory: [fonttools](https://github.com/fonttools/fonttools). Updates `fonttools` from 4.54.1 to 4.61.0 - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.54.1...4.61.0) --- updated-dependencies: - dependency-name: fonttools dependency-version: 4.61.0 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- chart_data_extractor/poetry.lock | 115 ++++++++++++++++--------------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index d1df466b..2bbbf086 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -133,7 +133,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -144,74 +144,75 @@ test = ["pytest (>=6)"] [[package]] name = "fonttools" -version = "4.54.1" +version = "4.61.0" description = "Tools to manipulate font files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, - {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, - {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, - {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, - {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, - {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, - {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, - {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, - {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, - {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, - {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, - {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, - {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, - {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, - {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, - {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, - {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, - {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, + {file = "fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33"}, + {file = "fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0"}, + {file = "fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727"}, + {file = "fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219"}, + {file = "fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52"}, + {file = "fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72"}, + {file = "fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b"}, + {file = "fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76"}, + {file = "fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3"}, + {file = "fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d"}, + {file = "fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a"}, + {file = "fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5"}, + {file = "fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d"}, + {file = "fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd"}, + {file = "fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865"}, + {file = "fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028"}, + {file = "fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef"}, + {file = "fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87"}, + {file = "fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a"}, + {file = "fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af"}, + {file = "fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810"}, + {file = "fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f"}, + {file = "fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044"}, + {file = "fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac"}, + {file = "fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433"}, + {file = "fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f"}, + {file = "fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b"}, + {file = "fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb"}, + {file = "fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d"}, + {file = "fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0"}, + {file = "fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34"}, + {file = "fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a"}, + {file = "fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01"}, + {file = "fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa"}, + {file = "fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216"}, + {file = "fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee"}, + {file = "fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d"}, + {file = "fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda"}, + {file = "fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85"}, + {file = "fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9"}, + {file = "fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a"}, + {file = "fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195"}, + {file = "fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05"}, + {file = "fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486"}, + {file = "fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe"}, + {file = "fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866"}, + {file = "fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8"}, + {file = "fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1"}, + {file = "fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635"}, + {file = "fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] @@ -843,7 +844,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, From e61c98539e1ab73cedd9b6c824880f521084e85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 4 Dec 2025 18:52:01 +0100 Subject: [PATCH 630/722] Dependencies update (#183) * Update e2b * Update js-yaml * Add changeset --- .changeset/funny-peas-grow.md | 5 ++++ js/package.json | 2 +- pnpm-lock.yaml | 46 +++++++++++++++++------------------ 3 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 .changeset/funny-peas-grow.md diff --git a/.changeset/funny-peas-grow.md b/.changeset/funny-peas-grow.md new file mode 100644 index 00000000..3d46c066 --- /dev/null +++ b/.changeset/funny-peas-grow.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Update dependencies diff --git a/js/package.json b/js/package.json index 9091a24b..567acc49 100644 --- a/js/package.json +++ b/js/package.json @@ -74,6 +74,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.7.0" + "e2b": "^2.8.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1caf8b3..f6b3429b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.7.0 - version: 2.7.0 + specifier: ^2.8.3 + version: 2.8.3 devDependencies: '@types/node': specifier: ^20.19.19 @@ -880,8 +880,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.7.0: - resolution: {integrity: sha512-pbCbkkdkkY+yIhhtdSE7lM/vhIROtHNI0hNpj8lBphDILNH2qmmjhxU7/wam8/xWRbiWbfuQaOsv100lD32nag==} + e2b@2.8.3: + resolution: {integrity: sha512-P0hA5UceZ6HVfL9VDqQ0VG+IXZTy1K+FHek3xFkg7vSgcBm6wV9KG/YcvaoEdgiF+n1KS2TsIhunLs22jbrLyQ==} engines: {node: '>=20'} eastasianwidth@0.2.0: @@ -1062,8 +1062,8 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} hasBin: true @@ -1172,8 +1172,8 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true json-buffer@3.0.1: @@ -1285,8 +1285,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -1639,8 +1639,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.5.1: - resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} text-table@0.2.0: @@ -2064,7 +2064,7 @@ snapshots: globals: 13.24.0 ignore: 5.3.1 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -2682,7 +2682,7 @@ snapshots: dotenv@16.4.7: {} - e2b@2.7.0: + e2b@2.8.3: dependencies: '@bufbuild/protobuf': 2.9.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) @@ -2690,10 +2690,10 @@ snapshots: chalk: 5.6.2 compare-versions: 6.1.1 dockerfile-ast: 0.7.1 - glob: 11.0.3 + glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.1 + tar: 7.5.2 eastasianwidth@0.2.0: {} @@ -2795,7 +2795,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -2921,11 +2921,11 @@ snapshots: minipass: 7.1.2 path-scurry: 1.10.1 - glob@11.0.3: + glob@11.1.0: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -3035,7 +3035,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -3062,7 +3062,7 @@ snapshots: enhanced-resolve: 5.18.1 fast-glob: 3.3.3 jiti: 2.4.2 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimist: 1.2.8 picocolors: 1.1.1 picomatch: 4.0.2 @@ -3164,7 +3164,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@10.0.3: + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -3486,7 +3486,7 @@ snapshots: tapable@2.2.1: {} - tar@7.5.1: + tar@7.5.2: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 From 3bbe83e61d760e9ae51da2c756b0503fb3299308 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Dec 2025 17:53:51 +0000 Subject: [PATCH 631/722] [skip ci] Release new versions --- .changeset/funny-peas-grow.md | 5 - js/package.json | 2 +- .../v2.3.2/charts/page.mdx | 240 ++++++++++++ .../v2.3.2/consts/page.mdx | 13 + .../v2.3.2/index/page.mdx | 103 +++++ .../v2.3.2/messaging/page.mdx | 326 ++++++++++++++++ .../v2.3.2/sandbox/page.mdx | 366 ++++++++++++++++++ 7 files changed, 1049 insertions(+), 6 deletions(-) delete mode 100644 .changeset/funny-peas-grow.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx diff --git a/.changeset/funny-peas-grow.md b/.changeset/funny-peas-grow.md deleted file mode 100644 index 3d46c066..00000000 --- a/.changeset/funny-peas-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Update dependencies diff --git a/js/package.json b/js/package.json index 567acc49..8e8c4adc 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.3.1", + "version": "2.3.2", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx new file mode 100644 index 00000000..93c26893 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx @@ -0,0 +1,366 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### listCodeContexts() + +```ts +listCodeContexts(): Promise +``` + +List all contexts. + +###### Returns + +`Promise`\<`Context`[]\> + +list of contexts. + +### removeCodeContext() + +```ts +removeCodeContext(context: string | Context): Promise +``` + +Removes a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to remove. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### restartCodeContext() + +```ts +restartCodeContext(context: string | Context): Promise +``` + +Restart a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to restart. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | From 68efcac2af36cc1657bfdea9c0fb55533782dec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 4 Dec 2025 19:44:03 +0100 Subject: [PATCH 632/722] Dependencies update (#184) * Add changeset * Update js-yaml and mdast-util-to-hast * Update vitest --- .changeset/funny-peas-grow.md | 5 + js/package.json | 2 +- pnpm-lock.yaml | 231 ++++++++++++++++++++++------------ 3 files changed, 155 insertions(+), 83 deletions(-) create mode 100644 .changeset/funny-peas-grow.md diff --git a/.changeset/funny-peas-grow.md b/.changeset/funny-peas-grow.md new file mode 100644 index 00000000..3d46c066 --- /dev/null +++ b/.changeset/funny-peas-grow.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter': patch +--- + +Update dependencies diff --git a/js/package.json b/js/package.json index 8e8c4adc..0b91f7d0 100644 --- a/js/package.json +++ b/js/package.json @@ -47,7 +47,7 @@ "typedoc": "0.26.8", "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.5.3", - "vitest": "^3.0.9" + "vitest": "^3.2.4" }, "files": [ "dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6b3429b..8be72f54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,8 +76,8 @@ importers: specifier: ^5.5.3 version: 5.7.3 vitest: - specifier: ^3.0.9 - version: 3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + specifier: ^3.2.4 + version: 3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -511,6 +511,12 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} @@ -657,34 +663,34 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.1.1': - resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.1': - resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.1': - resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.1': - resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.1': - resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.1.1': - resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.1.1': - resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -848,6 +854,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -907,8 +922,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} @@ -998,8 +1013,9 @@ packages: fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1168,8 +1184,11 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true js-yaml@4.1.1: @@ -1234,6 +1253,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} @@ -1256,8 +1278,8 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -1435,6 +1457,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -1623,6 +1649,9 @@ packages: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1663,16 +1692,20 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -1783,13 +1816,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.1: - resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.7: - resolution: {integrity: sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1828,16 +1861,16 @@ packages: yaml: optional: true - vitest@3.1.1: - resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.1 - '@vitest/ui': 3.1.1 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1949,7 +1982,7 @@ snapshots: '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 - js-yaml: 3.14.1 + js-yaml: 3.14.2 '@changesets/read@0.6.2': dependencies: @@ -2283,6 +2316,13 @@ snapshots: - supports-color - typescript + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.7 @@ -2479,44 +2519,46 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.1.1': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.1.1 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) - '@vitest/pretty-format@3.1.1': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.1': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/snapshot@3.1.1': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.1': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.4 - '@vitest/utils@3.1.1': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 acorn-jsx@5.3.2(acorn@8.15.0): @@ -2652,6 +2694,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -2716,7 +2762,7 @@ snapshots: entities@4.5.0: {} - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} esbuild@0.25.0: optionalDependencies: @@ -2853,9 +2899,9 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 file-entry-cache@6.0.1: dependencies: @@ -2966,7 +3012,7 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 property-information: 7.0.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 @@ -3030,7 +3076,9 @@ snapshots: joycon@3.1.1: {} - js-yaml@3.14.1: + js-tokens@9.0.1: {} + + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 @@ -3103,6 +3151,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.2.1: {} + lru-cache@10.2.0: {} lru-cache@11.2.2: {} @@ -3126,7 +3176,7 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -3293,6 +3343,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pirates@4.0.6: {} @@ -3332,7 +3384,7 @@ snapshots: read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 @@ -3468,6 +3520,10 @@ snapshots: strip-json-comments@5.0.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -3510,14 +3566,19 @@ snapshots: tinyglobby@0.2.12: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - tinypool@1.0.2: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.4: {} to-regex-range@5.0.1: dependencies: @@ -3632,13 +3693,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.3 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3653,38 +3714,44 @@ snapshots: - tsx - yaml - vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.0 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.3 rollup: 4.39.0 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.19 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vitest@3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0)) - '@vitest/pretty-format': 3.1.1 - '@vitest/runner': 3.1.1 - '@vitest/snapshot': 3.1.1 - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.3 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.7(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.1.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.19 From 68adc694a6feee129be2d9991c3d9b50d9d26f89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Dec 2025 18:45:52 +0000 Subject: [PATCH 633/722] [skip ci] Release new versions --- .changeset/funny-peas-grow.md | 5 - js/package.json | 2 +- .../v2.3.3/charts/page.mdx | 240 ++++++++++++ .../v2.3.3/consts/page.mdx | 13 + .../v2.3.3/index/page.mdx | 103 +++++ .../v2.3.3/messaging/page.mdx | 326 ++++++++++++++++ .../v2.3.3/sandbox/page.mdx | 366 ++++++++++++++++++ 7 files changed, 1049 insertions(+), 6 deletions(-) delete mode 100644 .changeset/funny-peas-grow.md create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx create mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx diff --git a/.changeset/funny-peas-grow.md b/.changeset/funny-peas-grow.md deleted file mode 100644 index 3d46c066..00000000 --- a/.changeset/funny-peas-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter': patch ---- - -Update dependencies diff --git a/js/package.json b/js/package.json index 0b91f7d0..a37f337d 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.3.2", + "version": "2.3.3", "packageManager": "pnpm@9.15.5", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx new file mode 100644 index 00000000..f3176d3b --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx @@ -0,0 +1,240 @@ +### ChartType + +Chart types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `BAR` | `"bar"` | +| `BOX_AND_WHISKER` | `"box_and_whisker"` | +| `LINE` | `"line"` | +| `PIE` | `"pie"` | +| `SCATTER` | `"scatter"` | +| `SUPERCHART` | `"superchart"` | +| `UNKNOWN` | `"unknown"` | + +*** + +### ScaleType + +Ax scale types + +#### Enumeration Members + +| Enumeration Member | Value | +| ------ | ------ | +| `ASINH` | `"asinh"` | +| `CATEGORICAL` | `"categorical"` | +| `DATETIME` | `"datetime"` | +| `FUNCTION` | `"function"` | +| `FUNCTIONLOG` | `"functionlog"` | +| `LINEAR` | `"linear"` | +| `LOG` | `"log"` | +| `LOGIT` | `"logit"` | +| `SYMLOG` | `"symlog"` | + +## Type Aliases + +### BarChart + +```ts +type BarChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BarData`[] | +| `type` | `ChartType.BAR` | + +*** + +### BarData + +```ts +type BarData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `group` | `string` | +| `label` | `string` | +| `value` | `string` | + +*** + +### BoxAndWhiskerChart + +```ts +type BoxAndWhiskerChart: Chart2D & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `BoxAndWhiskerData`[] | +| `type` | `ChartType.BOX_AND_WHISKER` | + +*** + +### BoxAndWhiskerData + +```ts +type BoxAndWhiskerData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `first_quartile` | `number` | +| `label` | `string` | +| `max` | `number` | +| `median` | `number` | +| `min` | `number` | +| `outliers` | `number`[] | +| `third_quartile` | `number` | + +*** + +### Chart + +```ts +type Chart: object; +``` + +Represents a chart. + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `any`[] | +| `title` | `string` | +| `type` | `ChartType` | + +*** + +### ChartTypes + +```ts +type ChartTypes: + | LineChart + | ScatterChart + | BarChart + | PieChart + | BoxAndWhiskerChart + | SuperChart; +``` + +*** + +### LineChart + +```ts +type LineChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.LINE` | + +*** + +### PieChart + +```ts +type PieChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `PieData`[] | +| `type` | `ChartType.PIE` | + +*** + +### PieData + +```ts +type PieData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `angle` | `number` | +| `label` | `string` | +| `radius` | `number` | + +*** + +### PointData + +```ts +type PointData: object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `label` | `string` | +| `points` | [`number` \| `string`, `number` \| `string`][] | + +*** + +### ScatterChart + +```ts +type ScatterChart: PointChart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `type` | `ChartType.SCATTER` | + +*** + +### SuperChart + +```ts +type SuperChart: Chart & object; +``` + +#### Type declaration + +| Name | Type | +| ------ | ------ | +| `elements` | `Chart`[] | +| `type` | `ChartType.SUPERCHART` | + +## Functions + +### deserializeChart() + +```ts +function deserializeChart(data: any): Chart +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `any` | + +#### Returns + +`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx new file mode 100644 index 00000000..d1ee2e76 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx @@ -0,0 +1,13 @@ +### DEFAULT\_TIMEOUT\_MS + +```ts +const DEFAULT_TIMEOUT_MS: 60000 = 60_000; +``` + +*** + +### JUPYTER\_PORT + +```ts +const JUPYTER_PORT: 49999 = 49999; +``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx new file mode 100644 index 00000000..dc55fcc7 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx @@ -0,0 +1,103 @@ +### BarChart + +Re-exports BarChart + +### BarData + +Re-exports BarData + +### BoxAndWhiskerChart + +Re-exports BoxAndWhiskerChart + +### BoxAndWhiskerData + +Re-exports BoxAndWhiskerData + +### Chart + +Re-exports Chart + +### ChartType + +Re-exports ChartType + +### ChartTypes + +Re-exports ChartTypes + +### Context + +Re-exports Context + +### CreateCodeContextOpts + +Re-exports CreateCodeContextOpts + +### default + +Renames and re-exports Sandbox + +### Execution + +Re-exports Execution + +### ExecutionError + +Re-exports ExecutionError + +### LineChart + +Re-exports LineChart + +### Logs + +Re-exports Logs + +### MIMEType + +Re-exports MIMEType + +### OutputMessage + +Re-exports OutputMessage + +### PieChart + +Re-exports PieChart + +### PieData + +Re-exports PieData + +### PointData + +Re-exports PointData + +### RawData + +Re-exports RawData + +### Result + +Re-exports Result + +### RunCodeOpts + +Re-exports RunCodeOpts + +### Sandbox + +Re-exports Sandbox + +### ScaleType + +Re-exports ScaleType + +### ScatterChart + +Re-exports ScatterChart + +### SuperChart + +Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx new file mode 100644 index 00000000..4b3c4ed9 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx @@ -0,0 +1,326 @@ +### Execution + +Represents the result of a cell execution. + +#### Constructors + +```ts +new Execution( + results: Result[], + logs: Logs, + error?: ExecutionError, + executionCount?: number): Execution +``` + +###### Parameters + +| Parameter | Type | Default value | Description | +| ------ | ------ | ------ | ------ | +| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | +| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | +| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount`? | `number` | `undefined` | Execution count of the cell. | + +###### Returns + +`Execution` + +#### Properties + +| Property | Modifier | Type | Default value | Description | +| ------ | ------ | ------ | ------ | ------ | +| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | +| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | +| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | +| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | + +#### Accessors + +### text + +```ts +get text(): undefined | string +``` + +Returns the text representation of the main result of the cell. + +###### Returns + +`undefined` \| `string` + +#### Methods + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the execution result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `error` | `undefined` \| `ExecutionError` | +| `logs` | `Logs` | +| `results` | `Result`[] | + +*** + +### ExecutionError + +Represents an error that occurred during the execution of a cell. +The error contains the name of the error, the value of the error, and the traceback. + +#### Constructors + +```ts +new ExecutionError( + name: string, + value: string, + traceback: string): ExecutionError +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `name` | `string` | Name of the error. | +| `value` | `string` | Value of the error. | +| `traceback` | `string` | The raw traceback of the error. | + +###### Returns + +`ExecutionError` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `name` | `public` | `string` | Name of the error. | +| `traceback` | `public` | `string` | The raw traceback of the error. | +| `value` | `public` | `string` | Value of the error. | + +*** + +### OutputMessage + +Represents an output message from the sandbox code execution. + +#### Constructors + +```ts +new OutputMessage( + line: string, + timestamp: number, + error: boolean): OutputMessage +``` + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `line` | `string` | The output line. | +| `timestamp` | `number` | Unix epoch in nanoseconds. | +| `error` | `boolean` | Whether the output is an error. | + +###### Returns + +`OutputMessage` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `error` | `readonly` | `boolean` | Whether the output is an error. | +| `line` | `readonly` | `string` | The output line. | +| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | + +#### Methods + +### toString() + +```ts +toString(): string +``` + +###### Returns + +`string` + +*** + +### Result + +Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. +The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics + +The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented +as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, +for the actual result the representation is always present for the result, the other representations are always optional. + +#### Constructors + +```ts +new Result(rawData: RawData, isMainResult: boolean): Result +``` + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `rawData` | `RawData` | +| `isMainResult` | `boolean` | + +###### Returns + +`Result` + +#### Properties + +| Property | Modifier | Type | Description | +| ------ | ------ | ------ | ------ | +| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | +| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | +| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | +| `html?` | `readonly` | `string` | HTML representation of the data. | +| `isMainResult` | `readonly` | `boolean` | - | +| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | +| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | +| `json?` | `readonly` | `string` | JSON representation of the data. | +| `latex?` | `readonly` | `string` | LaTeX representation of the data. | +| `markdown?` | `readonly` | `string` | Markdown representation of the data. | +| `pdf?` | `readonly` | `string` | PDF representation of the data. | +| `png?` | `readonly` | `string` | PNG representation of the data. | +| `raw` | `readonly` | `RawData` | - | +| `svg?` | `readonly` | `string` | SVG representation of the data. | +| `text?` | `readonly` | `string` | Text representation of the result. | + +#### Methods + +### formats() + +```ts +formats(): string[] +``` + +Returns all the formats available for the result. + +###### Returns + +`string`[] + +Array of strings representing the formats available for the result. + +### toJSON() + +```ts +toJSON(): object +``` + +Returns the serializable representation of the result. + +###### Returns + +`object` + +| Name | Type | +| ------ | ------ | +| `extra`? | `any` | +| `html` | `undefined` \| `string` | +| `javascript` | `undefined` \| `string` | +| `jpeg` | `undefined` \| `string` | +| `json` | `undefined` \| `string` | +| `latex` | `undefined` \| `string` | +| `markdown` | `undefined` \| `string` | +| `pdf` | `undefined` \| `string` | +| `png` | `undefined` \| `string` | +| `svg` | `undefined` \| `string` | +| `text` | `undefined` \| `string` | + +## Type Aliases + +### Logs + +```ts +type Logs: object; +``` + +Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | +| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | + +*** + +### MIMEType + +```ts +type MIMEType: string; +``` + +Represents a MIME type. + +*** + +### RawData + +```ts +type RawData: object & E2BData; +``` + +Dictionary that maps MIME types to their corresponding representations of the data. + +## Functions + +### extractError() + +```ts +function extractError(res: Response): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `res` | `Response` | + +#### Returns + +`Promise`\<`undefined` \| `SandboxError`\> + +*** + +### parseOutput() + +```ts +function parseOutput( + execution: Execution, + line: string, + onStdout?: (output: OutputMessage) => any, + onStderr?: (output: OutputMessage) => any, + onResult?: (data: Result) => any, +onError?: (error: ExecutionError) => any): Promise +``` + +#### Parameters + +| Parameter | Type | +| ------ | ------ | +| `execution` | `Execution` | +| `line` | `string` | +| `onStdout`? | (`output`: `OutputMessage`) => `any` | +| `onStderr`? | (`output`: `OutputMessage`) => `any` | +| `onResult`? | (`data`: `Result`) => `any` | +| `onError`? | (`error`: `ExecutionError`) => `any` | + +#### Returns + +`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx new file mode 100644 index 00000000..93c26893 --- /dev/null +++ b/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx @@ -0,0 +1,366 @@ +### Sandbox + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs here. + +Use Sandbox.create to create a new sandbox. + +#### Example + +```ts +import { Sandbox } from '@e2b/code-interpreter' + +const sandbox = await Sandbox.create() +``` + +#### Methods + +### createCodeContext() + +```ts +createCodeContext(opts?: CreateCodeContextOpts): Promise +``` + +Creates a new context to run code in. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `opts`? | `CreateCodeContextOpts` | options for creating the context. | + +###### Returns + +`Promise`\<`Context`\> + +context object. + +### listCodeContexts() + +```ts +listCodeContexts(): Promise +``` + +List all contexts. + +###### Returns + +`Promise`\<`Context`[]\> + +list of contexts. + +### removeCodeContext() + +```ts +removeCodeContext(context: string | Context): Promise +``` + +Removes a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to remove. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### restartCodeContext() + +```ts +restartCodeContext(context: string | Context): Promise +``` + +Restart a context. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `context` | `string` \| `Context` | context to restart. | + +###### Returns + +`Promise`\<`void`\> + +void. + +### runCode() + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Run the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object. + +###### runCode(code, opts) + +```ts +runCode(code: string, opts?: RunCodeOpts & object): Promise +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +###### Parameters + +| Parameter | Type | Description | +| ------ | ------ | ------ | +| `code` | `string` | code to execute. | +| `opts`? | `RunCodeOpts` & `object` | options for executing the code | + +###### Returns + +`Promise`\<`Execution`\> + +`Execution` result object + +## Interfaces + +### CreateCodeContextOpts + +Options for creating a code context. + +#### Properties + +### cwd? + +```ts +optional cwd: string; +``` + +Working directory for the context. + +###### Default + +```ts +/home/user +``` + +### language? + +```ts +optional language: string; +``` + +Language for the context. + +###### Default + +```ts +python +``` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +*** + +### RunCodeOpts + +Options for running code. + +#### Properties + +### envs? + +```ts +optional envs: Record; +``` + +Custom environment variables for code execution. + +###### Default + +```ts +{} +``` + +### onError()? + +```ts +optional onError: (error: ExecutionError) => any; +``` + +Callback for handling the `ExecutionError` object. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `error` | `ExecutionError` | + +###### Returns + +`any` + +### onResult()? + +```ts +optional onResult: (data: Result) => any; +``` + +Callback for handling the final execution result. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `data` | `Result` | + +###### Returns + +`any` + +### onStderr()? + +```ts +optional onStderr: (output: OutputMessage) => any; +``` + +Callback for handling stderr messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### onStdout()? + +```ts +optional onStdout: (output: OutputMessage) => any; +``` + +Callback for handling stdout messages. + +###### Parameters + +| Parameter | Type | +| ------ | ------ | +| `output` | `OutputMessage` | + +###### Returns + +`any` + +### requestTimeoutMs? + +```ts +optional requestTimeoutMs: number; +``` + +Timeout for the request in **milliseconds**. + +###### Default + +```ts +30_000 // 30 seconds +``` + +### timeoutMs? + +```ts +optional timeoutMs: number; +``` + +Timeout for the code execution in **milliseconds**. + +###### Default + +```ts +60_000 // 60 seconds +``` + +## Type Aliases + +### Context + +```ts +type Context: object; +``` + +Represents a context for code execution. + +#### Type declaration + +| Name | Type | Description | +| ------ | ------ | ------ | +| `cwd` | `string` | The working directory of the context. | +| `id` | `string` | The ID of the context. | +| `language` | `string` | The language of the context. | From 3c4fcb1d8952748b5893cdd61e3c6676988b771e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 08:32:12 +0100 Subject: [PATCH 634/722] Bump the pip group across 2 directories with 1 update (#185) --- python/poetry.lock | 12 ++++++------ template/requirements.txt | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 3ee1c72f..a25da563 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -251,7 +251,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1751,21 +1751,21 @@ files = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"}, + {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "watchdog" diff --git a/template/requirements.txt b/template/requirements.txt index e0032e56..72d55482 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -38,7 +38,7 @@ soundfile==0.13.1 spacy==3.8.2 # doesn't work on 3.13.x textblob==0.19.0 tornado==6.5.1 -urllib3==2.5.0 +urllib3==2.6.0 xarray==2025.4.0 xlrd==2.0.1 sympy==1.14.0 From 95225f406541a28925c5af8b20c462fb8a8f8721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Wed, 17 Dec 2025 14:14:18 +0100 Subject: [PATCH 635/722] Update e2b (#186) * Update e2b * Update tsup --- js/package.json | 4 +- pnpm-lock.yaml | 442 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 335 insertions(+), 111 deletions(-) diff --git a/js/package.json b/js/package.json index a37f337d..1be76487 100644 --- a/js/package.json +++ b/js/package.json @@ -43,7 +43,7 @@ "dotenv": "^16.4.5", "knip": "^5.25.1", "npm-check-updates": "^17.1.14", - "tsup": "^8.4.0", + "tsup": "^8.5.1", "typedoc": "0.26.8", "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.5.3", @@ -74,6 +74,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.8.3" + "e2b": "^2.8.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8be72f54..9ba037e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^2.8.4 + version: 2.8.4 devDependencies: '@types/node': specifier: ^20.19.19 @@ -64,8 +64,8 @@ importers: specifier: ^17.1.14 version: 17.1.14 tsup: - specifier: ^8.4.0 - version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + specifier: ^8.5.1 + version: 8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typedoc: specifier: 0.26.8 version: 0.26.8(typescript@5.7.3) @@ -130,150 +130,306 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.0': resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.0': resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -369,10 +525,6 @@ packages: resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==} engines: {node: '>=18.18.0'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.39.0': resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} cpu: [arm] @@ -837,6 +989,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -895,8 +1050,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.8.3: - resolution: {integrity: sha512-P0hA5UceZ6HVfL9VDqQ0VG+IXZTy1K+FHek3xFkg7vSgcBm6wV9KG/YcvaoEdgiF+n1KS2TsIhunLs22jbrLyQ==} + e2b@2.8.4: + resolution: {integrity: sha512-InHLjwWYM3eWfr/YYP1NnbjZ6ZojydzfFnY1JMX2oDM5dxO6EPriqIw2ObFJPCwRsrpZelnHeMe19HeJJmVBvg==} engines: {node: '>=20'} eastasianwidth@0.2.0: @@ -930,6 +1085,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1038,6 +1198,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1073,11 +1236,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} @@ -1168,10 +1326,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@4.1.1: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} @@ -1247,19 +1401,12 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - lru-cache@11.2.2: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} @@ -1333,6 +1480,9 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1427,10 +1577,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -1469,6 +1615,9 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -1598,10 +1747,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -1652,8 +1800,8 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true @@ -1688,10 +1836,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -1712,9 +1856,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -1731,8 +1872,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1782,6 +1923,9 @@ packages: udc@1.0.1: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -1898,12 +2042,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2010,78 +2148,156 @@ snapshots: '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/aix-ppc64@0.27.2': + optional: true + '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm64@0.27.2': + optional: true + '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-arm@0.27.2': + optional: true + '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/android-x64@0.27.2': + optional: true + '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.27.2': + optional: true + '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/darwin-x64@0.27.2': + optional: true + '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.27.2': + optional: true + '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.27.2': + optional: true + '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm64@0.27.2': + optional: true + '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-arm@0.27.2': + optional: true + '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-ia32@0.27.2': + optional: true + '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-loong64@0.27.2': + optional: true + '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-mips64el@0.27.2': + optional: true + '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-ppc64@0.27.2': + optional: true + '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.27.2': + optional: true + '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-s390x@0.27.2': + optional: true + '@esbuild/linux-x64@0.25.0': optional: true + '@esbuild/linux-x64@0.27.2': + optional: true + '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-arm64@0.27.2': + optional: true + '@esbuild/netbsd-x64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.27.2': + optional: true + '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-arm64@0.27.2': + optional: true + '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.27.2': + optional: true + '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-arm64@0.27.2': + optional: true + '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-ia32@0.27.2': + optional: true + '@esbuild/win32-x64@0.25.0': optional: true + '@esbuild/win32-x64@0.27.2': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -2193,9 +2409,6 @@ snapshots: '@nodelib/fs.scandir': 4.0.1 fastq: 1.19.0 - '@pkgjs/parseargs@0.11.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.39.0': optional: true @@ -2620,9 +2833,9 @@ snapshots: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.25.0): + bundle-require@5.1.0(esbuild@0.27.2): dependencies: - esbuild: 0.25.0 + esbuild: 0.27.2 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -2682,6 +2895,8 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + consola@3.4.0: {} cross-spawn@7.0.6: @@ -2728,7 +2943,7 @@ snapshots: dotenv@16.4.7: {} - e2b@2.8.3: + e2b@2.8.4: dependencies: '@bufbuild/protobuf': 2.9.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) @@ -2792,6 +3007,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + escape-string-regexp@4.0.0: {} eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): @@ -2921,6 +3165,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.8.0 + rollup: 4.39.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -2959,14 +3209,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: - dependencies: - foreground-child: 3.3.1 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.10.1 - glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -3062,12 +3304,6 @@ snapshots: isexe@2.0.0: {} - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -3147,14 +3383,10 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - loupe@3.1.3: {} loupe@3.2.1: {} - lru-cache@10.2.0: {} - lru-cache@11.2.2: {} lru-cache@6.0.0: @@ -3238,6 +3470,13 @@ snapshots: dependencies: minipass: 7.1.2 + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + ms@2.1.3: {} mz@2.7.0: @@ -3321,11 +3560,6 @@ snapshots: path-key@3.1.1: {} - path-scurry@1.10.1: - dependencies: - lru-cache: 10.2.0 - minipass: 7.1.2 - path-scurry@2.0.0: dependencies: lru-cache: 11.2.2 @@ -3349,6 +3583,12 @@ snapshots: pirates@4.0.6: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + platform@1.3.6: {} postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0): @@ -3472,9 +3712,7 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} @@ -3524,14 +3762,14 @@ snapshots: dependencies: js-tokens: 9.0.1 - sucrase@3.35.0: + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 + tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 summary@2.1.0: {} @@ -3564,11 +3802,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -3584,10 +3817,6 @@ snapshots: dependencies: is-number: 7.0.0 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -3598,23 +3827,24 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) + bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.25.0 + debug: 4.4.3 + esbuild: 0.27.2 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.39.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 + source-map: 0.7.6 + sucrase: 3.35.1 tinyexec: 0.3.2 - tinyglobby: 0.2.12 + tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.3 @@ -3650,6 +3880,8 @@ snapshots: udc@1.0.1: {} + ufo@1.6.1: {} + underscore@1.13.6: {} undici-types@6.21.0: {} @@ -3778,14 +4010,6 @@ snapshots: defaults: 1.0.4 optional: true - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 From a5caae7857295109b410a849475b3e2cb62ffd50 Mon Sep 17 00:00:00 2001 From: Hamdi Alareij <68282537+HamdiMaz@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:43:14 +0300 Subject: [PATCH 636/722] Fix typo in E2B description in README.md (#187) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 812c3a02..4e6c788a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Cover image ---> ## What is E2B? -[E2B](https://www.e2b.dev/) is an open-source infrastructure that allows you run to AI-generated code in secure isolated sandboxes in the cloud. To start and control sandboxes, use our [JavaScript SDK](https://www.npmjs.com/package/@e2b/code-interpreter) or [Python SDK](https://pypi.org/project/e2b_code_interpreter). +[E2B](https://www.e2b.dev/) is an open-source infrastructure that allows you to run AI-generated code in secure isolated sandboxes in the cloud. To start and control sandboxes, use our [JavaScript SDK](https://www.npmjs.com/package/@e2b/code-interpreter) or [Python SDK](https://pypi.org/project/e2b_code_interpreter). ## Run your first Sandbox From b10a6a4f7f4381be0d33b5901a794ef498e16f5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 23:18:28 -0800 Subject: [PATCH 637/722] Bump the pip group across 2 directories with 2 updates (#188) --- updated-dependencies: - dependency-name: fonttools dependency-version: 4.60.2 dependency-type: indirect dependency-group: pip - dependency-name: aiohttp dependency-version: 3.13.3 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 124 +++++++++++++++++++------------------- template/requirements.txt | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index a25da563..4cfe4e31 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -543,83 +543,83 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.59.2" +version = "4.60.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "fonttools-4.59.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2a159e36ae530650acd13604f364b3a2477eff7408dcac6a640d74a3744d2514"}, - {file = "fonttools-4.59.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bd733e47bf4c6dee2b2d8af7a1f7b0c091909b22dbb969a29b2b991e61e5ba4"}, - {file = "fonttools-4.59.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7bb32e0e33795e3b7795bb9b88cb6a9d980d3cbe26dd57642471be547708e17a"}, - {file = "fonttools-4.59.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cdcdf7aad4bab7fd0f2938624a5a84eb4893be269f43a6701b0720b726f24df0"}, - {file = "fonttools-4.59.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4d974312a9f405628e64f475b1f5015a61fd338f0a1b61d15c4822f97d6b045b"}, - {file = "fonttools-4.59.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:12dc4670e6e6cc4553e8de190f86a549e08ca83a036363115d94a2d67488831e"}, - {file = "fonttools-4.59.2-cp310-cp310-win32.whl", hash = "sha256:1603b85d5922042563eea518e272b037baf273b9a57d0f190852b0b075079000"}, - {file = "fonttools-4.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:2543b81641ea5b8ddfcae7926e62aafd5abc604320b1b119e5218c014a7a5d3c"}, - {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:511946e8d7ea5c0d6c7a53c4cb3ee48eda9ab9797cd9bf5d95829a398400354f"}, - {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5e2682cf7be766d84f462ba8828d01e00c8751a8e8e7ce12d7784ccb69a30d"}, - {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5729e12a982dba3eeae650de48b06f3b9ddb51e9aee2fcaf195b7d09a96250e2"}, - {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c52694eae5d652361d59ecdb5a2246bff7cff13b6367a12da8499e9df56d148d"}, - {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f1bbc23ba1312bd8959896f46f667753b90216852d2a8cfa2d07e0cb234144"}, - {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a1bfe5378962825dabe741720885e8b9ae9745ec7ecc4a5ec1f1ce59a6062bf"}, - {file = "fonttools-4.59.2-cp311-cp311-win32.whl", hash = "sha256:e937790f3c2c18a1cbc7da101550a84319eb48023a715914477d2e7faeaba570"}, - {file = "fonttools-4.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:9836394e2f4ce5f9c0a7690ee93bd90aa1adc6b054f1a57b562c5d242c903104"}, - {file = "fonttools-4.59.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82906d002c349cad647a7634b004825a7335f8159d0d035ae89253b4abf6f3ea"}, - {file = "fonttools-4.59.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a10c1bd7644dc58f8862d8ba0cf9fb7fef0af01ea184ba6ce3f50ab7dfe74d5a"}, - {file = "fonttools-4.59.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:738f31f23e0339785fd67652a94bc69ea49e413dfdb14dcb8c8ff383d249464e"}, - {file = "fonttools-4.59.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ec99f9bdfee9cdb4a9172f9e8fd578cce5feb231f598909e0aecf5418da4f25"}, - {file = "fonttools-4.59.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0476ea74161322e08c7a982f83558a2b81b491509984523a1a540baf8611cc31"}, - {file = "fonttools-4.59.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95922a922daa1f77cc72611747c156cfb38030ead72436a2c551d30ecef519b9"}, - {file = "fonttools-4.59.2-cp312-cp312-win32.whl", hash = "sha256:39ad9612c6a622726a6a130e8ab15794558591f999673f1ee7d2f3d30f6a3e1c"}, - {file = "fonttools-4.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:980fd7388e461b19a881d35013fec32c713ffea1fc37aef2f77d11f332dfd7da"}, - {file = "fonttools-4.59.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:381bde13216ba09489864467f6bc0c57997bd729abfbb1ce6f807ba42c06cceb"}, - {file = "fonttools-4.59.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f33839aa091f7eef4e9078f5b7ab1b8ea4b1d8a50aeaef9fdb3611bba80869ec"}, - {file = "fonttools-4.59.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6235fc06bcbdb40186f483ba9d5d68f888ea68aa3c8dac347e05a7c54346fbc8"}, - {file = "fonttools-4.59.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83ad6e5d06ef3a2884c4fa6384a20d6367b5cfe560e3b53b07c9dc65a7020e73"}, - {file = "fonttools-4.59.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d029804c70fddf90be46ed5305c136cae15800a2300cb0f6bba96d48e770dde0"}, - {file = "fonttools-4.59.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:95807a3b5e78f2714acaa26a33bc2143005cc05c0217b322361a772e59f32b89"}, - {file = "fonttools-4.59.2-cp313-cp313-win32.whl", hash = "sha256:b3ebda00c3bb8f32a740b72ec38537d54c7c09f383a4cfefb0b315860f825b08"}, - {file = "fonttools-4.59.2-cp313-cp313-win_amd64.whl", hash = "sha256:a72155928d7053bbde499d32a9c77d3f0f3d29ae72b5a121752481bcbd71e50f"}, - {file = "fonttools-4.59.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d09e487d6bfbe21195801323ba95c91cb3523f0fcc34016454d4d9ae9eaa57fe"}, - {file = "fonttools-4.59.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dec2f22486d7781087b173799567cffdcc75e9fb2f1c045f05f8317ccce76a3e"}, - {file = "fonttools-4.59.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1647201af10993090120da2e66e9526c4e20e88859f3e34aa05b8c24ded2a564"}, - {file = "fonttools-4.59.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47742c33fe65f41eabed36eec2d7313a8082704b7b808752406452f766c573fc"}, - {file = "fonttools-4.59.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:92ac2d45794f95d1ad4cb43fa07e7e3776d86c83dc4b9918cf82831518165b4b"}, - {file = "fonttools-4.59.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fa9ecaf2dcef8941fb5719e16322345d730f4c40599bbf47c9753de40eb03882"}, - {file = "fonttools-4.59.2-cp314-cp314-win32.whl", hash = "sha256:a8d40594982ed858780e18a7e4c80415af65af0f22efa7de26bdd30bf24e1e14"}, - {file = "fonttools-4.59.2-cp314-cp314-win_amd64.whl", hash = "sha256:9cde8b6a6b05f68516573523f2013a3574cb2c75299d7d500f44de82ba947b80"}, - {file = "fonttools-4.59.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:036cd87a2dbd7ef72f7b68df8314ced00b8d9973aee296f2464d06a836aeb9a9"}, - {file = "fonttools-4.59.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:14870930181493b1d740b6f25483e20185e5aea58aec7d266d16da7be822b4bb"}, - {file = "fonttools-4.59.2-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ff58ea1eb8fc7e05e9a949419f031890023f8785c925b44d6da17a6a7d6e85d"}, - {file = "fonttools-4.59.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dee142b8b3096514c96ad9e2106bf039e2fe34a704c587585b569a36df08c3c"}, - {file = "fonttools-4.59.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8991bdbae39cf78bcc9cd3d81f6528df1f83f2e7c23ccf6f990fa1f0b6e19708"}, - {file = "fonttools-4.59.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:53c1a411b7690042535a4f0edf2120096a39a506adeb6c51484a232e59f2aa0c"}, - {file = "fonttools-4.59.2-cp314-cp314t-win32.whl", hash = "sha256:59d85088e29fa7a8f87d19e97a1beae2a35821ee48d8ef6d2c4f965f26cb9f8a"}, - {file = "fonttools-4.59.2-cp314-cp314t-win_amd64.whl", hash = "sha256:7ad5d8d8cc9e43cb438b3eb4a0094dd6d4088daa767b0a24d52529361fd4c199"}, - {file = "fonttools-4.59.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3cdf9d32690f0e235342055f0a6108eedfccf67b213b033bac747eb809809513"}, - {file = "fonttools-4.59.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f9640d6b31d66c0bc54bdbe8ed50983c755521c101576a25e377a8711e8207"}, - {file = "fonttools-4.59.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464d15b58a9fd4304c728735fc1d42cd812fd9ebc27c45b18e78418efd337c28"}, - {file = "fonttools-4.59.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a039c38d5644c691eb53cd65360921338f54e44c90b4e764605711e046c926ee"}, - {file = "fonttools-4.59.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e4f5100e66ec307cce8b52fc03e379b5d1596e9cb8d8b19dfeeccc1e68d86c96"}, - {file = "fonttools-4.59.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:af6dbd463a3530256abf21f675ddf87646272bc48901803a185c49d06287fbf1"}, - {file = "fonttools-4.59.2-cp39-cp39-win32.whl", hash = "sha256:594a6fd2f8296583ac7babc4880c8deee7c4f05ab0141addc6bce8b8e367e996"}, - {file = "fonttools-4.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:fc21c4a05226fd39715f66c1c28214862474db50df9f08fd1aa2f96698887bc3"}, - {file = "fonttools-4.59.2-py3-none-any.whl", hash = "sha256:8bd0f759020e87bb5d323e6283914d9bf4ae35a7307dafb2cbd1e379e720ad37"}, - {file = "fonttools-4.59.2.tar.gz", hash = "sha256:e72c0749b06113f50bcb80332364c6be83a9582d6e3db3fe0b280f996dc2ef22"}, + {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e36fadcf7e8ca6e34d490eef86ed638d6fd9c55d2f514b05687622cfc4a7050"}, + {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e500fc9c04bee749ceabfc20cb4903f6981c2139050d85720ea7ada61b75d5c"}, + {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22efea5e784e1d1cd8d7b856c198e360a979383ebc6dea4604743b56da1cbc34"}, + {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:677aa92d84d335e4d301d8ba04afca6f575316bc647b6782cb0921943fcb6343"}, + {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:edd49d3defbf35476e78b61ff737ff5efea811acff68d44233a95a5a48252334"}, + {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:126839492b69cecc5baf2bddcde60caab2ffafd867bbae2a88463fce6078ca3a"}, + {file = "fonttools-4.60.2-cp310-cp310-win32.whl", hash = "sha256:ffcab6f5537136046ca902ed2491ab081ba271b07591b916289b7c27ff845f96"}, + {file = "fonttools-4.60.2-cp310-cp310-win_amd64.whl", hash = "sha256:9c68b287c7ffcd29dd83b5f961004b2a54a862a88825d52ea219c6220309ba45"}, + {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2aed0a7931401b3875265717a24c726f87ecfedbb7b3426c2ca4d2812e281ae"}, + {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea6868e9d2b816c9076cfea77754686f3c19149873bdbc5acde437631c15df1"}, + {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fa27f34950aa1fe0f0b1abe25eed04770a3b3b34ad94e5ace82cc341589678a"}, + {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13a53d479d187b09bfaa4a35ffcbc334fc494ff355f0a587386099cb66674f1e"}, + {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fac5e921d3bd0ca3bb8517dced2784f0742bc8ca28579a68b139f04ea323a779"}, + {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:648f4f9186fd7f1f3cd57dbf00d67a583720d5011feca67a5e88b3a491952cfb"}, + {file = "fonttools-4.60.2-cp311-cp311-win32.whl", hash = "sha256:3274e15fad871bead5453d5ce02658f6d0c7bc7e7021e2a5b8b04e2f9e40da1a"}, + {file = "fonttools-4.60.2-cp311-cp311-win_amd64.whl", hash = "sha256:91d058d5a483a1525b367803abb69de0923fbd45e1f82ebd000f5c8aa65bc78e"}, + {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e0164b7609d2b5c5dd4e044b8085b7bd7ca7363ef8c269a4ab5b5d4885a426b2"}, + {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1dd3d9574fc595c1e97faccae0f264dc88784ddf7fbf54c939528378bacc0033"}, + {file = "fonttools-4.60.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98d0719f1b11c2817307d2da2e94296a3b2a3503f8d6252a101dca3ee663b917"}, + {file = "fonttools-4.60.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d3ea26957dd07209f207b4fff64c702efe5496de153a54d3b91007ec28904dd"}, + {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ee301273b0850f3a515299f212898f37421f42ff9adfc341702582ca5073c13"}, + {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6eb4694cc3b9c03b7c01d65a9cf35b577f21aa6abdbeeb08d3114b842a58153"}, + {file = "fonttools-4.60.2-cp312-cp312-win32.whl", hash = "sha256:57f07b616c69c244cc1a5a51072eeef07dddda5ebef9ca5c6e9cf6d59ae65b70"}, + {file = "fonttools-4.60.2-cp312-cp312-win_amd64.whl", hash = "sha256:310035802392f1fe5a7cf43d76f6ff4a24c919e4c72c0352e7b8176e2584b8a0"}, + {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bb5fd231e56ccd7403212636dcccffc96c5ae0d6f9e4721fa0a32cb2e3ca432"}, + {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:536b5fab7b6fec78ccf59b5c59489189d9d0a8b0d3a77ed1858be59afb096696"}, + {file = "fonttools-4.60.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b9288fc38252ac86a9570f19313ecbc9ff678982e0f27c757a85f1f284d3400"}, + {file = "fonttools-4.60.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93fcb420791d839ef592eada2b69997c445d0ce9c969b5190f2e16828ec10607"}, + {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7916a381b094db4052ac284255186aebf74c5440248b78860cb41e300036f598"}, + {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58c8c393d5e16b15662cfc2d988491940458aa87894c662154f50c7b49440bef"}, + {file = "fonttools-4.60.2-cp313-cp313-win32.whl", hash = "sha256:19c6e0afd8b02008caa0aa08ab896dfce5d0bcb510c49b2c499541d5cb95a963"}, + {file = "fonttools-4.60.2-cp313-cp313-win_amd64.whl", hash = "sha256:6a500dc59e11b2338c2dba1f8cf11a4ae8be35ec24af8b2628b8759a61457b76"}, + {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9387c532acbe323bbf2a920f132bce3c408a609d5f9dcfc6532fbc7e37f8ccbb"}, + {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6f1c824185b5b8fb681297f315f26ae55abb0d560c2579242feea8236b1cfef"}, + {file = "fonttools-4.60.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:55a3129d1e4030b1a30260f1b32fe76781b585fb2111d04a988e141c09eb6403"}, + {file = "fonttools-4.60.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b196e63753abc33b3b97a6fd6de4b7c4fef5552c0a5ba5e562be214d1e9668e0"}, + {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de76c8d740fb55745f3b154f0470c56db92ae3be27af8ad6c2e88f1458260c9a"}, + {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ba6303225c95998c9fda2d410aa792c3d2c1390a09df58d194b03e17583fa25"}, + {file = "fonttools-4.60.2-cp314-cp314-win32.whl", hash = "sha256:0a89728ce10d7c816fedaa5380c06d2793e7a8a634d7ce16810e536c22047384"}, + {file = "fonttools-4.60.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa8446e6ab8bd778b82cb1077058a2addba86f30de27ab9cc18ed32b34bc8667"}, + {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4063bc81ac5a4137642865cb63dd270e37b3cd1f55a07c0d6e41d072699ccca2"}, + {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebfdb66fa69732ed604ab8e2a0431e6deff35e933a11d73418cbc7823d03b8e1"}, + {file = "fonttools-4.60.2-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50b10b3b1a72d1d54c61b0e59239e1a94c0958f4a06a1febf97ce75388dd91a4"}, + {file = "fonttools-4.60.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:beae16891a13b4a2ddec9b39b4de76092a3025e4d1c82362e3042b62295d5e4d"}, + {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:522f017fdb3766fd5d2d321774ef351cc6ce88ad4e6ac9efe643e4a2b9d528db"}, + {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82cceceaf9c09a965a75b84a4b240dd3768e596ffb65ef53852681606fe7c9ba"}, + {file = "fonttools-4.60.2-cp314-cp314t-win32.whl", hash = "sha256:bbfbc918a75437fe7e6d64d1b1e1f713237df1cf00f3a36dedae910b2ba01cee"}, + {file = "fonttools-4.60.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0e5cd9b0830f6550d58c84f3ab151a9892b50c4f9d538c5603c0ce6fff2eb3f1"}, + {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3c75b8b42f7f93906bdba9eb1197bb76aecbe9a0a7cf6feec75f7605b5e8008"}, + {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0f86c8c37bc0ec0b9c141d5e90c717ff614e93c187f06d80f18c7057097f71bc"}, + {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe905403fe59683b0e9a45f234af2866834376b8821f34633b1c76fb731b6311"}, + {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38ce703b60a906e421e12d9e3a7f064883f5e61bb23e8961f4be33cfe578500b"}, + {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9e810c06f3e79185cecf120e58b343ea5a89b54dd695fd644446bcf8c026da5e"}, + {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:38faec8cc1d12122599814d15a402183f5123fb7608dac956121e7c6742aebc5"}, + {file = "fonttools-4.60.2-cp39-cp39-win32.whl", hash = "sha256:80a45cf7bf659acb7b36578f300231873daba67bd3ca8cce181c73f861f14a37"}, + {file = "fonttools-4.60.2-cp39-cp39-win_amd64.whl", hash = "sha256:c355d5972071938e1b1e0f5a1df001f68ecf1a62f34a3407dc8e0beccf052501"}, + {file = "fonttools-4.60.2-py3-none-any.whl", hash = "sha256:73cf92eeda67cf6ff10c8af56fc8f4f07c1647d989a979be9e388a49be26552a"}, + {file = "fonttools-4.60.2.tar.gz", hash = "sha256:d29552e6b155ebfc685b0aecf8d429cb76c14ab734c22ef5d3dea6fdf800c92c"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] diff --git a/template/requirements.txt b/template/requirements.txt index 72d55482..c0abd490 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -12,7 +12,7 @@ pillow==11.3.0 e2b_charts # Other packages -aiohttp==3.12.14 +aiohttp==3.13.3 beautifulsoup4==4.13.4 bokeh==3.7.3 gensim==4.3.3 # unmaintained, blocking numpy and scipy bump From 99b7d8c7c79bead49741c33fa031538d4de35a4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 23:32:06 -0800 Subject: [PATCH 638/722] Bump the pip group across 2 directories with 2 updates (#189) Bumps the pip group with 1 update in the /python directory: [urllib3](https://github.com/urllib3/urllib3). Bumps the pip group with 2 updates in the /template directory: [urllib3](https://github.com/urllib3/urllib3) and [bokeh](https://github.com/bokeh/bokeh). Updates `urllib3` from 2.6.0 to 2.6.3 - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.0...2.6.3) Updates `urllib3` from 2.6.0 to 2.6.3 - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.0...2.6.3) Updates `bokeh` from 3.7.3 to 3.8.2 - [Changelog](https://github.com/bokeh/bokeh/blob/3.8.2/docs/CHANGELOG) - [Commits](https://github.com/bokeh/bokeh/compare/3.7.3...3.8.2) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.6.3 dependency-type: indirect dependency-group: pip - dependency-name: urllib3 dependency-version: 2.6.3 dependency-type: direct:production dependency-group: pip - dependency-name: bokeh dependency-version: 3.8.2 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 6 +++--- template/requirements.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 4cfe4e31..073f4849 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1751,14 +1751,14 @@ files = [ [[package]] name = "urllib3" -version = "2.6.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"}, - {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] diff --git a/template/requirements.txt b/template/requirements.txt index c0abd490..99164507 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -14,7 +14,7 @@ e2b_charts # Other packages aiohttp==3.13.3 beautifulsoup4==4.13.4 -bokeh==3.7.3 +bokeh==3.8.2 gensim==4.3.3 # unmaintained, blocking numpy and scipy bump imageio==2.37.0 joblib==1.5.0 @@ -38,7 +38,7 @@ soundfile==0.13.1 spacy==3.8.2 # doesn't work on 3.13.x textblob==0.19.0 tornado==6.5.1 -urllib3==2.6.0 +urllib3==2.6.3 xarray==2025.4.0 xlrd==2.0.1 sympy==1.14.0 From 5de870cfabbb5ad24119792206668d60d5cccf8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:59:37 -0800 Subject: [PATCH 639/722] Bump the pip group across 2 directories with 2 updates (#191) Bumps the pip group with 1 update in the /python directory: [protobuf](https://github.com/protocolbuffers/protobuf). Bumps the pip group with 1 update in the /template directory: [orjson](https://github.com/ijl/orjson). Updates `protobuf` from 6.32.1 to 6.33.5 - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Commits](https://github.com/protocolbuffers/protobuf/commits) Updates `orjson` from 3.10.18 to 3.11.5 - [Release notes](https://github.com/ijl/orjson/releases) - [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md) - [Commits](https://github.com/ijl/orjson/compare/3.10.18...3.11.5) --- updated-dependencies: - dependency-name: protobuf dependency-version: 6.33.5 dependency-type: indirect dependency-group: pip - dependency-name: orjson dependency-version: 3.11.5 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- python/poetry.lock | 21 +++++++++++---------- template/requirements.txt | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index 073f4849..045183ec 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1335,21 +1335,22 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "6.32.1" +version = "6.33.5" description = "" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "protobuf-6.32.1-cp310-abi3-win32.whl", hash = "sha256:a8a32a84bc9f2aad712041b8b366190f71dde248926da517bde9e832e4412085"}, - {file = "protobuf-6.32.1-cp310-abi3-win_amd64.whl", hash = "sha256:b00a7d8c25fa471f16bc8153d0e53d6c9e827f0953f3c09aaa4331c718cae5e1"}, - {file = "protobuf-6.32.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8c7e6eb619ffdf105ee4ab76af5a68b60a9d0f66da3ea12d1640e6d8dab7281"}, - {file = "protobuf-6.32.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:2f5b80a49e1eb7b86d85fcd23fe92df154b9730a725c3b38c4e43b9d77018bf4"}, - {file = "protobuf-6.32.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:b1864818300c297265c83a4982fd3169f97122c299f56a56e2445c3698d34710"}, - {file = "protobuf-6.32.1-cp39-cp39-win32.whl", hash = "sha256:68ff170bac18c8178f130d1ccb94700cf72852298e016a2443bdb9502279e5f1"}, - {file = "protobuf-6.32.1-cp39-cp39-win_amd64.whl", hash = "sha256:d0975d0b2f3e6957111aa3935d08a0eb7e006b1505d825f862a1fffc8348e122"}, - {file = "protobuf-6.32.1-py3-none-any.whl", hash = "sha256:2601b779fc7d32a866c6b4404f9d42a3f67c5b9f3f15b4db3cccabe06b95c346"}, - {file = "protobuf-6.32.1.tar.gz", hash = "sha256:ee2469e4a021474ab9baafea6cd070e5bf27c7d29433504ddea1a4ee5850f68d"}, + {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, + {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, + {file = "protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0"}, + {file = "protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c"}, + {file = "protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a"}, + {file = "protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02"}, + {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, ] [[package]] diff --git a/template/requirements.txt b/template/requirements.txt index 99164507..b5ead95e 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,7 +3,7 @@ jupyter-server==2.16.0 ipykernel==6.29.5 ipython==9.2.0 -orjson==3.10.18 +orjson==3.11.5 pandas==2.2.3 matplotlib==3.10.3 pillow==11.3.0 From d2b26716a94de1ccea1c7e97e214c0cd1875213c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 07:51:26 -0800 Subject: [PATCH 640/722] Configure Renovate (#197) * Add renovate.json * feat: setup renovate * Potential fix for code scanning alert no. 4: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jakub Novak Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../workflows/validate-renovate-config.yaml | 19 ++++++++++ .gitignore | 4 ++- renovate.json5 | 36 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/validate-renovate-config.yaml create mode 100644 renovate.json5 diff --git a/.github/workflows/validate-renovate-config.yaml b/.github/workflows/validate-renovate-config.yaml new file mode 100644 index 00000000..a5feb8c6 --- /dev/null +++ b/.github/workflows/validate-renovate-config.yaml @@ -0,0 +1,19 @@ +name: validate renovate config + +permissions: + contents: read + +on: + pull_request: + branches: + - main + +jobs: + validate-renovate-config: + runs-on: ubuntu-24.04 + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Validate Renovate config + uses: suzuki-shunsuke/github-action-renovate-config-validator@v2.0.0 diff --git a/.gitignore b/.gitignore index a5c9d15f..b74489d7 100644 --- a/.gitignore +++ b/.gitignore @@ -290,4 +290,6 @@ cython_debug/ .idea/ # VS Code -.vscode/ \ No newline at end of file +.vscode/ + +.DS_Store diff --git a/renovate.json5 b/renovate.json5 new file mode 100644 index 00000000..616f7b69 --- /dev/null +++ b/renovate.json5 @@ -0,0 +1,36 @@ +// configuration options: https://docs.renovatebot.com/configuration-options/ +// list of all presets: https://docs.renovatebot.com/presets-default/ +{ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + extends: ['config:recommended', ':automergeRequireAllStatusChecks'], + dependencyDashboard: true, + // let it fly for now, we've got a lot to catch up on + // schedule: [ + // "0 * * * *" + // ], + timezone: 'UTC', + // Always squash PRs when automerging + automergeType: 'pr', + automergeStrategy: 'squash', + packageRules: [ + { + description: 'Group and automerge patch updates after CI passes', + matchUpdateTypes: ['patch'], + automerge: true, + groupName: 'patch-updates', + }, + { + description: 'Create PRs for minor updates without automerge', + matchUpdateTypes: ['minor'], + automerge: false, + }, + { + description: 'Require dashboard approval for major updates', + matchUpdateTypes: ['major'], + dependencyDashboardApproval: true, + automerge: false, + }, + ], + prConcurrentLimit: 3, + rebaseWhen: 'auto', +} From ce87ab0f9169fff7a59229db09687ab9fc08aa30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:00:16 +0000 Subject: [PATCH 641/722] Update dependency e2b to v2.13.2 (#202) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index c27bd916..ba5a7a0a 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.6.4 +e2b==2.13.2 python-dotenv==1.2.1 \ No newline at end of file From a2aa928935c4584f6b72824fae65bd28ff45d0ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:00:42 +0000 Subject: [PATCH 642/722] Update dependency e2b (#201) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 203 +++++++++++++-------------------------------- python/poetry.lock | 8 +- 2 files changed, 63 insertions(+), 148 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ba037e1..8b538a62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: dependencies: e2b: specifier: ^2.8.4 - version: 2.8.4 + version: 2.12.1 devDependencies: '@types/node': specifier: ^20.19.19 @@ -89,8 +89,8 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.9.0': - resolution: {integrity: sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==} + '@bufbuild/protobuf@2.11.0': + resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -461,17 +461,9 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} @@ -865,18 +857,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -897,6 +881,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -907,6 +895,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1050,25 +1042,16 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - e2b@2.8.4: - resolution: {integrity: sha512-InHLjwWYM3eWfr/YYP1NnbjZ6ZojydzfFnY1JMX2oDM5dxO6EPriqIw2ObFJPCwRsrpZelnHeMe19HeJJmVBvg==} + e2b@2.12.1: + resolution: {integrity: sha512-qKYwS0VSZqvtWAT4OrCtOwRhhMlcd359zyFRGAZZ1wpYHHjr9zR872UCoDb/d5jFVUsREcUgktURc47XxfznPg==} engines: {node: '>=20'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} @@ -1239,11 +1222,12 @@ packages: glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -1299,10 +1283,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1326,8 +1306,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} jiti@2.4.2: @@ -1407,8 +1387,8 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -1454,8 +1434,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -1577,8 +1557,8 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} path-type@4.0.0: @@ -1766,14 +1746,6 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -1781,10 +1753,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -1816,8 +1784,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.5.2: - resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} text-table@0.2.0: @@ -2056,14 +2024,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -2099,7 +2059,7 @@ snapshots: '@babel/runtime@7.27.1': {} - '@bufbuild/protobuf@2.9.0': {} + '@bufbuild/protobuf@2.11.0': {} '@changesets/errors@0.2.0': dependencies: @@ -2136,14 +2096,14 @@ snapshots: '@changesets/types@6.0.0': {} - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0))': dependencies: - '@bufbuild/protobuf': 2.9.0 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) + '@bufbuild/protobuf': 2.11.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)': dependencies: - '@bufbuild/protobuf': 2.9.0 + '@bufbuild/protobuf': 2.11.0 '@esbuild/aix-ppc64@0.25.0': optional: true @@ -2333,20 +2293,7 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} '@isaacs/fs-minipass@4.0.1': dependencies: @@ -2794,14 +2741,10 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} argparse@1.0.10: @@ -2816,6 +2759,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -2829,6 +2776,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -2943,20 +2894,18 @@ snapshots: dotenv@16.4.7: {} - e2b@2.8.4: + e2b@2.12.1: dependencies: - '@bufbuild/protobuf': 2.9.0 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.9.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.9.0)) + '@bufbuild/protobuf': 2.11.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)) chalk: 5.6.2 compare-versions: 6.1.1 dockerfile-ast: 0.7.1 glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.2 - - eastasianwidth@0.2.0: {} + tar: 7.5.7 easy-table@1.2.0: dependencies: @@ -2966,10 +2915,6 @@ snapshots: emoji-regex-xs@1.0.0: {} - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 @@ -3212,11 +3157,11 @@ snapshots: glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.1 + jackspeak: 4.2.3 + minimatch: 10.2.0 minipass: 7.1.2 package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + path-scurry: 2.0.1 glob@7.2.3: dependencies: @@ -3286,8 +3231,6 @@ snapshots: is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -3304,9 +3247,9 @@ snapshots: isexe@2.0.0: {} - jackspeak@4.1.1: + jackspeak@4.2.3: dependencies: - '@isaacs/cliui': 8.0.2 + '@isaacs/cliui': 9.0.0 jiti@2.4.2: {} @@ -3387,7 +3330,7 @@ snapshots: loupe@3.2.1: {} - lru-cache@11.2.2: {} + lru-cache@11.2.6: {} lru-cache@6.0.0: dependencies: @@ -3446,9 +3389,9 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@10.1.1: + minimatch@10.2.0: dependencies: - '@isaacs/brace-expansion': 5.0.0 + brace-expansion: 5.0.2 minimatch@3.1.2: dependencies: @@ -3560,9 +3503,9 @@ snapshots: path-key@3.1.1: {} - path-scurry@2.0.0: + path-scurry@2.0.1: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.6 minipass: 7.1.2 path-type@4.0.0: {} @@ -3727,18 +3670,6 @@ snapshots: std-env@3.9.0: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -3748,10 +3679,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} @@ -3780,7 +3707,7 @@ snapshots: tapable@2.2.1: {} - tar@7.5.2: + tar@7.5.7: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -4021,18 +3948,6 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} yallist@4.0.0: {} diff --git a/python/poetry.lock b/python/poetry.lock index 045183ec..734f2a66 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -251,7 +251,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] -markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -488,14 +488,14 @@ test = ["black", "pytest"] [[package]] name = "e2b" -version = "2.7.0" +version = "2.10.2" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "e2b-2.7.0-py3-none-any.whl", hash = "sha256:cc3d0a2def205e3e3e2ac635c59d12f41adea3c32a479e578716e4abcdd8898d"}, - {file = "e2b-2.7.0.tar.gz", hash = "sha256:e276101c017ab4425688a9935a91d79c8ea43fc73bf7089d10028a4b21915016"}, + {file = "e2b-2.10.2-py3-none-any.whl", hash = "sha256:c719291fc9b3006b286809f6e820b803a1aab9a6f5ae4fe0140ead17efbce821"}, + {file = "e2b-2.10.2.tar.gz", hash = "sha256:b77ecd620fd057b81a9610da18141811c003cc6f446c39c7ec7b9e9dc147d864"}, ] [package.dependencies] From d5cedf8630fc7bfe14ebc80018036504f6b25a9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:05:08 +0000 Subject: [PATCH 643/722] Update patch-updates (#199) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- js/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 92 ++++++++++++++++---------------- python/package.json | 2 +- template/requirements.txt | 18 +++---- template/server/requirements.txt | 2 +- 7 files changed, 60 insertions(+), 60 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 493bea7d..aa855769 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ jobs: - uses: pnpm/action-setup@v4 with: - version: 9.15.5 + version: 9.15.9 - name: Setup Node.js 20 uses: actions/setup-node@v4 diff --git a/js/package.json b/js/package.json index 1be76487..411551a0 100644 --- a/js/package.json +++ b/js/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter", "version": "2.3.3", - "packageManager": "pnpm@9.15.5", + "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", "license": "MIT", diff --git a/package.json b/package.json index 8f5761eb..f09f906b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "format": "pnpm --if-present --recursive run format", "changeset": "pnpx @changesets/cli" }, - "packageManager": "pnpm@9.15.5", + "packageManager": "pnpm@9.15.9", "devDependencies": { "@changesets/read": "^0.6.2", "changeset": "^0.2.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b538a62..c8f43f86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@changesets/read': specifier: ^0.6.2 - version: 0.6.2 + version: 0.6.6 '@stylistic/eslint-plugin-ts': specifier: ^1.6.2 version: 1.8.1(eslint@8.57.1)(typescript@5.7.3) @@ -53,16 +53,16 @@ importers: devDependencies: '@types/node': specifier: ^20.19.19 - version: 20.19.19 + version: 20.19.33 dotenv: specifier: ^16.4.5 version: 16.4.7 knip: specifier: ^5.25.1 - version: 5.43.6(@types/node@20.19.19)(typescript@5.7.3) + version: 5.43.6(@types/node@20.19.33)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 - version: 17.1.14 + version: 17.1.18 tsup: specifier: ^8.5.1 version: 8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -77,7 +77,7 @@ importers: version: 5.7.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + version: 3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -85,8 +85,8 @@ importers: packages: - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} '@bufbuild/protobuf@2.11.0': @@ -95,23 +95,23 @@ packages: '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} - '@changesets/read@0.6.2': - resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} '@connectrpc/connect-web@2.0.0-rc.3': resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} @@ -679,8 +679,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.19': - resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} + '@types/node@20.19.33': + resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -1477,8 +1477,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - npm-check-updates@17.1.14: - resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} + npm-check-updates@17.1.18: + resolution: {integrity: sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==} engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} hasBin: true @@ -2057,7 +2057,7 @@ packages: snapshots: - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.28.6': {} '@bufbuild/protobuf@2.11.0': {} @@ -2065,7 +2065,7 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -2077,24 +2077,24 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.2': dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.2 + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 - '@changesets/read@0.6.2': + '@changesets/read@0.6.6': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + '@changesets/parse': 0.4.2 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0))': dependencies: @@ -2318,14 +2318,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -2502,7 +2502,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.19': + '@types/node@20.19.33': dependencies: undici-types: 6.21.0 @@ -2687,13 +2687,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -3280,11 +3280,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.43.6(@types/node@20.19.19)(typescript@5.7.3): + knip@5.43.6(@types/node@20.19.33)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.19.19 + '@types/node': 20.19.33 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -3432,7 +3432,7 @@ snapshots: natural-compare@1.4.0: {} - npm-check-updates@17.1.14: {} + npm-check-updates@17.1.18: {} object-assign@4.1.1: {} @@ -3852,13 +3852,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3873,7 +3873,7 @@ snapshots: - tsx - yaml - vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -3882,16 +3882,16 @@ snapshots: rollup: 4.39.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.19.19 + '@types/node': 20.19.33 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0): + vitest@3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3909,11 +3909,11 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.2.4(@types/node@20.19.19)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.19 + '@types/node': 20.19.33 transitivePeerDependencies: - jiti - less diff --git a/python/package.json b/python/package.json index 0972551b..ecb7e5a1 100644 --- a/python/package.json +++ b/python/package.json @@ -2,7 +2,7 @@ "name": "@e2b/code-interpreter-python", "private": true, "version": "2.4.1", - "packageManager": "pnpm@9.15.5", + "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/template/requirements.txt b/template/requirements.txt index b5ead95e..64450aee 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,9 +3,9 @@ jupyter-server==2.16.0 ipykernel==6.29.5 ipython==9.2.0 -orjson==3.11.5 +orjson==3.11.7 pandas==2.2.3 -matplotlib==3.10.3 +matplotlib==3.10.8 pillow==11.3.0 # Latest version for @@ -16,10 +16,10 @@ aiohttp==3.13.3 beautifulsoup4==4.13.4 bokeh==3.8.2 gensim==4.3.3 # unmaintained, blocking numpy and scipy bump -imageio==2.37.0 -joblib==1.5.0 +imageio==2.37.2 +joblib==1.5.3 librosa==0.11.0 -nltk==3.9.1 +nltk==3.9.2 numpy==1.26.4 # bump blocked by gensim numba==0.61.2 opencv-python==4.11.0.86 @@ -29,16 +29,16 @@ kaleido==1.0.0 pytest==8.3.5 python-docx==1.1.2 pytz==2025.2 -requests==2.32.4 +requests==2.32.5 scikit-image==0.25.2 scikit-learn==1.6.1 scipy==1.13.1 # bump blocked by gensim seaborn==0.13.2 soundfile==0.13.1 -spacy==3.8.2 # doesn't work on 3.13.x +spacy==3.8.11 # doesn't work on 3.13.x textblob==0.19.0 -tornado==6.5.1 +tornado==6.5.4 urllib3==2.6.3 xarray==2025.4.0 -xlrd==2.0.1 +xlrd==2.0.2 sympy==1.14.0 diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 52385cb6..316b2622 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -2,5 +2,5 @@ fastapi==0.111.0 httpx==0.27.0 websockets==12.0 uvicorn[standard]==0.30.1 -requests==2.32.4 +requests==2.32.5 pydantic==2.9.1 From db3eab7bdbfaac2aea1a56e85a1216c47d72594e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Sun, 15 Feb 2026 08:07:37 -0800 Subject: [PATCH 644/722] Potential fix for code scanning alert no. 1: Workflow does not contain permissions (#204) Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index aa855769..4b89bedb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -3,6 +3,9 @@ name: Lint on: pull_request: +permissions: + contents: read + jobs: lint: name: Lint From 3e7c4286e24e253f2d3c4553a7087f5816ef6abe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:10:51 +0000 Subject: [PATCH 645/722] Update dependency beautifulsoup4 to v4.14.3 (#203) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 64450aee..be807cd3 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -13,7 +13,7 @@ e2b_charts # Other packages aiohttp==3.13.3 -beautifulsoup4==4.13.4 +beautifulsoup4==4.14.3 bokeh==3.8.2 gensim==4.3.3 # unmaintained, blocking numpy and scipy bump imageio==2.37.2 From 47665e0fab5b87dd8ab3b215857f436360ff5cb0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:16:17 +0000 Subject: [PATCH 646/722] Update dependency pillow to v12 [SECURITY] (#198) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index be807cd3..15ae1454 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -6,7 +6,7 @@ ipython==9.2.0 orjson==3.11.7 pandas==2.2.3 matplotlib==3.10.8 -pillow==11.3.0 +pillow==12.1.1 # Latest version for e2b_charts From 3053cefe70f703bc775dc0a7f8395a68e01ba7ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 08:18:49 -0800 Subject: [PATCH 647/722] Bump pillow in /chart_data_extractor in the pip group across 1 directory (#195) Bumps the pip group with 1 update in the /chart_data_extractor directory: [pillow](https://github.com/python-pillow/Pillow). Updates `pillow` from 10.4.0 to 12.1.1 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/10.4.0...12.1.1) --- updated-dependencies: - dependency-name: pillow dependency-version: 12.1.1 dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- chart_data_extractor/poetry.lock | 183 ++++++++++++++++--------------- 1 file changed, 97 insertions(+), 86 deletions(-) diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index 2bbbf086..b9e839ea 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -475,100 +475,111 @@ files = [ [[package]] name = "pillow" -version = "10.4.0" -description = "Python Imaging Library (Fork)" +version = "12.1.1" +description = "Python Imaging Library (fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, + {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, + {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, + {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, + {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, + {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, + {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, + {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, + {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, + {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, + {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, + {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, + {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, + {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, + {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, + {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, + {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, + {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, + {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, + {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, + {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, + {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, + {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions ; python_version < \"3.10\""] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] From 4aabc6cbdb0166939793b3eb014c8bc2bf33105a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:17:07 -0800 Subject: [PATCH 648/722] Update dependency dotenv to v16.6.1 (#206) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8f43f86..51081c61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,7 +56,7 @@ importers: version: 20.19.33 dotenv: specifier: ^16.4.5 - version: 16.4.7 + version: 16.6.1 knip: specifier: ^5.25.1 version: 5.43.6(@types/node@20.19.33)(typescript@5.7.3) @@ -1038,8 +1038,8 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} e2b@2.12.1: @@ -1787,6 +1787,7 @@ packages: tar@7.5.7: resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2892,7 +2893,7 @@ snapshots: dependencies: esutils: 2.0.3 - dotenv@16.4.7: {} + dotenv@16.6.1: {} e2b@2.12.1: dependencies: From ee3bcca0c7d932b124ed56fcb323bf5e9f2e9acf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 10:35:07 -0800 Subject: [PATCH 649/722] Update dependency nltk to v3.9.3 [SECURITY] (#209) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 15ae1454..70f37bed 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -19,7 +19,7 @@ gensim==4.3.3 # unmaintained, blocking numpy and scipy bump imageio==2.37.2 joblib==1.5.3 librosa==0.11.0 -nltk==3.9.2 +nltk==3.9.3 numpy==1.26.4 # bump blocked by gensim numba==0.61.2 opencv-python==4.11.0.86 From ef62fb88c458af6d6b1ff66efaeff83e6c1c9057 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:00:09 -0800 Subject: [PATCH 650/722] Update dependency e2b (#210) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 85 ++++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51081c61..baa633d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: dependencies: e2b: specifier: ^2.8.4 - version: 2.12.1 + version: 2.13.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -881,9 +881,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.2: - resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} - engines: {node: 20 || >=22} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -895,9 +895,9 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1042,8 +1042,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.12.1: - resolution: {integrity: sha512-qKYwS0VSZqvtWAT4OrCtOwRhhMlcd359zyFRGAZZ1wpYHHjr9zR872UCoDb/d5jFVUsREcUgktURc47XxfznPg==} + e2b@2.13.0: + resolution: {integrity: sha512-tYsRDXKx47WoV0lVHZxg1uGlSGC2+085Vy+LMxAnnw96vCQm0lBIKPaxV59xDkQZp4yI9/vgZtd2NzNNnoQPTg==} engines: {node: '>=20'} easy-table@1.2.0: @@ -1434,9 +1434,9 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@10.2.0: - resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} - engines: {node: 20 || >=22} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1449,11 +1449,15 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} minizlib@3.1.0: @@ -1557,9 +1561,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -1784,10 +1788,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.5.7: - resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + tar@7.5.9: + resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2298,7 +2301,7 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -2635,7 +2638,7 @@ snapshots: debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.5 + minimatch: 9.0.9 semver: 7.6.0 ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: @@ -2760,9 +2763,7 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@4.0.2: - dependencies: - jackspeak: 4.2.3 + balanced-match@4.0.4: {} better-path-resolve@1.0.0: dependencies: @@ -2777,9 +2778,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.2: + brace-expansion@5.0.4: dependencies: - balanced-match: 4.0.2 + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -2895,7 +2896,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.12.1: + e2b@2.13.0: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) @@ -2906,7 +2907,7 @@ snapshots: glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.7 + tar: 7.5.9 easy-table@1.2.0: dependencies: @@ -3159,10 +3160,10 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.2.3 - minimatch: 10.2.0 - minipass: 7.1.2 + minimatch: 10.2.4 + minipass: 7.1.3 package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 + path-scurry: 2.0.2 glob@7.2.3: dependencies: @@ -3390,9 +3391,9 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@10.2.0: + minimatch@10.2.4: dependencies: - brace-expansion: 5.0.2 + brace-expansion: 5.0.4 minimatch@3.1.2: dependencies: @@ -3406,13 +3407,17 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mlly@1.8.0: dependencies: @@ -3504,10 +3509,10 @@ snapshots: path-key@3.1.1: {} - path-scurry@2.0.1: + path-scurry@2.0.2: dependencies: lru-cache: 11.2.6 - minipass: 7.1.2 + minipass: 7.1.3 path-type@4.0.0: {} @@ -3708,11 +3713,11 @@ snapshots: tapable@2.2.1: {} - tar@7.5.7: + tar@7.5.9: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 From c45426294f4a9de1149fff2b5f48c9f2cac23ede Mon Sep 17 00:00:00 2001 From: Matt Brockman Date: Thu, 5 Mar 2026 10:43:18 -0800 Subject: [PATCH 651/722] add workflow dispatch to deploy the template (#211) * build prod template has a workflow dispatch --- .github/workflows/build_prod_template.yml | 42 +++++++++++++++++++++++ .github/workflows/build_test_template.yml | 10 +++--- template/build_ci.py | 10 +++++- template/build_prod.py | 5 +++ 4 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/build_prod_template.yml diff --git a/.github/workflows/build_prod_template.yml b/.github/workflows/build_prod_template.yml new file mode 100644 index 00000000..3472f462 --- /dev/null +++ b/.github/workflows/build_prod_template.yml @@ -0,0 +1,42 @@ +name: Build Prod Template + +on: + workflow_dispatch: + inputs: + skip_cache: + description: Skip build cache + required: false + type: boolean + default: false + +concurrency: + group: Release-${{ github.ref }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + build-template: + name: Build E2B template + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install development dependencies + working-directory: ./template + run: pip install -r requirements-dev.txt + + - name: Build E2B template + id: build-template + working-directory: ./template + run: | + python build_prod.py + env: + E2B_API_KEY: ${{ secrets.E2B_PROD_API_KEY }} + E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} + SKIP_CACHE: ${{ inputs.skip_cache }} diff --git a/.github/workflows/build_test_template.yml b/.github/workflows/build_test_template.yml index 3f39bc41..182426f9 100644 --- a/.github/workflows/build_test_template.yml +++ b/.github/workflows/build_test_template.yml @@ -22,7 +22,7 @@ jobs: name: Build E2B Template runs-on: ubuntu-latest outputs: - template_id: ${{ steps.generate-template-id.outputs.template_id }} + template_id: ${{ steps.build-template.outputs.template_id }} steps: - name: Checkout repository uses: actions/checkout@v4 @@ -42,12 +42,12 @@ jobs: working-directory: ./template run: pip install -r requirements-dev.txt - - name: Generate Template ID + - name: Generate Template Name id: generate-template-id run: | E2B_TESTS_TEMPLATE=e2b-code-interpreter-ci-$(uuidgen) - echo "Generated Template ID: $E2B_TESTS_TEMPLATE" - echo "template_id=$E2B_TESTS_TEMPLATE" >> $GITHUB_OUTPUT + echo "Generated Template Name: $E2B_TESTS_TEMPLATE" + echo "template_name=$E2B_TESTS_TEMPLATE" >> $GITHUB_OUTPUT - name: Build E2B template id: build-template @@ -57,4 +57,4 @@ jobs: env: E2B_API_KEY: ${{ secrets.E2B_API_KEY }} E2B_DOMAIN: ${{ inputs.E2B_DOMAIN }} - E2B_TESTS_TEMPLATE: ${{ steps.generate-template-id.outputs.template_id }} + E2B_TESTS_TEMPLATE: ${{ steps.generate-template-id.outputs.template_name }} diff --git a/template/build_ci.py b/template/build_ci.py index 1c89b472..13c0c311 100644 --- a/template/build_ci.py +++ b/template/build_ci.py @@ -2,10 +2,18 @@ from e2b import Template, default_build_logger from template import make_template -Template.build( +build_info = Template.build( make_template(), alias=os.environ["E2B_TESTS_TEMPLATE"], cpu_count=2, memory_mb=2048, on_build_logs=default_build_logger(), ) + +template_id = build_info.template_id +print(f"Built template ID: {template_id}") + +github_output = os.getenv("GITHUB_OUTPUT") +if github_output: + with open(github_output, "a", encoding="utf-8") as fh: + fh.write(f"template_id={template_id}\n") diff --git a/template/build_prod.py b/template/build_prod.py index 5274d8c4..1615ebff 100644 --- a/template/build_prod.py +++ b/template/build_prod.py @@ -1,13 +1,18 @@ +import os + from dotenv import load_dotenv from e2b import Template, default_build_logger from template import make_template load_dotenv() +skip_cache = os.getenv("SKIP_CACHE", "false").lower() == "true" + Template.build( make_template(), alias="code-interpreter-v1", cpu_count=2, memory_mb=2048, + skip_cache=skip_cache, on_build_logs=default_build_logger(), ) From 5b971b5b0d3e5c8e32a37e75b8ddb8f403659a0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 02:33:17 -0700 Subject: [PATCH 652/722] Update dependency e2b (#214) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baa633d8..ed527dba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: dependencies: e2b: specifier: ^2.8.4 - version: 2.13.0 + version: 2.14.1 devDependencies: '@types/node': specifier: ^20.19.19 @@ -1042,8 +1042,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.13.0: - resolution: {integrity: sha512-tYsRDXKx47WoV0lVHZxg1uGlSGC2+085Vy+LMxAnnw96vCQm0lBIKPaxV59xDkQZp4yI9/vgZtd2NzNNnoQPTg==} + e2b@2.14.1: + resolution: {integrity: sha512-g0NPZNzwIaePTahu9ixBtqrw9IZQ8ThK8dt+DU394+jmxQJ+69c2t8A0j973/j+bHo3QdNFxIRIH6zDcC3ueaw==} engines: {node: '>=20'} easy-table@1.2.0: @@ -1788,8 +1788,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.5.9: - resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} + tar@7.5.11: + resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} engines: {node: '>=18'} text-table@0.2.0: @@ -2896,7 +2896,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.13.0: + e2b@2.14.1: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) @@ -2907,7 +2907,7 @@ snapshots: glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.9 + tar: 7.5.11 easy-table@1.2.0: dependencies: @@ -3713,7 +3713,7 @@ snapshots: tapable@2.2.1: {} - tar@7.5.9: + tar@7.5.11: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 From 4e0369c633e66edde8e5ca029898e27961acea8d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 02:33:46 -0700 Subject: [PATCH 653/722] Update dependency e2b to v2.15.2 (#215) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index ba5a7a0a..72a43e72 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.13.2 +e2b==2.15.2 python-dotenv==1.2.1 \ No newline at end of file From 08b73a41ed63dd7f5df8d9bc94edffc33603855a Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:27:46 +0100 Subject: [PATCH 654/722] Update GitHub workflows to Python 3.13 (#194) * Update GitHub workflows to Python 3.13 Upgrade all Python workflow jobs from Python 3.12 (and 3.10 for linting) to Python 3.13, and update setup-python action from v4 to v6 to support the new version. Co-Authored-By: Claude Haiku 4.5 * Use .tool-versions for Python and Poetry versions in workflows Add a .tool-versions file (python 3.13, poetry 1.8.1) and use wistia/parse-tool-versions to read versions in all workflows, replacing hardcoded version strings with env var references. Co-Authored-By: Claude Opus 4.6 * Downgrade Python version from 3.13 to 3.10 * Fix Python version divergence in build_prod_template.yml Update build_prod_template.yml to use TOOL_VERSION_PYTHON from .tool-versions instead of hardcoded '3.13', matching the pattern used in build_test_template.yml. This ensures consistency between test and production template builds. Co-authored-by: Mish Ushakov --------- Co-authored-by: Claude Haiku 4.5 Co-authored-by: Cursor Agent Co-authored-by: Mish Ushakov --- .github/workflows/build_prod_template.yml | 10 ++++- .github/workflows/build_test_template.yml | 9 ++++- .github/workflows/charts_tests.yml | 13 +++++-- .github/workflows/lint.yml | 13 +++++-- .github/workflows/performance_tests.yml | 13 +++++-- .github/workflows/python_tests.yml | 13 +++++-- .github/workflows/release.yml | 45 +++++++++++++++++++---- .github/workflows/release_candidates.yml | 13 +++++-- .tool-versions | 2 + 9 files changed, 106 insertions(+), 25 deletions(-) create mode 100644 .tool-versions diff --git a/.github/workflows/build_prod_template.yml b/.github/workflows/build_prod_template.yml index 3472f462..ac2cfb33 100644 --- a/.github/workflows/build_prod_template.yml +++ b/.github/workflows/build_prod_template.yml @@ -23,9 +23,17 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install development dependencies working-directory: ./template diff --git a/.github/workflows/build_test_template.yml b/.github/workflows/build_test_template.yml index 182426f9..348001e0 100644 --- a/.github/workflows/build_test_template.yml +++ b/.github/workflows/build_test_template.yml @@ -27,6 +27,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set package version working-directory: ./template run: | @@ -36,7 +43,7 @@ jobs: - uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install development dependencies working-directory: ./template diff --git a/.github/workflows/charts_tests.yml b/.github/workflows/charts_tests.yml index db3276c2..f2837786 100644 --- a/.github/workflows/charts_tests.yml +++ b/.github/workflows/charts_tests.yml @@ -17,15 +17,22 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: '3.12' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4b89bedb..08beb345 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,6 +15,13 @@ jobs: - name: Checkout Repo uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - uses: pnpm/action-setup@v4 with: version: 9.15.9 @@ -34,14 +41,14 @@ jobs: run: pnpm install --frozen-lockfile - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: '3.10' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/performance_tests.yml b/.github/workflows/performance_tests.yml index 7f1c8bb2..a0f20aa5 100644 --- a/.github/workflows/performance_tests.yml +++ b/.github/workflows/performance_tests.yml @@ -31,15 +31,22 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: '3.12' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml index 6af7aa6b..8149c91c 100644 --- a/.github/workflows/python_tests.yml +++ b/.github/workflows/python_tests.yml @@ -27,15 +27,22 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: '3.12' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c90384de..847699bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,6 +119,13 @@ jobs: - name: Checkout Repo uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Install pnpm uses: pnpm/action-setup@v3 id: pnpm-install @@ -126,14 +133,14 @@ jobs: version: 9.5 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: "3.12" + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -179,6 +186,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -202,7 +216,7 @@ jobs: - uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install development dependencies working-directory: ./template @@ -227,9 +241,17 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install development dependencies working-directory: ./template @@ -284,15 +306,22 @@ jobs: with: token: ${{ steps.app-token.outputs.token }} + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: - python-version: "3.12" + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.8.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/release_candidates.yml b/.github/workflows/release_candidates.yml index 3bc8101e..cd09fce4 100644 --- a/.github/workflows/release_candidates.yml +++ b/.github/workflows/release_candidates.yml @@ -17,6 +17,13 @@ jobs: with: ref: ${{ github.head_ref }} + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - uses: pnpm/action-setup@v3 if: ${{ contains( github.event.pull_request.labels.*.name, 'js-rc') }} with: @@ -58,16 +65,16 @@ jobs: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} with: - python-version: "3.12" + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 if: ${{ contains( github.event.pull_request.labels.*.name, 'python-rc') }} with: - version: 1.8.1 + version: '${{ env.TOOL_VERSION_POETRY }}' virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..f2006127 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +python 3.10 +poetry 1.8.1 From b6ac8ad922730716f789e418012f0aae653a2e69 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 11 Mar 2026 20:04:51 +0100 Subject: [PATCH 655/722] Update e2b_charts dependencies for numpy 2 support (#193) * Update e2b_charts dependencies: relax numpy constraint and bump versions - Change numpy from ^1.26.4 to >=1.26.4 to allow numpy 2.x - Bump matplotlib to ^3.10.3, pydantic to ^2.9.1 - Bump dev deps: pytest to ^8.3.5, python-dotenv to ^1.2.1 - Regenerate poetry.lock Co-Authored-By: Claude Opus 4.6 * added changeset * Pin numpy to ^2.3.5 in e2b_charts Co-Authored-By: Claude Opus 4.6 * Bump Python requirement to ^3.13 and sync poetry lock numpy ^2.3.5 requires Python >=3.11; bumping to ^3.13 per project needs. Co-Authored-By: Claude Opus 4.6 * Change Python requirement from ^3.13 to ^3.12 and sync lock file Co-Authored-By: Claude Opus 4.6 * Change Python requirement from ^3.12 to ^3.11 and sync lock file Co-Authored-By: Claude Opus 4.6 * Fix numpy 2.x Decimal conversion in pie chart extraction numpy.float32 no longer implicitly converts to Decimal in numpy 2.x. Wrap with float() before passing to Decimal. Co-Authored-By: Claude Opus 4.6 * Downgrade Python version requirement to 3.10 * Update e2b_charts: numpy ^2.2.6, fix pie chart, update CI tooling - Bump numpy from >=1.26.4 to ^2.2.6 (last 2.x supporting Python 3.10) - Fix numpy 2.x Decimal conversion in pie chart (wrap with float()) - Format pie.py per ruff - Update .tool-versions to Python 3.12 and Poetry 2.1.1 - Update charts_tests.yml to read versions from .tool-versions - Regenerate poetry.lock Co-Authored-By: Claude Opus 4.6 * Revert .tool-versions to Python 3.10 and Poetry 1.8.1 Co-Authored-By: Claude Opus 4.6 * Update changeset to major bump Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- .changeset/dry-lions-stare.md | 5 + chart_data_extractor/e2b_charts/charts/pie.py | 6 +- chart_data_extractor/poetry.lock | 399 +++++++++++++----- chart_data_extractor/pyproject.toml | 12 +- 4 files changed, 307 insertions(+), 115 deletions(-) create mode 100644 .changeset/dry-lions-stare.md diff --git a/.changeset/dry-lions-stare.md b/.changeset/dry-lions-stare.md new file mode 100644 index 00000000..39666ae2 --- /dev/null +++ b/.changeset/dry-lions-stare.md @@ -0,0 +1,5 @@ +--- +'@e2b/data-extractor': major +--- + +updated dependencies to latest diff --git a/chart_data_extractor/e2b_charts/charts/pie.py b/chart_data_extractor/e2b_charts/charts/pie.py index bf722a1f..2581830b 100644 --- a/chart_data_extractor/e2b_charts/charts/pie.py +++ b/chart_data_extractor/e2b_charts/charts/pie.py @@ -25,7 +25,11 @@ def _extract_info(self, ax: Axes) -> None: for wedge in ax.patches: pie_data = PieData( label=wedge.get_label(), - angle=abs(dynamic_round(Decimal(wedge.theta2) - Decimal(wedge.theta1))), + angle=abs( + dynamic_round( + Decimal(float(wedge.theta2)) - Decimal(float(wedge.theta1)) + ) + ), radius=wedge.r, ) diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index b9e839ea..ffa8368d 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -128,17 +128,20 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] @@ -353,52 +356,67 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.2" +version = "3.10.8" description = "Python plotting package" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, - {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, - {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, - {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, - {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, - {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, - {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, - {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, - {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, - {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, - {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, - {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, - {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, - {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, ] [package.dependencies] @@ -409,56 +427,159 @@ kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" -pyparsing = ">=2.3.1" +pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "numpy" -version = "1.26.4" +version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] +markers = "python_version < \"3.13\"" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, + {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, + {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, + {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, + {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, + {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, + {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, + {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, + {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, + {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, + {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, + {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, +] + +[[package]] +name = "numpy" +version = "2.4.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, + {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, + {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, + {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, + {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, + {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, + {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, + {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, + {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, + {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, + {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, + {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, + {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, + {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, + {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, + {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, + {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, + {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, + {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, + {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, + {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, + {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, + {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, + {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, + {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, + {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, + {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, + {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, + {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, + {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, + {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, + {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, + {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, + {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, + {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, + {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, + {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, + {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, + {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, ] [[package]] @@ -724,6 +845,21 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyparsing" version = "3.2.0" @@ -741,26 +877,27 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-dotenv" @@ -795,14 +932,14 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.2.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, + {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, ] [package.extras] @@ -850,15 +987,60 @@ files = [ [[package]] name = "tomli" -version = "2.0.2" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] [[package]] @@ -867,13 +1049,14 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +markers = {dev = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "068c79d18500bf2148afd71e659d29f5cff8a7bc089ddba56de911ba31714bdd" +content-hash = "7c5ae094b100602377714f266326fd947b979c004c0bd1dcaf915f290f63069b" diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 1f33bbd0..a92a86ea 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -12,13 +12,13 @@ packages = [{ include = "e2b_charts" }] [tool.poetry.dependencies] python = "^3.10" -numpy = "^1.26.4" -matplotlib = "^3.9.2" -pydantic = "^2.8.2" +numpy = "^2.2.6" +matplotlib = "^3.10.3" +pydantic = "^2.9.1" [tool.poetry.group.dev.dependencies] -pytest = "^7.4.0" -python-dotenv = "^1.0.0" +pytest = "^8.3.5" +python-dotenv = "^1.2.1" pytest-dotenv = "^0.5.2" ruff = "^0.11.12" @@ -31,4 +31,4 @@ build-backend = "poetry.core.masonry.api" "Bug Tracker" = "https://github.com/e2b-dev/code-interpreter/issues" [tool.ruff.lint] -ignore = ["F401", "F403"] \ No newline at end of file +ignore = ["F401", "F403"] From aa7e267df59e0957ee1352c27574679e2d1196a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 12 Mar 2026 09:58:51 +0000 Subject: [PATCH 656/722] [skip ci] Release new versions --- .changeset/dry-lions-stare.md | 5 - chart_data_extractor/package.json | 2 +- chart_data_extractor/pyproject.toml | 2 +- .../v2.4.1/sandbox/page.mdx | 492 +++++++++--------- 4 files changed, 248 insertions(+), 253 deletions(-) delete mode 100644 .changeset/dry-lions-stare.md diff --git a/.changeset/dry-lions-stare.md b/.changeset/dry-lions-stare.md deleted file mode 100644 index 39666ae2..00000000 --- a/.changeset/dry-lions-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/data-extractor': major ---- - -updated dependencies to latest diff --git a/chart_data_extractor/package.json b/chart_data_extractor/package.json index 4015fd6a..89927490 100644 --- a/chart_data_extractor/package.json +++ b/chart_data_extractor/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/data-extractor", "private": true, - "version": "0.0.4", + "version": "1.0.0", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index a92a86ea..1604bbac 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-charts" -version = "0.0.4" +version = "1.0.0" description = "Package for extracting data for E2B Code Interpreter" authors = ["e2b "] license = "MIT" diff --git a/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx index d6466bf3..f668374c 100644 --- a/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx +++ b/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx @@ -3,252 +3,6 @@ -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - -### remove\_code\_context - -```python -def remove_code_context(context: Union[Context, str]) -> None -``` - -Removes a context. - -**Arguments**: - -- `context`: Context to remove. Can be a Context object or a context ID string. - -**Returns**: - -None - - -### list\_code\_contexts - -```python -def list_code_contexts() -> List[Context] -``` - -List all contexts. - -**Returns**: - -List of contexts. - - -### restart\_code\_context - -```python -def restart_code_context(context: Union[Context, str]) -> None -``` - -Restart a context. - -**Arguments**: - -- `context`: Context to restart. Can be a Context object or a context ID string. - -**Returns**: - -None - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - ## AsyncSandbox ```python @@ -817,3 +571,249 @@ The language of the context. The working directory of the context. + + + +## Sandbox + +```python +class Sandbox(BaseSandbox) +``` + +E2B cloud sandbox is a secure and isolated cloud environment. + +The sandbox allows you to: +- Access Linux OS +- Create, list, and delete files and directories +- Run commands +- Run isolated code +- Access the internet + +Check docs [here](https://e2b.dev/docs). + +Use the `Sandbox.create()` to create a new sandbox. + +**Example**: + +```python +from e2b_code_interpreter import Sandbox + +sandbox = Sandbox.create() +``` + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Union[Literal["python"], None] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code as Python. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + language: Optional[str] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code for the specified language. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. +If no language is specified, Python is used. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `language`: Language to use for code execution. If not defined, the default Python context is used. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### run\_code + +```python +@overload +def run_code(code: str, + context: Optional[Context] = None, + on_stdout: Optional[OutputHandler[OutputMessage]] = None, + on_stderr: Optional[OutputHandler[OutputMessage]] = None, + on_result: Optional[OutputHandler[Result]] = None, + on_error: Optional[OutputHandler[ExecutionError]] = None, + envs: Optional[Dict[str, str]] = None, + timeout: Optional[float] = None, + request_timeout: Optional[float] = None) -> Execution +``` + +Runs the code in the specified context, if not specified, the default context is used. + +Specify the `language` or `context` option to run the code as a different language or in a different `Context`. + +You can reference previously defined variables, imports, and functions in the code. + +**Arguments**: + +- `code`: Code to execute +- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. +- `on_stdout`: Callback for stdout messages +- `on_stderr`: Callback for stderr messages +- `on_result`: Callback for the `Result` object +- `on_error`: Callback for the `ExecutionError` object +- `envs`: Custom environment variables +- `timeout`: Timeout for the code execution in **seconds** +- `request_timeout`: Timeout for the request in **seconds** + +**Returns**: + +`Execution` result object + + +### create\_code\_context + +```python +def create_code_context(cwd: Optional[str] = None, + language: Optional[str] = None, + request_timeout: Optional[float] = None) -> Context +``` + +Creates a new context to run code in. + +**Arguments**: + +- `cwd`: Set the current working directory for the context, defaults to `/home/user` +- `language`: Language of the context. If not specified, defaults to Python +- `request_timeout`: Timeout for the request in **milliseconds** + +**Returns**: + +Context object + + +### remove\_code\_context + +```python +def remove_code_context(context: Union[Context, str]) -> None +``` + +Removes a context. + +**Arguments**: + +- `context`: Context to remove. Can be a Context object or a context ID string. + +**Returns**: + +None + + +### list\_code\_contexts + +```python +def list_code_contexts() -> List[Context] +``` + +List all contexts. + +**Returns**: + +List of contexts. + + +### restart\_code\_context + +```python +def restart_code_context(context: Union[Context, str]) -> None +``` + +Restart a context. + +**Arguments**: + +- `context`: Context to restart. Can be a Context object or a context ID string. + +**Returns**: + +None + + + + +## ChartType + +```python +class ChartType(str, enum.Enum) +``` + +Chart types + + +## ScaleType + +```python +class ScaleType(str, enum.Enum) +``` + +Ax scale types + + +## Chart + +```python +class Chart() +``` + +Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. + + + + + From fff3df6134db4029e331b4339d39978658e66bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Thu, 12 Mar 2026 03:13:43 -0700 Subject: [PATCH 657/722] fix(release): chart release skipped (#218) --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 847699bc..5cd11506 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -111,6 +111,7 @@ jobs: charts-release: name: Charts release + needs: [changes] if: needs.changes.outputs.charts == 'true' runs-on: ubuntu-latest outputs: From fb13ab09b7b26f806e0d94ac0f5b676e1949b223 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:33:32 +0100 Subject: [PATCH 658/722] Update Python 3.13 support and bump dependencies (#192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Python 3.13 support: bump dependencies and fix numpy constraints Update template to Python 3.13 base image and bump key packages for compatibility: - numpy 1.26.4 → 2.3.5 (Python 3.13 requires numpy 2.x) - scipy 1.13.1 → 1.17.0, gensim 4.3.3 → 4.4.0, numba 0.61.2 → 0.63.1, spacy 3.8.2 → 3.8.11 - e2b_charts: relax numpy constraint from ^1.26.4 to >=1.26.4 for numpy 2 compatibility Co-Authored-By: Claude Haiku 4.5 * Regenerate poetry.lock for updated dependencies Co-Authored-By: Claude Opus 4.6 * Install e2b_charts with --no-deps to bypass numpy<2 pin on PyPI The published e2b_charts 0.0.4 on PyPI still has numpy<2.0.0. Until a new version is published, install it separately with --no-deps. Co-Authored-By: Claude Opus 4.6 * Revert template/requirements.txt and build script changes Keep these files as-is on main; e2b_charts updates will be in a separate PR. Co-Authored-By: Claude Opus 4.6 * moved the changes here to separate pr * keep comment * added changeset * re-try with fix missing * return * skip cache * return * install r-base with fix missing * simplify r install --------- Co-authored-by: Claude Haiku 4.5 Co-authored-by: Jakub Novák --- .changeset/tangy-grapes-crash.md | 5 +++++ template/requirements.txt | 10 +++++----- template/template.py | 22 ++++++---------------- 3 files changed, 16 insertions(+), 21 deletions(-) create mode 100644 .changeset/tangy-grapes-crash.md diff --git a/.changeset/tangy-grapes-crash.md b/.changeset/tangy-grapes-crash.md new file mode 100644 index 00000000..7efed436 --- /dev/null +++ b/.changeset/tangy-grapes-crash.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': minor +--- + +updated Python version to 3.13 diff --git a/template/requirements.txt b/template/requirements.txt index 70f37bed..1d1bc031 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -15,13 +15,13 @@ e2b_charts aiohttp==3.13.3 beautifulsoup4==4.14.3 bokeh==3.8.2 -gensim==4.3.3 # unmaintained, blocking numpy and scipy bump +gensim==4.4.0 imageio==2.37.2 joblib==1.5.3 librosa==0.11.0 nltk==3.9.3 -numpy==1.26.4 # bump blocked by gensim -numba==0.61.2 +numpy==2.3.5 +numba==0.63.1 opencv-python==4.11.0.86 openpyxl==3.1.5 plotly==6.0.1 @@ -32,10 +32,10 @@ pytz==2025.2 requests==2.32.5 scikit-image==0.25.2 scikit-learn==1.6.1 -scipy==1.13.1 # bump blocked by gensim +scipy==1.17.0 seaborn==0.13.2 soundfile==0.13.1 -spacy==3.8.11 # doesn't work on 3.13.x +spacy==3.8.11 textblob==0.19.0 tornado==6.5.4 urllib3==2.6.3 diff --git a/template/template.py b/template/template.py index 7fb2f1e0..e10e89a8 100644 --- a/template/template.py +++ b/template/template.py @@ -9,7 +9,7 @@ def make_template( # Start with base template template = ( Template() - .from_image("python:3.12") + .from_image("python:3.13") .set_user("root") .set_workdir("/root") .set_envs( @@ -51,21 +51,11 @@ def make_template( # Install R Kernel if requested if "r" in enabled_kernels: - template = ( - template.run_cmd( - [ - "sudo gpg --keyserver keyserver.ubuntu.com --recv-key 95C0FAF38DB3CCAD0C080A7BDC78B2DDEABC47B7", - "sudo gpg --armor --export 95C0FAF38DB3CCAD0C080A7BDC78B2DDEABC47B7 | sudo tee /etc/apt/trusted.gpg.d/cran_debian_key.asc", - 'echo "deb https://cloud.r-project.org/bin/linux/debian trixie-cran40/" | sudo tee /etc/apt/sources.list.d/cran.list', - ] - ) - .apt_install("r-base=${R_VERSION} r-base-dev") - .run_cmd( - [ - "R -e \"install.packages('IRkernel', repos='https://cloud.r-project.org')\"", - "R -e \"IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')\"", - ] - ) + template = template.apt_install("r-base=${R_VERSION} r-base-dev").run_cmd( + [ + "R -e \"install.packages('IRkernel', repos='https://cloud.r-project.org')\"", + "R -e \"IRkernel::installspec(user = FALSE, name = 'r', displayname = 'R')\"", + ] ) # Install JavaScript Kernel if requested From 93842f95290f59ce0260e93c2a4e26baa5b62415 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 12 Mar 2026 17:01:07 +0000 Subject: [PATCH 659/722] [skip ci] Release new versions --- .changeset/tangy-grapes-crash.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/tangy-grapes-crash.md diff --git a/.changeset/tangy-grapes-crash.md b/.changeset/tangy-grapes-crash.md deleted file mode 100644 index 7efed436..00000000 --- a/.changeset/tangy-grapes-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': minor ---- - -updated Python version to 3.13 diff --git a/template/package.json b/template/package.json index d8c5dc6b..17497708 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.2.1", + "version": "0.3.0", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 77d722ad203eb2cc7f77d0fcfca9e4ae207485d7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 00:29:05 -0700 Subject: [PATCH 660/722] Update dependency tornado to v6.5.5 [SECURITY] (#217) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 1d1bc031..e2d0ce04 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -37,7 +37,7 @@ seaborn==0.13.2 soundfile==0.13.1 spacy==3.8.11 textblob==0.19.0 -tornado==6.5.4 +tornado==6.5.5 urllib3==2.6.3 xarray==2025.4.0 xlrd==2.0.2 From 09b5c72f578a23281b24d56b570ca5b89cf40410 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 00:36:40 -0700 Subject: [PATCH 661/722] Update dependency bun to v1.3.10 (#205) --- .github/workflows/js_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index e39fcebc..395c7c52 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -62,7 +62,7 @@ jobs: - name: Install Bun uses: oven-sh/setup-bun@v2 with: - bun-version: 1.2.15 + bun-version: 1.3.10 - name: Run Bun tests run: pnpm test:bun From cdb96a99e501d6f07e46d7f47890d6a446bc8c44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 07:41:56 +0000 Subject: [PATCH 662/722] Update patch-updates (#220) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .tool-versions | 2 +- chart_data_extractor/poetry.lock | 154 +++++++++++++++---------------- pnpm-lock.yaml | 54 +++++------ template/requirements-dev.txt | 2 +- template/requirements.txt | 4 +- 5 files changed, 108 insertions(+), 108 deletions(-) diff --git a/.tool-versions b/.tool-versions index f2006127..d98d583a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ python 3.10 -poetry 1.8.1 +poetry 1.8.5 diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index ffa8368d..74c58811 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -501,85 +501,85 @@ files = [ [[package]] name = "numpy" -version = "2.4.2" +version = "2.4.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" groups = ["main"] markers = "python_version >= \"3.13\"" files = [ - {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, - {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, - {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, - {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, - {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, - {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, - {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, - {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, - {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, - {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, - {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, - {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, - {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, - {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, - {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, - {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, - {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, - {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, - {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, - {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, + {file = "numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb"}, + {file = "numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147"}, + {file = "numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920"}, + {file = "numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9"}, + {file = "numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470"}, + {file = "numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71"}, + {file = "numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15"}, + {file = "numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52"}, + {file = "numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd"}, + {file = "numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec"}, + {file = "numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67"}, + {file = "numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef"}, + {file = "numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e"}, + {file = "numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4"}, + {file = "numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18"}, + {file = "numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5"}, + {file = "numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97"}, + {file = "numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c"}, + {file = "numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc"}, + {file = "numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9"}, + {file = "numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5"}, + {file = "numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e"}, + {file = "numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3"}, + {file = "numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9"}, + {file = "numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee"}, + {file = "numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f"}, + {file = "numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f"}, + {file = "numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc"}, + {file = "numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476"}, + {file = "numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92"}, + {file = "numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687"}, + {file = "numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd"}, + {file = "numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d"}, + {file = "numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875"}, + {file = "numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070"}, + {file = "numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73"}, + {file = "numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368"}, + {file = "numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22"}, + {file = "numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a"}, + {file = "numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349"}, + {file = "numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c"}, + {file = "numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26"}, + {file = "numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02"}, + {file = "numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4"}, + {file = "numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168"}, + {file = "numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b"}, + {file = "numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950"}, + {file = "numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd"}, + {file = "numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24"}, + {file = "numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0"}, + {file = "numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0"}, + {file = "numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a"}, + {file = "numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc"}, + {file = "numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7"}, + {file = "numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657"}, + {file = "numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7"}, + {file = "numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093"}, + {file = "numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a"}, + {file = "numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611"}, + {file = "numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720"}, + {file = "numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5"}, + {file = "numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0"}, + {file = "numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b"}, + {file = "numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857"}, + {file = "numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5"}, + {file = "numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd"}, ] [[package]] @@ -932,14 +932,14 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.2.1" +version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, - {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, + {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, + {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, ] [package.extras] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed527dba..3bae84f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@changesets/read': specifier: ^0.6.2 - version: 0.6.6 + version: 0.6.7 '@stylistic/eslint-plugin-ts': specifier: ^1.6.2 version: 1.8.1(eslint@8.57.1)(typescript@5.7.3) @@ -53,13 +53,13 @@ importers: devDependencies: '@types/node': specifier: ^20.19.19 - version: 20.19.33 + version: 20.19.37 dotenv: specifier: ^16.4.5 version: 16.6.1 knip: specifier: ^5.25.1 - version: 5.43.6(@types/node@20.19.33)(typescript@5.7.3) + version: 5.43.6(@types/node@20.19.37)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 version: 17.1.18 @@ -77,7 +77,7 @@ importers: version: 5.7.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) + version: 3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) python: {} @@ -101,11 +101,11 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.2': - resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - '@changesets/read@0.6.6': - resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} @@ -679,8 +679,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.33': - resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} + '@types/node@20.19.37': + resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -2081,16 +2081,16 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.2': + '@changesets/parse@0.4.3': dependencies: '@changesets/types': 6.1.0 js-yaml: 4.1.1 - '@changesets/read@0.6.6': + '@changesets/read@0.6.7': dependencies: '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.2 + '@changesets/parse': 0.4.3 '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 @@ -2506,7 +2506,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.33': + '@types/node@20.19.37': dependencies: undici-types: 6.21.0 @@ -2691,13 +2691,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -3282,11 +3282,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.43.6(@types/node@20.19.33)(typescript@5.7.3): + knip@5.43.6(@types/node@20.19.37)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.19.33 + '@types/node': 20.19.37 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -3858,13 +3858,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3879,7 +3879,7 @@ snapshots: - tsx - yaml - vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): + vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -3888,16 +3888,16 @@ snapshots: rollup: 4.39.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.19.33 + '@types/node': 20.19.37 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0): + vitest@3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3915,11 +3915,11 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.2.4(@types/node@20.19.33)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.33 + '@types/node': 20.19.37 transitivePeerDependencies: - jiti - less diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index 72a43e72..c1821021 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ e2b==2.15.2 -python-dotenv==1.2.1 \ No newline at end of file +python-dotenv==1.2.2 \ No newline at end of file diff --git a/template/requirements.txt b/template/requirements.txt index e2d0ce04..86c715f2 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -16,7 +16,7 @@ aiohttp==3.13.3 beautifulsoup4==4.14.3 bokeh==3.8.2 gensim==4.4.0 -imageio==2.37.2 +imageio==2.37.3 joblib==1.5.3 librosa==0.11.0 nltk==3.9.3 @@ -32,7 +32,7 @@ pytz==2025.2 requests==2.32.5 scikit-image==0.25.2 scikit-learn==1.6.1 -scipy==1.17.0 +scipy==1.17.1 seaborn==0.13.2 soundfile==0.13.1 spacy==3.8.11 From 046fcd915093c25a340d57c6c7c48f05a1ec605b Mon Sep 17 00:00:00 2001 From: Ben Fornefeld <50748440+ben-fornefeld@users.noreply.github.com> Date: Fri, 13 Mar 2026 14:46:38 -0700 Subject: [PATCH 663/722] Remove: SDK Reference Artifacts (#223) remove: sdk reference artifacts --- .github/scripts/is_new_sdk_ref.sh | 11 - .github/workflows/release.yml | 13 - js/package.json | 3 - js/scripts/CustomMarkdownTheme.js | 64 -- js/scripts/generate_sdk_ref.sh | 35 - js/typedoc.json | 31 - pnpm-lock.yaml | 404 +-------- python/package.json | 1 - python/poetry.lock | 783 +---------------- python/pyproject.toml | 3 +- python/scripts/generate_sdk_ref.sh | 30 - .../v1.0.4/charts/page.mdx | 240 ----- .../v1.0.4/consts/page.mdx | 13 - .../v1.0.4/index/page.mdx | 103 --- .../v1.0.4/messaging/page.mdx | 326 ------- .../v1.0.4/sandbox/page.mdx | 312 ------- .../v1.1.0/charts/page.mdx | 240 ----- .../v1.1.0/consts/page.mdx | 13 - .../v1.1.0/index/page.mdx | 103 --- .../v1.1.0/messaging/page.mdx | 326 ------- .../v1.1.0/sandbox/page.mdx | 312 ------- .../v1.1.1/charts/page.mdx | 240 ----- .../v1.1.1/consts/page.mdx | 13 - .../v1.1.1/index/page.mdx | 103 --- .../v1.1.1/messaging/page.mdx | 326 ------- .../v1.1.1/sandbox/page.mdx | 312 ------- .../v1.2.0/charts/page.mdx | 240 ----- .../v1.2.0/consts/page.mdx | 13 - .../v1.2.0/index/page.mdx | 103 --- .../v1.2.0/messaging/page.mdx | 326 ------- .../v1.2.0/sandbox/page.mdx | 312 ------- .../v1.5.0/charts/page.mdx | 240 ----- .../v1.5.0/consts/page.mdx | 13 - .../v1.5.0/index/page.mdx | 103 --- .../v1.5.0/messaging/page.mdx | 326 ------- .../v1.5.0/sandbox/page.mdx | 312 ------- .../v1.5.1/charts/page.mdx | 240 ----- .../v1.5.1/consts/page.mdx | 13 - .../v1.5.1/index/page.mdx | 103 --- .../v1.5.1/messaging/page.mdx | 326 ------- .../v1.5.1/sandbox/page.mdx | 312 ------- .../v2.0.0/charts/page.mdx | 240 ----- .../v2.0.0/consts/page.mdx | 13 - .../v2.0.0/index/page.mdx | 103 --- .../v2.0.0/messaging/page.mdx | 326 ------- .../v2.0.0/sandbox/page.mdx | 312 ------- .../v2.0.1/charts/page.mdx | 240 ----- .../v2.0.1/consts/page.mdx | 13 - .../v2.0.1/index/page.mdx | 103 --- .../v2.0.1/messaging/page.mdx | 326 ------- .../v2.0.1/sandbox/page.mdx | 312 ------- .../v2.1.0/charts/page.mdx | 240 ----- .../v2.1.0/consts/page.mdx | 13 - .../v2.1.0/index/page.mdx | 103 --- .../v2.1.0/messaging/page.mdx | 326 ------- .../v2.1.0/sandbox/page.mdx | 312 ------- .../v2.2.0/charts/page.mdx | 240 ----- .../v2.2.0/consts/page.mdx | 13 - .../v2.2.0/index/page.mdx | 103 --- .../v2.2.0/messaging/page.mdx | 326 ------- .../v2.2.0/sandbox/page.mdx | 312 ------- .../v2.3.0/charts/page.mdx | 240 ----- .../v2.3.0/consts/page.mdx | 13 - .../v2.3.0/index/page.mdx | 103 --- .../v2.3.0/messaging/page.mdx | 326 ------- .../v2.3.0/sandbox/page.mdx | 366 -------- .../v2.3.1/charts/page.mdx | 240 ----- .../v2.3.1/consts/page.mdx | 13 - .../v2.3.1/index/page.mdx | 103 --- .../v2.3.1/messaging/page.mdx | 326 ------- .../v2.3.1/sandbox/page.mdx | 366 -------- .../v2.3.2/charts/page.mdx | 240 ----- .../v2.3.2/consts/page.mdx | 13 - .../v2.3.2/index/page.mdx | 103 --- .../v2.3.2/messaging/page.mdx | 326 ------- .../v2.3.2/sandbox/page.mdx | 366 -------- .../v2.3.3/charts/page.mdx | 240 ----- .../v2.3.3/consts/page.mdx | 13 - .../v2.3.3/index/page.mdx | 103 --- .../v2.3.3/messaging/page.mdx | 326 ------- .../v2.3.3/sandbox/page.mdx | 366 -------- .../v1.0.1/sandbox/page.mdx | 722 --------------- .../v1.0.2/sandbox/page.mdx | 722 --------------- .../v1.0.3/sandbox/page.mdx | 722 --------------- .../v1.0.4/sandbox/page.mdx | 722 --------------- .../v1.0.5/sandbox/page.mdx | 722 --------------- .../v1.1.0/sandbox/page.mdx | 722 --------------- .../v1.1.1/sandbox/page.mdx | 722 --------------- .../v1.2.0/sandbox/page.mdx | 722 --------------- .../v1.2.1/sandbox/page.mdx | 722 --------------- .../v1.5.0/sandbox/page.mdx | 722 --------------- .../v1.5.1/sandbox/page.mdx | 722 --------------- .../v1.5.2/sandbox/page.mdx | 722 --------------- .../v2.0.0/sandbox/page.mdx | 722 --------------- .../v2.1.0/sandbox/page.mdx | 722 --------------- .../v2.1.1/sandbox/page.mdx | 722 --------------- .../v2.2.0/sandbox/page.mdx | 722 --------------- .../v2.2.1/sandbox/page.mdx | 725 ---------------- .../v2.3.0/sandbox/page.mdx | 725 ---------------- .../v2.4.0/sandbox/page.mdx | 819 ------------------ .../v2.4.1/sandbox/page.mdx | 819 ------------------ 101 files changed, 4 insertions(+), 30146 deletions(-) delete mode 100755 .github/scripts/is_new_sdk_ref.sh delete mode 100644 js/scripts/CustomMarkdownTheme.js delete mode 100755 js/scripts/generate_sdk_ref.sh delete mode 100644 js/typedoc.json delete mode 100755 python/scripts/generate_sdk_ref.sh delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx delete mode 100644 sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx delete mode 100644 sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx diff --git a/.github/scripts/is_new_sdk_ref.sh b/.github/scripts/is_new_sdk_ref.sh deleted file mode 100755 index 70685851..00000000 --- a/.github/scripts/is_new_sdk_ref.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script checks for diffs in the js/ and python/ directory. -# If there are diffs, it means we need to generate new SDK references. -if git diff --name-only HEAD^ | grep -q '^js/\|^python/'; then - echo "true" -else - echo "false" -fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5cd11506..8c66f04d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -356,18 +356,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Generate SDK reference - id: sdk-ref - run: pnpm run --recursive generate-ref - - - name: Show docs file structure - run: | - if [ -d "./sdk-reference" ]; then - tree ./sdk-reference - else - echo "sdk-reference directory does not exist" - fi - - name: Release new versions uses: changesets/action@v1 with: @@ -385,7 +373,6 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git add ./sdk-reference git commit -am "[skip ci] Release new versions" || exit 0 git push env: diff --git a/js/package.json b/js/package.json index 411551a0..4d54a7fc 100644 --- a/js/package.json +++ b/js/package.json @@ -34,7 +34,6 @@ "example": "npx tsx example.mts", "test:bun": "bun test tests/runtimes/bun --env-file=.env", "test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks", - "generate-ref": "./scripts/generate_sdk_ref.sh", "lint": "eslint src/ tests/", "format": "prettier --write src/ tests/ example.mts" }, @@ -44,8 +43,6 @@ "knip": "^5.25.1", "npm-check-updates": "^17.1.14", "tsup": "^8.5.1", - "typedoc": "0.26.8", - "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.5.3", "vitest": "^3.2.4" }, diff --git a/js/scripts/CustomMarkdownTheme.js b/js/scripts/CustomMarkdownTheme.js deleted file mode 100644 index 6046d845..00000000 --- a/js/scripts/CustomMarkdownTheme.js +++ /dev/null @@ -1,64 +0,0 @@ -const { MarkdownTheme, MarkdownPageEvent } = require('typedoc-plugin-markdown') - -function load(app) { - // Listen to the render event - app.renderer.on(MarkdownPageEvent.END, (page) => { - // Remove Markdown links from the document contents - page.contents = removeMarkdownLinks( - removeFirstNLines( - convertH5toH3(removeLinesWithConditions(page.contents)), - 6 - ) - ) - }) -} - -// this is a hacky way to make methods in the js-sdk sdk reference look more prominent -function convertH5toH3(text) { - return text.replace(/^##### (.*)$/gm, '### $1') -} - -// Function to remove Markdown-style links -function removeMarkdownLinks(text) { - // Regular expression to match Markdown links [text](url) - return text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1') // Replace with just the link text -} - -function removeFirstNLines(text, n, condition) { - // Split the text into lines, then join back excluding the first four lines - return text.split('\n').slice(n).join('\n') -} - -// Function to remove lines based on conditions -function removeLinesWithConditions(text) { - const lines = text.split('\n') - const filteredLines = [] - - for (let i = 0; i < lines.length; i++) { - // Check if the current line starts with "#### Extends" or "###### Overrides" - if ( - lines[i].startsWith('#### Extends') || - lines[i].startsWith('###### Overrides') || - lines[i].startsWith('###### Inherited from') - ) { - // If it does, skip this line and the next three lines - i += 3 // Skip this line and the next three - continue - } - - if (lines[i].startsWith('##### new')) { - // avoid promoting constructors - i += 1 - continue - } - - // If not removed, add the line to filteredLines - filteredLines.push(convertH5toH3(lines[i])) - } - - // Join the filtered lines back into a single string - return filteredLines.join('\n') -} - -// Export the load function -module.exports = { load } diff --git a/js/scripts/generate_sdk_ref.sh b/js/scripts/generate_sdk_ref.sh deleted file mode 100755 index b2bb4c34..00000000 --- a/js/scripts/generate_sdk_ref.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the Code Interpreter JS SDK reference markdown files -# Run it in the `js/` directory - -# generate raw SDK reference markdown files -npx typedoc - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../sdk-reference/code-interpreter-js-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -rm -rf sdk_ref/README.md - -# Flatten the sdk_ref directory by moving all nested files to the root level and remove empty subdirectories -find sdk_ref -mindepth 2 -type f | while read -r file; do - mv "$file" sdk_ref/ -done -find sdk_ref -type d -empty -delete - -# Transfrom top level MD files into folders of the same name with page.mdx inside -find sdk_ref -maxdepth 1 -type f -name "*.md" | while read -r file; do - # Extract the filename without extension - filename=$(basename "$file" .md) - # Create the directory of the same name in sdk_ref - mkdir -p "sdk_ref/${filename}" - # Move the file inside the newly created directory - mv "$file" "sdk_ref/${filename}/page.mdx" -done - -cp -r sdk_ref/* "${ROUTES_DIR}" - -rm -rf sdk_ref diff --git a/js/typedoc.json b/js/typedoc.json deleted file mode 100644 index 09eb343a..00000000 --- a/js/typedoc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "out": "sdk_ref", - "plugin": ["typedoc-plugin-markdown", "./scripts/CustomMarkdownTheme.js"], - "exclude": ["**/*.spec.ts"], - "entryPoints": [ - "src/index.ts", - "src/charts.ts", - "src/consts.ts", - "src/messaging.ts", - "src/sandbox.ts" - ], - "excludeExternals": true, - "excludePrivate": true, - "excludeProtected": true, - "navigation": { - "includeGroups": false, - "includeCategories": false - }, - "outputFileStrategy": "modules", - "readme": "none", - "disableSources": true, - // typedoc-plugin-markdown options - "classPropertiesFormat": "table", - "typeDeclarationFormat": "table", - "enumMembersFormat": "table", - "parametersFormat": "table", - "expandParameters": true, - "useCodeBlocks": true, - "hidePageTitle": true, - "hideBreadcrumbs": true -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bae84f8..205c48b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,12 +66,6 @@ importers: tsup: specifier: ^8.5.1 version: 8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - typedoc: - specifier: 0.26.8 - version: 0.26.8(typescript@5.7.3) - typedoc-plugin-markdown: - specifier: 4.2.7 - version: 4.2.7(typedoc@0.26.8(typescript@5.7.3)) typescript: specifier: ^5.5.3 version: 5.7.3 @@ -617,27 +611,6 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} - '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -667,15 +640,9 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -685,9 +652,6 @@ packages: '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@6.21.0': resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -917,9 +881,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -935,12 +896,6 @@ packages: changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -968,9 +923,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1020,13 +972,6 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1049,17 +994,10 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1247,15 +1185,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -1363,9 +1292,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1395,41 +1321,13 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1445,10 +1343,6 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -1493,9 +1387,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - openapi-fetch@0.14.1: resolution: {integrity: sha512-l7RarRHxlEZYjMLd/PR0slfMVse2/vvIAGm75/F7J6MlQ8/b9uUQmUF2kCPrQhJqMXSxmYWObVgeYXbFYzZR+A==} @@ -1640,13 +1531,6 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1662,15 +1546,6 @@ packages: resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} engines: {node: '>= 14.18.0'} - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1709,9 +1584,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1735,9 +1607,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1750,9 +1619,6 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1832,9 +1698,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -1871,27 +1734,11 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typedoc-plugin-markdown@4.2.7: - resolution: {integrity: sha512-bLsQdweSm48P9j6kGqQ3/4GCH5zu2EnURSkkxqirNc+uVFE9YK825ogDw+WbNkRHIV6eZK/1U43gT7YfglyYOg==} - engines: {node: '>= 18'} - peerDependencies: - typedoc: 0.26.x - - typedoc@0.26.8: - resolution: {integrity: sha512-QBF0BMbnNeUc6U7pRHY7Jb8pjhmiNWZNQT8LU6uk9qP9t3goP9bJptdlNqMC0wBB2w9sQrxjZt835bpRSSq1LA==} - engines: {node: '>= 18'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x - typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - udc@1.0.1: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} @@ -1904,21 +1751,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -1926,12 +1758,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2056,9 +1882,6 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: '@babel/runtime@7.28.6': {} @@ -2420,41 +2243,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.39.0': optional: true - '@shikijs/core@1.29.2': - dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 2.3.0 - - '@shikijs/engine-oniguruma@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 - - '@shikijs/langs@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - - '@shikijs/themes@1.29.2': - dependencies: - '@shikijs/types': 1.29.2 - - '@shikijs/types@1.29.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.1': {} - '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 @@ -2494,16 +2282,8 @@ snapshots: '@types/estree@1.0.7': {} - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/json-schema@7.0.15': {} - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/node@12.20.55': {} '@types/node@20.19.37': @@ -2512,8 +2292,6 @@ snapshots: '@types/semver@7.7.0': {} - '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -2795,8 +2573,6 @@ snapshots: callsites@3.1.0: {} - ccount@2.0.1: {} - chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -2817,10 +2593,6 @@ snapshots: udc: 1.0.1 underscore: 1.13.6 - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - check-error@2.1.1: {} chokidar@4.0.3: @@ -2840,8 +2612,6 @@ snapshots: color-name@1.1.4: {} - comma-separated-tokens@2.0.3: {} - commander@4.1.1: {} compare-versions@6.1.1: {} @@ -2875,12 +2645,6 @@ snapshots: clone: 1.0.4 optional: true - dequal@2.0.3: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2915,15 +2679,11 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 - emoji-regex-xs@1.0.0: {} - enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - entities@4.5.0: {} - es-module-lexer@1.7.0: {} esbuild@0.25.0: @@ -3193,26 +2953,6 @@ snapshots: has-flag@4.0.0: {} - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.0.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - html-void-elements@3.0.0: {} - ignore@5.3.1: {} import-fresh@3.3.1: @@ -3312,10 +3052,6 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - load-tsconfig@0.2.5: {} locate-path@5.0.0: @@ -3338,54 +3074,12 @@ snapshots: dependencies: yallist: 4.0.0 - lunr@2.3.9: {} - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - markdown-it@14.1.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - mdurl@2.0.0: {} - merge2@1.4.1: {} - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-encode@2.0.1: {} - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -3403,10 +3097,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 @@ -3446,12 +3136,6 @@ snapshots: dependencies: wrappy: 1.0.2 - oniguruma-to-es@2.3.0: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 - openapi-fetch@0.14.1: dependencies: openapi-typescript-helpers: 0.0.15 @@ -3562,10 +3246,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - property-information@7.0.0: {} - - punycode.js@2.3.1: {} - punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -3579,17 +3259,6 @@ snapshots: readdirp@4.1.1: {} - regex-recursion@5.1.1: - dependencies: - regex: 5.1.1 - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@5.1.1: - dependencies: - regex-utilities: 2.3.0 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -3640,17 +3309,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.29.2: - dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -3663,8 +3321,6 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@2.0.2: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -3676,11 +3332,6 @@ snapshots: std-env@3.9.0: {} - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3752,8 +3403,6 @@ snapshots: tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - ts-api-utils@1.4.3(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -3794,23 +3443,8 @@ snapshots: type-fest@0.20.2: {} - typedoc-plugin-markdown@4.2.7(typedoc@0.26.8(typescript@5.7.3)): - dependencies: - typedoc: 0.26.8(typescript@5.7.3) - - typedoc@0.26.8(typescript@5.7.3): - dependencies: - lunr: 2.3.9 - markdown-it: 14.1.0 - minimatch: 9.0.5 - shiki: 1.29.2 - typescript: 5.7.3 - yaml: 2.7.0 - typescript@5.7.3: {} - uc.micro@2.1.0: {} - udc@1.0.1: {} ufo@1.6.1: {} @@ -3819,45 +3453,12 @@ snapshots: undici-types@6.21.0: {} - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - universalify@0.1.2: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 @@ -3960,7 +3561,8 @@ snapshots: yallist@5.0.0: {} - yaml@2.7.0: {} + yaml@2.7.0: + optional: true yocto-queue@0.1.0: {} @@ -3969,5 +3571,3 @@ snapshots: zod: 3.22.4 zod@3.22.4: {} - - zwitch@2.0.4: {} diff --git a/python/package.json b/python/package.json index ecb7e5a1..8a486671 100644 --- a/python/package.json +++ b/python/package.json @@ -10,7 +10,6 @@ "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install", - "generate-ref": "poetry install && ./scripts/generate_sdk_ref.sh", "lint": "poetry run ruff check .", "format": "poetry run ruff format ." } diff --git a/python/poetry.lock b/python/poetry.lock index 734f2a66..b75f949b 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -43,53 +43,6 @@ tests = ["attrs[tests-no-zope]", "zope-interface"] tests-mypy = ["mypy (>=1.6) ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\""] tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] -[[package]] -name = "black" -version = "23.12.1" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, - {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, - {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, - {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, - {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, - {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, - {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, - {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, - {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, - {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, - {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, - {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, - {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, - {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, - {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "bracex" version = "2.6" @@ -114,136 +67,6 @@ files = [ {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] -[[package]] -name = "charset-normalizer" -version = "3.4.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -groups = ["dev"] -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "colorama" version = "0.4.6" @@ -358,74 +181,6 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "databind" -version = "4.5.2" -description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.8 and newer." -optional = false -python-versions = "<4.0.0,>=3.8.0" -groups = ["dev"] -files = [ - {file = "databind-4.5.2-py3-none-any.whl", hash = "sha256:b9c3a03c0414aa4567f095d7218ac904bd2b267b58e3763dac28e83d64b69770"}, - {file = "databind-4.5.2.tar.gz", hash = "sha256:0a8aa0ff130a0306581c559388f5ef65e0fae7ef4b86412eacb1f4a0420006c4"}, -] - -[package.dependencies] -Deprecated = ">=1.2.12,<2.0.0" -nr-date = ">=2.0.0,<3.0.0" -nr-stream = ">=1.0.0,<2.0.0" -setuptools = {version = ">=40.8.0", markers = "python_version < \"3.10\""} -typeapi = ">=2.0.1,<3" -typing-extensions = ">=3.10.0,<5" - -[[package]] -name = "databind-core" -version = "4.5.2" -description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.8 and newer. Deprecated, use `databind` package." -optional = false -python-versions = "<4.0.0,>=3.8.0" -groups = ["dev"] -files = [ - {file = "databind.core-4.5.2-py3-none-any.whl", hash = "sha256:a1dd1c6bd8ca9907d1292d8df9ec763ce91543e27f7eda4268e4a1a84fcd1c42"}, - {file = "databind.core-4.5.2.tar.gz", hash = "sha256:b8ac8127bc5d6b239a2a81aeddb268b0c4cadd53fbce7e8b2c7a9ef6413bccb3"}, -] - -[package.dependencies] -databind = ">=4.5.2,<5.0.0" - -[[package]] -name = "databind-json" -version = "4.5.2" -description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.8 and newer. Deprecated, use `databind` module instead." -optional = false -python-versions = "<4.0.0,>=3.8.0" -groups = ["dev"] -files = [ - {file = "databind.json-4.5.2-py3-none-any.whl", hash = "sha256:a803bf440634685984361cb2a5a975887e487c854ed48d81ff7aaf3a1ed1e94c"}, - {file = "databind.json-4.5.2.tar.gz", hash = "sha256:6cc9b5c6fddaebd49b2433932948eb3be8a41633b90aa37998d7922504b8f165"}, -] - -[package.dependencies] -databind = ">=4.5.2,<5.0.0" - -[[package]] -name = "deprecated" -version = "1.2.15" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -groups = ["dev"] -files = [ - {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, - {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools ; python_version >= \"3.12\"", "sphinx (<2)", "tox"] - [[package]] name = "dockerfile-parse" version = "2.0.1" @@ -438,54 +193,6 @@ files = [ {file = "dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6"}, ] -[[package]] -name = "docspec" -version = "2.2.1" -description = "Docspec is a JSON object specification for representing API documentation of programming languages." -optional = false -python-versions = ">=3.7,<4.0" -groups = ["dev"] -files = [ - {file = "docspec-2.2.1-py3-none-any.whl", hash = "sha256:7538f750095a9688c6980ff9a4e029a823a500f64bd00b6b4bdb27951feb31cb"}, - {file = "docspec-2.2.1.tar.gz", hash = "sha256:4854e77edc0e2de40e785e57e95880f7095a05fe978f8b54cef7a269586e15ff"}, -] - -[package.dependencies] -"databind.core" = ">=4.2.6,<5.0.0" -"databind.json" = ">=4.2.6,<5.0.0" -Deprecated = ">=1.2.12,<2.0.0" - -[[package]] -name = "docspec-python" -version = "2.2.1" -description = "A parser based on lib2to3 producing docspec data from Python source code." -optional = false -python-versions = ">=3.7,<4.0" -groups = ["dev"] -files = [ - {file = "docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54"}, - {file = "docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559"}, -] - -[package.dependencies] -black = ">=23.1.0,<24.0.0" -docspec = ">=2.2.1,<3.0.0" -"nr.util" = ">=0.7.0" - -[[package]] -name = "docstring-parser" -version = "0.11" -description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" -optional = false -python-versions = ">=3.6" -groups = ["dev"] -files = [ - {file = "docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb"}, -] - -[package.extras] -test = ["black", "pytest"] - [[package]] name = "e2b" version = "2.10.2" @@ -729,24 +436,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "jinja2" -version = "3.1.6" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, - {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - [[package]] name = "kiwisolver" version = "1.4.7" @@ -896,76 +585,6 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - [[package]] name = "matplotlib" version = "3.9.4" @@ -1044,58 +663,6 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -groups = ["dev"] -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nr-date" -version = "2.1.0" -description = "" -optional = false -python-versions = ">=3.6,<4.0" -groups = ["dev"] -files = [ - {file = "nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568"}, - {file = "nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6"}, -] - -[[package]] -name = "nr-stream" -version = "1.1.5" -description = "" -optional = false -python-versions = ">=3.6,<4.0" -groups = ["dev"] -files = [ - {file = "nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4"}, - {file = "nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65"}, -] - -[[package]] -name = "nr-util" -version = "0.8.12" -description = "General purpose Python utility library." -optional = false -python-versions = ">=3.7,<4.0" -groups = ["dev"] -files = [ - {file = "nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb"}, - {file = "nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4"}, -] - -[package.dependencies] -deprecated = ">=1.2.0,<2.0.0" -typing-extensions = ">=3.0.0" - [[package]] name = "numpy" version = "2.0.2" @@ -1163,18 +730,6 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - [[package]] name = "pillow" version = "11.3.0" @@ -1300,23 +855,6 @@ tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "ole typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] -[[package]] -name = "platformdirs" -version = "4.3.6" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - [[package]] name = "pluggy" version = "1.5.0" @@ -1353,34 +891,6 @@ files = [ {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, ] -[[package]] -name = "pydoc-markdown" -version = "4.8.2" -description = "Create Python API documentation in Markdown format." -optional = false -python-versions = ">=3.7,<4.0" -groups = ["dev"] -files = [ - {file = "pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f"}, - {file = "pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b"}, -] - -[package.dependencies] -click = ">=7.1,<9.0" -"databind.core" = ">=4.4.0,<5.0.0" -"databind.json" = ">=4.4.0,<5.0.0" -docspec = ">=2.2.1,<3.0.0" -docspec-python = ">=2.2.1,<3.0.0" -docstring-parser = ">=0.11,<0.12" -jinja2 = ">=3.0.0,<4.0.0" -"nr.util" = ">=0.7.5,<1.0.0" -PyYAML = ">=5.0,<7.0" -requests = ">=2.23.0,<3.0.0" -tomli = ">=2.0.0,<3.0.0" -tomli_w = ">=1.0.0,<2.0.0" -watchdog = "*" -yapf = ">=0.30.0" - [[package]] name = "pygments" version = "2.19.2" @@ -1521,91 +1031,6 @@ files = [ [package.extras] cli = ["click (>=5.0)"] -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "requests" -version = "2.32.4" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - [[package]] name = "rich" version = "14.2.0" @@ -1653,28 +1078,6 @@ files = [ {file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"}, ] -[[package]] -name = "setuptools" -version = "78.1.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.9\"" -files = [ - {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, - {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] - [[package]] name = "six" version = "1.16.0" @@ -1711,33 +1114,6 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "tomli-w" -version = "1.0.0" -description = "A lil' TOML writer" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "tomli_w-1.0.0-py3-none-any.whl", hash = "sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463"}, - {file = "tomli_w-1.0.0.tar.gz", hash = "sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9"}, -] - -[[package]] -name = "typeapi" -version = "2.2.3" -description = "" -optional = false -python-versions = "<4.0,>=3.8" -groups = ["dev"] -files = [ - {file = "typeapi-2.2.3-py3-none-any.whl", hash = "sha256:038062b473dd9bc182966469d7a37d81ba7fa5bb0c01f30b0604b5667b13a47b"}, - {file = "typeapi-2.2.3.tar.gz", hash = "sha256:61cf8c852c05471522fcf55ec37d0c37f0de6943cc8e4d58529f796881e32c08"}, -] - -[package.dependencies] -typing-extensions = ">=3.0.0" - [[package]] name = "typing-extensions" version = "4.12.2" @@ -1750,72 +1126,6 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "urllib3" -version = "2.6.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, - {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, -] - -[package.extras] -brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] - -[[package]] -name = "watchdog" -version = "4.0.2" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, - {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, - {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, - {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, - {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - [[package]] name = "wcmatch" version = "10.1" @@ -1831,97 +1141,6 @@ files = [ [package.dependencies] bracex = ">=2.1.1" -[[package]] -name = "wrapt" -version = "1.17.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, - {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, - {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, - {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, - {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, - {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, - {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, - {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, - {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, - {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, - {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, - {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, - {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, - {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, - {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, - {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, - {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, - {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, - {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, - {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, - {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, - {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, - {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, -] - -[[package]] -name = "yapf" -version = "0.43.0" -description = "A formatter for Python code" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca"}, - {file = "yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e"}, -] - -[package.dependencies] -platformdirs = ">=3.5.1" -tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} - [[package]] name = "zipp" version = "3.23.0" @@ -1946,4 +1165,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "f3c2463ae3e3af850183625fdf71af742aa448ecaf85261a3fce2b30cb879743" +content-hash = "326cd369ac576edc7c00c0d6c143ddbf23be0b91d406ac1ae3f198330a1fc5ac" diff --git a/python/pyproject.toml b/python/pyproject.toml index 6896147c..fb02b0b0 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -22,7 +22,6 @@ python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pytest-asyncio = "^0.24.0" pytest-xdist = "^3.6.1" -pydoc-markdown = "^4.8.2" matplotlib = "^3.8.0" ruff = "^0.11.12" @@ -35,4 +34,4 @@ build-backend = "poetry.core.masonry.api" "Bug Tracker" = "https://github.com/e2b-dev/code-interpreter/issues" [tool.ruff.lint] -ignore = ["F401", "F403"] \ No newline at end of file +ignore = ["F401", "F403"] diff --git a/python/scripts/generate_sdk_ref.sh b/python/scripts/generate_sdk_ref.sh deleted file mode 100755 index 0b13951a..00000000 --- a/python/scripts/generate_sdk_ref.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the python SDK reference markdown files -# Run it in the `python-sdk/` directory - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../sdk-reference/code-interpreter-python-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -package="e2b_code_interpreter" - -mkdir -p sdk_ref - -# generate raw SDK reference markdown file -poetry run pydoc-markdown -p "${package}" >sdk_ref/"${package}".mdx -# remove package path display -sed -i'' -e '/]*>.*<\/a>/d' "sdk_ref/${package}.mdx" -# remove empty hyperlinks -sed -i'' -e '/^# /d' "sdk_ref/${package}.mdx" -# remove " Objects" from lines starting with "##" -sed -i'' -e '/^## / s/ Objects$//' "sdk_ref/${package}.mdx" -# replace lines starting with "####" with "###" -sed -i'' -e 's/^####/###/' "sdk_ref/${package}.mdx" -# move to docs -mkdir -p "${ROUTES_DIR}/sandbox" -mv "sdk_ref/${package}.mdx" "${ROUTES_DIR}/sandbox/page.mdx" - -rm -rf sdk_ref diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.0.4/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.1/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.1/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.1/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.1/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.1.1/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.2.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.2.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.2.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.2.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.2.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.1/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.1/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.1/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.1/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v1.5.1/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.1/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.1/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.1/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.1/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.0.1/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.1.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.1.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.1.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.1.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.1.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.2.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.2.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.2.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.2.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx deleted file mode 100644 index 96eafec5..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.2.0/sandbox/page.mdx +++ /dev/null @@ -1,312 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.0/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.0/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.0/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.0/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx deleted file mode 100644 index 93c26893..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.0/sandbox/page.mdx +++ /dev/null @@ -1,366 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### listCodeContexts() - -```ts -listCodeContexts(): Promise -``` - -List all contexts. - -###### Returns - -`Promise`\<`Context`[]\> - -list of contexts. - -### removeCodeContext() - -```ts -removeCodeContext(context: string | Context): Promise -``` - -Removes a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to remove. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### restartCodeContext() - -```ts -restartCodeContext(context: string | Context): Promise -``` - -Restart a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to restart. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.1/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.1/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.1/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.1/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx deleted file mode 100644 index 93c26893..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.1/sandbox/page.mdx +++ /dev/null @@ -1,366 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### listCodeContexts() - -```ts -listCodeContexts(): Promise -``` - -List all contexts. - -###### Returns - -`Promise`\<`Context`[]\> - -list of contexts. - -### removeCodeContext() - -```ts -removeCodeContext(context: string | Context): Promise -``` - -Removes a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to remove. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### restartCodeContext() - -```ts -restartCodeContext(context: string | Context): Promise -``` - -Restart a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to restart. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.2/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.2/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.2/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.2/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx deleted file mode 100644 index 93c26893..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.2/sandbox/page.mdx +++ /dev/null @@ -1,366 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### listCodeContexts() - -```ts -listCodeContexts(): Promise -``` - -List all contexts. - -###### Returns - -`Promise`\<`Context`[]\> - -list of contexts. - -### removeCodeContext() - -```ts -removeCodeContext(context: string | Context): Promise -``` - -Removes a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to remove. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### restartCodeContext() - -```ts -restartCodeContext(context: string | Context): Promise -``` - -Restart a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to restart. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx deleted file mode 100644 index f3176d3b..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.3/charts/page.mdx +++ /dev/null @@ -1,240 +0,0 @@ -### ChartType - -Chart types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `BAR` | `"bar"` | -| `BOX_AND_WHISKER` | `"box_and_whisker"` | -| `LINE` | `"line"` | -| `PIE` | `"pie"` | -| `SCATTER` | `"scatter"` | -| `SUPERCHART` | `"superchart"` | -| `UNKNOWN` | `"unknown"` | - -*** - -### ScaleType - -Ax scale types - -#### Enumeration Members - -| Enumeration Member | Value | -| ------ | ------ | -| `ASINH` | `"asinh"` | -| `CATEGORICAL` | `"categorical"` | -| `DATETIME` | `"datetime"` | -| `FUNCTION` | `"function"` | -| `FUNCTIONLOG` | `"functionlog"` | -| `LINEAR` | `"linear"` | -| `LOG` | `"log"` | -| `LOGIT` | `"logit"` | -| `SYMLOG` | `"symlog"` | - -## Type Aliases - -### BarChart - -```ts -type BarChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BarData`[] | -| `type` | `ChartType.BAR` | - -*** - -### BarData - -```ts -type BarData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `group` | `string` | -| `label` | `string` | -| `value` | `string` | - -*** - -### BoxAndWhiskerChart - -```ts -type BoxAndWhiskerChart: Chart2D & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `BoxAndWhiskerData`[] | -| `type` | `ChartType.BOX_AND_WHISKER` | - -*** - -### BoxAndWhiskerData - -```ts -type BoxAndWhiskerData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `first_quartile` | `number` | -| `label` | `string` | -| `max` | `number` | -| `median` | `number` | -| `min` | `number` | -| `outliers` | `number`[] | -| `third_quartile` | `number` | - -*** - -### Chart - -```ts -type Chart: object; -``` - -Represents a chart. - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `any`[] | -| `title` | `string` | -| `type` | `ChartType` | - -*** - -### ChartTypes - -```ts -type ChartTypes: - | LineChart - | ScatterChart - | BarChart - | PieChart - | BoxAndWhiskerChart - | SuperChart; -``` - -*** - -### LineChart - -```ts -type LineChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.LINE` | - -*** - -### PieChart - -```ts -type PieChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `PieData`[] | -| `type` | `ChartType.PIE` | - -*** - -### PieData - -```ts -type PieData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `angle` | `number` | -| `label` | `string` | -| `radius` | `number` | - -*** - -### PointData - -```ts -type PointData: object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `label` | `string` | -| `points` | [`number` \| `string`, `number` \| `string`][] | - -*** - -### ScatterChart - -```ts -type ScatterChart: PointChart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `type` | `ChartType.SCATTER` | - -*** - -### SuperChart - -```ts -type SuperChart: Chart & object; -``` - -#### Type declaration - -| Name | Type | -| ------ | ------ | -| `elements` | `Chart`[] | -| `type` | `ChartType.SUPERCHART` | - -## Functions - -### deserializeChart() - -```ts -function deserializeChart(data: any): Chart -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `any` | - -#### Returns - -`Chart` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx deleted file mode 100644 index d1ee2e76..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.3/consts/page.mdx +++ /dev/null @@ -1,13 +0,0 @@ -### DEFAULT\_TIMEOUT\_MS - -```ts -const DEFAULT_TIMEOUT_MS: 60000 = 60_000; -``` - -*** - -### JUPYTER\_PORT - -```ts -const JUPYTER_PORT: 49999 = 49999; -``` diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx deleted file mode 100644 index dc55fcc7..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.3/index/page.mdx +++ /dev/null @@ -1,103 +0,0 @@ -### BarChart - -Re-exports BarChart - -### BarData - -Re-exports BarData - -### BoxAndWhiskerChart - -Re-exports BoxAndWhiskerChart - -### BoxAndWhiskerData - -Re-exports BoxAndWhiskerData - -### Chart - -Re-exports Chart - -### ChartType - -Re-exports ChartType - -### ChartTypes - -Re-exports ChartTypes - -### Context - -Re-exports Context - -### CreateCodeContextOpts - -Re-exports CreateCodeContextOpts - -### default - -Renames and re-exports Sandbox - -### Execution - -Re-exports Execution - -### ExecutionError - -Re-exports ExecutionError - -### LineChart - -Re-exports LineChart - -### Logs - -Re-exports Logs - -### MIMEType - -Re-exports MIMEType - -### OutputMessage - -Re-exports OutputMessage - -### PieChart - -Re-exports PieChart - -### PieData - -Re-exports PieData - -### PointData - -Re-exports PointData - -### RawData - -Re-exports RawData - -### Result - -Re-exports Result - -### RunCodeOpts - -Re-exports RunCodeOpts - -### Sandbox - -Re-exports Sandbox - -### ScaleType - -Re-exports ScaleType - -### ScatterChart - -Re-exports ScatterChart - -### SuperChart - -Re-exports SuperChart diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx deleted file mode 100644 index 4b3c4ed9..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.3/messaging/page.mdx +++ /dev/null @@ -1,326 +0,0 @@ -### Execution - -Represents the result of a cell execution. - -#### Constructors - -```ts -new Execution( - results: Result[], - logs: Logs, - error?: ExecutionError, - executionCount?: number): Execution -``` - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `results` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | -| `logs` | `Logs` | `...` | Logs printed to stdout and stderr during execution. | -| `error`? | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount`? | `number` | `undefined` | Execution count of the cell. | - -###### Returns - -`Execution` - -#### Properties - -| Property | Modifier | Type | Default value | Description | -| ------ | ------ | ------ | ------ | ------ | -| `error?` | `public` | `ExecutionError` | `undefined` | An Error object if an error occurred, null otherwise. | -| `executionCount?` | `public` | `number` | `undefined` | Execution count of the cell. | -| `logs` | `public` | `Logs` | `undefined` | Logs printed to stdout and stderr during execution. | -| `results` | `public` | `Result`[] | `[]` | List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). | - -#### Accessors - -### text - -```ts -get text(): undefined | string -``` - -Returns the text representation of the main result of the cell. - -###### Returns - -`undefined` \| `string` - -#### Methods - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the execution result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `error` | `undefined` \| `ExecutionError` | -| `logs` | `Logs` | -| `results` | `Result`[] | - -*** - -### ExecutionError - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - -#### Constructors - -```ts -new ExecutionError( - name: string, - value: string, - traceback: string): ExecutionError -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `name` | `string` | Name of the error. | -| `value` | `string` | Value of the error. | -| `traceback` | `string` | The raw traceback of the error. | - -###### Returns - -`ExecutionError` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `name` | `public` | `string` | Name of the error. | -| `traceback` | `public` | `string` | The raw traceback of the error. | -| `value` | `public` | `string` | Value of the error. | - -*** - -### OutputMessage - -Represents an output message from the sandbox code execution. - -#### Constructors - -```ts -new OutputMessage( - line: string, - timestamp: number, - error: boolean): OutputMessage -``` - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `line` | `string` | The output line. | -| `timestamp` | `number` | Unix epoch in nanoseconds. | -| `error` | `boolean` | Whether the output is an error. | - -###### Returns - -`OutputMessage` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `error` | `readonly` | `boolean` | Whether the output is an error. | -| `line` | `readonly` | `string` | The output line. | -| `timestamp` | `readonly` | `number` | Unix epoch in nanoseconds. | - -#### Methods - -### toString() - -```ts -toString(): string -``` - -###### Returns - -`string` - -*** - -### Result - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - -#### Constructors - -```ts -new Result(rawData: RawData, isMainResult: boolean): Result -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `rawData` | `RawData` | -| `isMainResult` | `boolean` | - -###### Returns - -`Result` - -#### Properties - -| Property | Modifier | Type | Description | -| ------ | ------ | ------ | ------ | -| `chart?` | `readonly` | `ChartTypes` | Contains the chart data. | -| `data?` | `readonly` | `Record`\<`string`, `unknown`\> | Contains the data from DataFrame. | -| `extra?` | `readonly` | `any` | Extra data that can be included. Not part of the standard types. | -| `html?` | `readonly` | `string` | HTML representation of the data. | -| `isMainResult` | `readonly` | `boolean` | - | -| `javascript?` | `readonly` | `string` | JavaScript representation of the data. | -| `jpeg?` | `readonly` | `string` | JPEG representation of the data. | -| `json?` | `readonly` | `string` | JSON representation of the data. | -| `latex?` | `readonly` | `string` | LaTeX representation of the data. | -| `markdown?` | `readonly` | `string` | Markdown representation of the data. | -| `pdf?` | `readonly` | `string` | PDF representation of the data. | -| `png?` | `readonly` | `string` | PNG representation of the data. | -| `raw` | `readonly` | `RawData` | - | -| `svg?` | `readonly` | `string` | SVG representation of the data. | -| `text?` | `readonly` | `string` | Text representation of the result. | - -#### Methods - -### formats() - -```ts -formats(): string[] -``` - -Returns all the formats available for the result. - -###### Returns - -`string`[] - -Array of strings representing the formats available for the result. - -### toJSON() - -```ts -toJSON(): object -``` - -Returns the serializable representation of the result. - -###### Returns - -`object` - -| Name | Type | -| ------ | ------ | -| `extra`? | `any` | -| `html` | `undefined` \| `string` | -| `javascript` | `undefined` \| `string` | -| `jpeg` | `undefined` \| `string` | -| `json` | `undefined` \| `string` | -| `latex` | `undefined` \| `string` | -| `markdown` | `undefined` \| `string` | -| `pdf` | `undefined` \| `string` | -| `png` | `undefined` \| `string` | -| `svg` | `undefined` \| `string` | -| `text` | `undefined` \| `string` | - -## Type Aliases - -### Logs - -```ts -type Logs: object; -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `stderr` | `string`[] | List of strings printed to stderr by prints, subprocesses, etc. | -| `stdout` | `string`[] | List of strings printed to stdout by prints, subprocesses, etc. | - -*** - -### MIMEType - -```ts -type MIMEType: string; -``` - -Represents a MIME type. - -*** - -### RawData - -```ts -type RawData: object & E2BData; -``` - -Dictionary that maps MIME types to their corresponding representations of the data. - -## Functions - -### extractError() - -```ts -function extractError(res: Response): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `res` | `Response` | - -#### Returns - -`Promise`\<`undefined` \| `SandboxError`\> - -*** - -### parseOutput() - -```ts -function parseOutput( - execution: Execution, - line: string, - onStdout?: (output: OutputMessage) => any, - onStderr?: (output: OutputMessage) => any, - onResult?: (data: Result) => any, -onError?: (error: ExecutionError) => any): Promise -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `execution` | `Execution` | -| `line` | `string` | -| `onStdout`? | (`output`: `OutputMessage`) => `any` | -| `onStderr`? | (`output`: `OutputMessage`) => `any` | -| `onResult`? | (`data`: `Result`) => `any` | -| `onError`? | (`error`: `ExecutionError`) => `any` | - -#### Returns - -`Promise`\<`void`\> diff --git a/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx b/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx deleted file mode 100644 index 93c26893..00000000 --- a/sdk-reference/code-interpreter-js-sdk/v2.3.3/sandbox/page.mdx +++ /dev/null @@ -1,366 +0,0 @@ -### Sandbox - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs here. - -Use Sandbox.create to create a new sandbox. - -#### Example - -```ts -import { Sandbox } from '@e2b/code-interpreter' - -const sandbox = await Sandbox.create() -``` - -#### Methods - -### createCodeContext() - -```ts -createCodeContext(opts?: CreateCodeContextOpts): Promise -``` - -Creates a new context to run code in. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `opts`? | `CreateCodeContextOpts` | options for creating the context. | - -###### Returns - -`Promise`\<`Context`\> - -context object. - -### listCodeContexts() - -```ts -listCodeContexts(): Promise -``` - -List all contexts. - -###### Returns - -`Promise`\<`Context`[]\> - -list of contexts. - -### removeCodeContext() - -```ts -removeCodeContext(context: string | Context): Promise -``` - -Removes a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to remove. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### restartCodeContext() - -```ts -restartCodeContext(context: string | Context): Promise -``` - -Restart a context. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `context` | `string` \| `Context` | context to restart. | - -###### Returns - -`Promise`\<`void`\> - -void. - -### runCode() - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Run the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code. | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object. - -###### runCode(code, opts) - -```ts -runCode(code: string, opts?: RunCodeOpts & object): Promise -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `code` | `string` | code to execute. | -| `opts`? | `RunCodeOpts` & `object` | options for executing the code | - -###### Returns - -`Promise`\<`Execution`\> - -`Execution` result object - -## Interfaces - -### CreateCodeContextOpts - -Options for creating a code context. - -#### Properties - -### cwd? - -```ts -optional cwd: string; -``` - -Working directory for the context. - -###### Default - -```ts -/home/user -``` - -### language? - -```ts -optional language: string; -``` - -Language for the context. - -###### Default - -```ts -python -``` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -*** - -### RunCodeOpts - -Options for running code. - -#### Properties - -### envs? - -```ts -optional envs: Record; -``` - -Custom environment variables for code execution. - -###### Default - -```ts -{} -``` - -### onError()? - -```ts -optional onError: (error: ExecutionError) => any; -``` - -Callback for handling the `ExecutionError` object. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `ExecutionError` | - -###### Returns - -`any` - -### onResult()? - -```ts -optional onResult: (data: Result) => any; -``` - -Callback for handling the final execution result. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `data` | `Result` | - -###### Returns - -`any` - -### onStderr()? - -```ts -optional onStderr: (output: OutputMessage) => any; -``` - -Callback for handling stderr messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### onStdout()? - -```ts -optional onStdout: (output: OutputMessage) => any; -``` - -Callback for handling stdout messages. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `output` | `OutputMessage` | - -###### Returns - -`any` - -### requestTimeoutMs? - -```ts -optional requestTimeoutMs: number; -``` - -Timeout for the request in **milliseconds**. - -###### Default - -```ts -30_000 // 30 seconds -``` - -### timeoutMs? - -```ts -optional timeoutMs: number; -``` - -Timeout for the code execution in **milliseconds**. - -###### Default - -```ts -60_000 // 60 seconds -``` - -## Type Aliases - -### Context - -```ts -type Context: object; -``` - -Represents a context for code execution. - -#### Type declaration - -| Name | Type | Description | -| ------ | ------ | ------ | -| `cwd` | `string` | The working directory of the context. | -| `id` | `string` | The ID of the context. | -| `language` | `string` | The language of the context. | diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx deleted file mode 100644 index 325b8e18..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.1/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx deleted file mode 100644 index 724afcfc..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.2/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx deleted file mode 100644 index b7323614..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.3/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx deleted file mode 100644 index 325b8e18..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.4/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx deleted file mode 100644 index b59dc8e0..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.0.5/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx deleted file mode 100644 index 86e0dfaf..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.1.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx deleted file mode 100644 index 86e0dfaf..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.1.1/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx deleted file mode 100644 index 86e0dfaf..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.2.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx deleted file mode 100644 index 19778c89..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.2.1/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx deleted file mode 100644 index 6bee4003..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.5.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx deleted file mode 100644 index 6bee4003..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.5.1/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - diff --git a/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx deleted file mode 100644 index 80c7f2cd..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v1.5.2/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx deleted file mode 100644 index a3bb8d72..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.0.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx deleted file mode 100644 index 8b8082cd..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.1.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx deleted file mode 100644 index 8b8082cd..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.1.1/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx deleted file mode 100644 index 8b8082cd..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.2.0/sandbox/page.mdx +++ /dev/null @@ -1,722 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx deleted file mode 100644 index 40b9bb92..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.2.1/sandbox/page.mdx +++ /dev/null @@ -1,725 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx deleted file mode 100644 index 40b9bb92..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.3.0/sandbox/page.mdx +++ /dev/null @@ -1,725 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx deleted file mode 100644 index d6466bf3..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.4.0/sandbox/page.mdx +++ /dev/null @@ -1,819 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - -### remove\_code\_context - -```python -def remove_code_context(context: Union[Context, str]) -> None -``` - -Removes a context. - -**Arguments**: - -- `context`: Context to remove. Can be a Context object or a context ID string. - -**Returns**: - -None - - -### list\_code\_contexts - -```python -def list_code_contexts() -> List[Context] -``` - -List all contexts. - -**Returns**: - -List of contexts. - - -### restart\_code\_context - -```python -def restart_code_context(context: Union[Context, str]) -> None -``` - -Restart a context. - -**Arguments**: - -- `context`: Context to restart. Can be a Context object or a context ID string. - -**Returns**: - -None - - - - - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - -### remove\_code\_context - -```python -async def remove_code_context(context: Union[Context, str]) -> None -``` - -Removes a context. - -**Arguments**: - -- `context`: Context to remove. Can be a Context object or a context ID string. - -**Returns**: - -None - - -### list\_code\_contexts - -```python -async def list_code_contexts() -> List[Context] -``` - -List all contexts. - -**Returns**: - -List of contexts. - - -### restart\_code\_context - -```python -async def restart_code_context(context: Union[Context, str]) -> None -``` - -Restart a context. - -**Arguments**: - -- `context`: Context to restart. Can be a Context object or a context ID string. - -**Returns**: - -None - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - diff --git a/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx b/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx deleted file mode 100644 index f668374c..00000000 --- a/sdk-reference/code-interpreter-python-sdk/v2.4.1/sandbox/page.mdx +++ /dev/null @@ -1,819 +0,0 @@ - - - - - -## AsyncSandbox - -```python -class AsyncSandbox(BaseAsyncSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `AsyncSandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import AsyncSandbox -sandbox = await AsyncSandbox.create() -``` - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -async def run_code( - code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -async def create_code_context( - cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - -### remove\_code\_context - -```python -async def remove_code_context(context: Union[Context, str]) -> None -``` - -Removes a context. - -**Arguments**: - -- `context`: Context to remove. Can be a Context object or a context ID string. - -**Returns**: - -None - - -### list\_code\_contexts - -```python -async def list_code_contexts() -> List[Context] -``` - -List all contexts. - -**Returns**: - -List of contexts. - - -### restart\_code\_context - -```python -async def restart_code_context(context: Union[Context, str]) -> None -``` - -Restart a context. - -**Arguments**: - -- `context`: Context to restart. Can be a Context object or a context ID string. - -**Returns**: - -None - - - - -## OutputMessage - -```python -@dataclass -class OutputMessage() -``` - -Represents an output message from the sandbox code execution. - - -### line - -The output line. - - -### timestamp - -Unix epoch in nanoseconds - - -### error - -Whether the output is an error. - - -## ExecutionError - -```python -@dataclass -class ExecutionError() -``` - -Represents an error that occurred during the execution of a cell. -The error contains the name of the error, the value of the error, and the traceback. - - -### name - -Name of the error. - - -### value - -Value of the error. - - -### traceback - -The raw traceback of the error. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Error object. - - -## MIMEType - -```python -class MIMEType(str) -``` - -Represents a MIME type. - - -## Result - -```python -@dataclass -class Result() -``` - -Represents the data to be displayed as a result of executing a cell in a Jupyter notebook. -The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics - -The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented -as a string, and the result can contain multiple types of data. The display calls don't have to have text representation, -for the actual result the representation is always present for the result, the other representations are always optional. - - -### is\_main\_result - -Whether this data is the result of the cell. Data can be produced by display calls of which can be multiple in a cell. - - -### extra - -Extra data that can be included. Not part of the standard types. - - -### formats - -```python -def formats() -> Iterable[str] -``` - -Returns all available formats of the result. - -**Returns**: - -All available formats of the result in MIME types. - - -### \_\_str\_\_ - -```python -def __str__() -> Optional[str] -``` - -Returns the text representation of the data. - -**Returns**: - -The text representation of the data. - - -### \_repr\_html\_ - -```python -def _repr_html_() -> Optional[str] -``` - -Returns the HTML representation of the data. - -**Returns**: - -The HTML representation of the data. - - -### \_repr\_markdown\_ - -```python -def _repr_markdown_() -> Optional[str] -``` - -Returns the Markdown representation of the data. - -**Returns**: - -The Markdown representation of the data. - - -### \_repr\_svg\_ - -```python -def _repr_svg_() -> Optional[str] -``` - -Returns the SVG representation of the data. - -**Returns**: - -The SVG representation of the data. - - -### \_repr\_png\_ - -```python -def _repr_png_() -> Optional[str] -``` - -Returns the base64 representation of the PNG data. - -**Returns**: - -The base64 representation of the PNG data. - - -### \_repr\_jpeg\_ - -```python -def _repr_jpeg_() -> Optional[str] -``` - -Returns the base64 representation of the JPEG data. - -**Returns**: - -The base64 representation of the JPEG data. - - -### \_repr\_pdf\_ - -```python -def _repr_pdf_() -> Optional[str] -``` - -Returns the PDF representation of the data. - -**Returns**: - -The PDF representation of the data. - - -### \_repr\_latex\_ - -```python -def _repr_latex_() -> Optional[str] -``` - -Returns the LaTeX representation of the data. - -**Returns**: - -The LaTeX representation of the data. - - -### \_repr\_json\_ - -```python -def _repr_json_() -> Optional[dict] -``` - -Returns the JSON representation of the data. - -**Returns**: - -The JSON representation of the data. - - -### \_repr\_javascript\_ - -```python -def _repr_javascript_() -> Optional[str] -``` - -Returns the JavaScript representation of the data. - -**Returns**: - -The JavaScript representation of the data. - - -## Logs - -```python -@dataclass(repr=False) -class Logs() -``` - -Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc. - - -### stdout - -List of strings printed to stdout by prints, subprocesses, etc. - - -### stderr - -List of strings printed to stderr by prints, subprocesses, etc. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Logs object. - - -### serialize\_results - -```python -def serialize_results(results: List[Result]) -> List[Dict[str, str]] -``` - -Serializes the results to JSON. - - -## Execution - -```python -@dataclass(repr=False) -class Execution() -``` - -Represents the result of a cell execution. - - -### results - -List of the result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots). - - -### logs - -Logs printed to stdout and stderr during execution. - - -### error - -Error object if an error occurred, None otherwise. - - -### execution\_count - -Execution count of the cell. - - -### text - -```python -@property -def text() -> Optional[str] -``` - -Returns the text representation of the result. - -**Returns**: - -The text representation of the result. - - -### to\_json - -```python -def to_json() -> str -``` - -Returns the JSON representation of the Execution object. - - -## Context - -```python -@dataclass -class Context() -``` - -Represents a context for code execution. - - -### id - -The ID of the context. - - -### language - -The language of the context. - - -### cwd - -The working directory of the context. - - - - -## Sandbox - -```python -class Sandbox(BaseSandbox) -``` - -E2B cloud sandbox is a secure and isolated cloud environment. - -The sandbox allows you to: -- Access Linux OS -- Create, list, and delete files and directories -- Run commands -- Run isolated code -- Access the internet - -Check docs [here](https://e2b.dev/docs). - -Use the `Sandbox.create()` to create a new sandbox. - -**Example**: - -```python -from e2b_code_interpreter import Sandbox - -sandbox = Sandbox.create() -``` - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code as Python. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - language: Optional[str] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code for the specified language. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. -If no language is specified, Python is used. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `language`: Language to use for code execution. If not defined, the default Python context is used. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### run\_code - -```python -@overload -def run_code(code: str, - context: Optional[Context] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None) -> Execution -``` - -Runs the code in the specified context, if not specified, the default context is used. - -Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - -You can reference previously defined variables, imports, and functions in the code. - -**Arguments**: - -- `code`: Code to execute -- `context`: Concrete context to run the code in. If not specified, the default context for the language is used. It's mutually exclusive with the language. -- `on_stdout`: Callback for stdout messages -- `on_stderr`: Callback for stderr messages -- `on_result`: Callback for the `Result` object -- `on_error`: Callback for the `ExecutionError` object -- `envs`: Custom environment variables -- `timeout`: Timeout for the code execution in **seconds** -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -`Execution` result object - - -### create\_code\_context - -```python -def create_code_context(cwd: Optional[str] = None, - language: Optional[str] = None, - request_timeout: Optional[float] = None) -> Context -``` - -Creates a new context to run code in. - -**Arguments**: - -- `cwd`: Set the current working directory for the context, defaults to `/home/user` -- `language`: Language of the context. If not specified, defaults to Python -- `request_timeout`: Timeout for the request in **milliseconds** - -**Returns**: - -Context object - - -### remove\_code\_context - -```python -def remove_code_context(context: Union[Context, str]) -> None -``` - -Removes a context. - -**Arguments**: - -- `context`: Context to remove. Can be a Context object or a context ID string. - -**Returns**: - -None - - -### list\_code\_contexts - -```python -def list_code_contexts() -> List[Context] -``` - -List all contexts. - -**Returns**: - -List of contexts. - - -### restart\_code\_context - -```python -def restart_code_context(context: Union[Context, str]) -> None -``` - -Restart a context. - -**Arguments**: - -- `context`: Context to restart. Can be a Context object or a context ID string. - -**Returns**: - -None - - - - -## ChartType - -```python -class ChartType(str, enum.Enum) -``` - -Chart types - - -## ScaleType - -```python -class ScaleType(str, enum.Enum) -``` - -Ax scale types - - -## Chart - -```python -class Chart() -``` - -Extracted data from a chart. It's useful for building an interactive charts or custom visualizations. - - - - - From f35baa5a461f4e89fe597992ef6229c17ca43e79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 06:47:03 -0700 Subject: [PATCH 664/722] Update dependency httpx to v0.28.1 (#222) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/server/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 316b2622..7277633c 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -1,5 +1,5 @@ fastapi==0.111.0 -httpx==0.27.0 +httpx==0.28.1 websockets==12.0 uvicorn[standard]==0.30.1 requests==2.32.5 From 2dea8d599e2bf06a5fa7d7e285cd3c064ad77273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Tue, 17 Mar 2026 14:47:12 +0100 Subject: [PATCH 665/722] chore(python): update Python to 3.10 (#224) * chore(python): update Python to 3.10 * chore: add changeset --- .changeset/real-jeans-carry.md | 5 + python/poetry.lock | 323 +++++++++++---------------------- python/pyproject.toml | 2 +- 3 files changed, 115 insertions(+), 215 deletions(-) create mode 100644 .changeset/real-jeans-carry.md diff --git a/.changeset/real-jeans-carry.md b/.changeset/real-jeans-carry.md new file mode 100644 index 00000000..e660bcea --- /dev/null +++ b/.changeset/real-jeans-carry.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-python': minor +--- + +Set minimum Python version to 3.10 diff --git a/python/poetry.lock b/python/poetry.lock index b75f949b..c05d12c0 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "anyio" @@ -6,7 +6,6 @@ version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, @@ -20,7 +19,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] [[package]] @@ -29,7 +28,6 @@ version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -40,8 +38,8 @@ cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6) ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\""] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "bracex" @@ -49,7 +47,6 @@ version = "2.6" description = "Bash style brace expander." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952"}, {file = "bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7"}, @@ -61,7 +58,6 @@ version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, @@ -73,8 +69,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -86,7 +80,6 @@ version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, @@ -171,7 +164,6 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -187,7 +179,6 @@ version = "2.0.1" description = "Python library for Dockerfile manipulation" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "dockerfile-parse-2.0.1.tar.gz", hash = "sha256:3184ccdc513221983e503ac00e1aa504a2aa8f84e5de673c46b0b6eee99ec7bc"}, {file = "dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6"}, @@ -199,7 +190,6 @@ version = "2.10.2" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "e2b-2.10.2-py3-none-any.whl", hash = "sha256:c719291fc9b3006b286809f6e820b803a1aab9a6f5ae4fe0140ead17efbce821"}, {file = "e2b-2.10.2.tar.gz", hash = "sha256:b77ecd620fd057b81a9610da18141811c003cc6f446c39c7ec7b9e9dc147d864"}, @@ -223,8 +213,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -239,7 +227,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -254,7 +241,6 @@ version = "4.60.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e36fadcf7e8ca6e34d490eef86ed638d6fd9c55d2f514b05687622cfc4a7050"}, {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e500fc9c04bee749ceabfc20cb4903f6981c2139050d85720ea7ada61b75d5c"}, @@ -317,17 +303,17 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] -type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] -woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] +type1 = ["xattr"] +unicode = ["unicodedata2 (>=17.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "h11" @@ -335,7 +321,6 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -347,7 +332,6 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -369,7 +353,6 @@ version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, @@ -383,7 +366,7 @@ idna = "*" sniffio = "*" [package.extras] -brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -394,43 +377,17 @@ version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" -groups = ["main", "dev"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] -[[package]] -name = "importlib-resources" -version = "6.5.2" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.9\"" -files = [ - {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, - {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] -type = ["pytest-mypy"] - [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -442,7 +399,6 @@ version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, @@ -566,7 +522,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -591,7 +546,6 @@ version = "3.9.4" description = "Python plotting package" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, @@ -640,7 +594,6 @@ files = [ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" @@ -657,7 +610,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -669,7 +621,6 @@ version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, @@ -724,7 +675,6 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -732,127 +682,110 @@ files = [ [[package]] name = "pillow" -version = "11.3.0" -description = "Python Imaging Library (Fork)" +version = "12.1.1" +description = "Python Imaging Library (fork)" optional = false -python-versions = ">=3.9" -groups = ["dev"] +python-versions = ">=3.10" files = [ - {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, - {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, - {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, - {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, - {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, - {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, - {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, - {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, - {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, - {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, - {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, - {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, - {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, - {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, - {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, - {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, - {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, - {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, - {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, - {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, - {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, - {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, - {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, - {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, - {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, - {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, - {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, - {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, - {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, - {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, - {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, - {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, - {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, - {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, - {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, - {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, - {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, - {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, - {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, - {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, - {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, - {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, - {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, - {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, - {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, - {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, - {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, - {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, - {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, - {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, - {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, - {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, - {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, - {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, - {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, - {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, - {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, + {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, + {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, + {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, + {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, + {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, + {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, + {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, + {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, + {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, + {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, + {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, + {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, + {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, + {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, + {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, + {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, + {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, + {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, + {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, + {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, + {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, + {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -test-arrow = ["pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions ; python_version < \"3.10\""] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] @@ -861,7 +794,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -877,7 +809,6 @@ version = "6.33.5" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, @@ -897,7 +828,6 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -912,7 +842,6 @@ version = "3.2.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, @@ -927,7 +856,6 @@ version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, @@ -951,7 +879,6 @@ version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, @@ -970,7 +897,6 @@ version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, @@ -986,7 +912,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -1007,7 +932,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1022,7 +946,6 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1037,7 +960,6 @@ version = "14.2.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, @@ -1056,7 +978,6 @@ version = "0.11.13" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"}, {file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"}, @@ -1084,7 +1005,6 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main", "dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1096,7 +1016,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1108,7 +1027,6 @@ version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -1120,7 +1038,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -1132,7 +1049,6 @@ version = "10.1" description = "Wildcard/glob file name matcher." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a"}, {file = "wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af"}, @@ -1141,28 +1057,7 @@ files = [ [package.dependencies] bracex = ">=2.1.1" -[[package]] -name = "zipp" -version = "3.23.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.9\"" -files = [ - {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, - {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] - [metadata] -lock-version = "2.1" -python-versions = "^3.9" -content-hash = "326cd369ac576edc7c00c0d6c143ddbf23be0b91d406ac1ae3f198330a1fc5ac" +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "ad2d93b63a361a6a6e9f2163c8035f516eb7f7714e459438bb2f3ddc1edfc129" diff --git a/python/pyproject.toml b/python/pyproject.toml index fb02b0b0..6ab9d889 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -10,7 +10,7 @@ repository = "https://github.com/e2b-dev/code-interpreter/tree/main/python" packages = [{ include = "e2b_code_interpreter" }] [tool.poetry.dependencies] -python = "^3.9" +python = "^3.10" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" From eec145933ec525c23ecd22ab3efc3957314ce344 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 17 Mar 2026 13:49:05 +0000 Subject: [PATCH 666/722] [skip ci] Release new versions --- .changeset/real-jeans-carry.md | 5 ----- python/package.json | 2 +- python/pyproject.toml | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 .changeset/real-jeans-carry.md diff --git a/.changeset/real-jeans-carry.md b/.changeset/real-jeans-carry.md deleted file mode 100644 index e660bcea..00000000 --- a/.changeset/real-jeans-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor ---- - -Set minimum Python version to 3.10 diff --git a/python/package.json b/python/package.json index 8a486671..10e057ca 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.4.1", + "version": "2.5.0", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 6ab9d889..61c1e5eb 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.4.1" +version = "2.5.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" From 5cb8bd5209646b6f82212c6021abfeae3d87b777 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:38:08 -0700 Subject: [PATCH 667/722] Update dependency e2b to v2.15.2 (#225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- python/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index c05d12c0..facb5841 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -186,13 +186,13 @@ files = [ [[package]] name = "e2b" -version = "2.10.2" +version = "2.15.2" description = "E2B SDK that give agents cloud environments" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.10.2-py3-none-any.whl", hash = "sha256:c719291fc9b3006b286809f6e820b803a1aab9a6f5ae4fe0140ead17efbce821"}, - {file = "e2b-2.10.2.tar.gz", hash = "sha256:b77ecd620fd057b81a9610da18141811c003cc6f446c39c7ec7b9e9dc147d864"}, + {file = "e2b-2.15.2-py3-none-any.whl", hash = "sha256:19a56fbdea25974dc81426ed48337eae6cea91d404f5bcf8861a5a2c6e4d982a"}, + {file = "e2b-2.15.2.tar.gz", hash = "sha256:414379d2421d6827eeb2eb50a4d6b3fdb7d691b39ff73b5ea05ca4b532819831"}, ] [package.dependencies] From c23cdacbaab3d7154a6ff37b548e613dbf3346a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 02:02:57 -0700 Subject: [PATCH 668/722] Update dependency httpx to v0.28.1 (#226) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- python/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/poetry.lock b/python/poetry.lock index facb5841..58a1fcab 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -349,13 +349,13 @@ trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.0" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -363,13 +363,13 @@ anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" From 42985a3283b69acb88af188d2d1a2a6081a4563a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 02:19:02 -0700 Subject: [PATCH 669/722] Update dependency bokeh to v3.9.0 (#221) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jakub Novák --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 86c715f2..7f9fa70e 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -14,7 +14,7 @@ e2b_charts # Other packages aiohttp==3.13.3 beautifulsoup4==4.14.3 -bokeh==3.8.2 +bokeh==3.9.0 gensim==4.4.0 imageio==2.37.3 joblib==1.5.3 From f93189b5be51213bd2b831524cc19a7996c5aca0 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Mon, 23 Mar 2026 12:13:39 +0100 Subject: [PATCH 670/722] Add target env selection to prod build workflow (#228) Co-authored-by: Matt Brockman --- .github/workflows/build_prod_template.yml | 68 +++++++++++++++++++++-- .github/workflows/release.yml | 2 +- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_prod_template.yml b/.github/workflows/build_prod_template.yml index ac2cfb33..da3424b0 100644 --- a/.github/workflows/build_prod_template.yml +++ b/.github/workflows/build_prod_template.yml @@ -3,6 +3,15 @@ name: Build Prod Template on: workflow_dispatch: inputs: + target_environment: + description: Target environment + required: true + type: choice + default: foxtrot + options: + - foxtrot + - staging + - juliett skip_cache: description: Skip build cache required: false @@ -10,7 +19,7 @@ on: default: false concurrency: - group: Release-${{ github.ref }} + group: Release-${{ github.ref }}-${{ inputs.target_environment }} cancel-in-progress: false permissions: @@ -33,18 +42,69 @@ jobs: - uses: actions/setup-python@v6 with: - python-version: '${{ env.TOOL_VERSION_PYTHON }}' + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install development dependencies working-directory: ./template run: pip install -r requirements-dev.txt + - name: Resolve target environment + env: + TARGET_ENVIRONMENT: ${{ inputs.target_environment }} + FOXTROT_DOMAIN: ${{ vars.E2B_DOMAIN }} + FOXTROT_API_KEY: ${{ secrets.E2B_PROD_API_KEY }} + STAGING_API_KEY: ${{ secrets.E2B_STAGING_API_KEY }} + JULIETT_API_KEY: ${{ secrets.E2B_JULIETT_API_KEY }} + run: | + set -eu + + case "$TARGET_ENVIRONMENT" in + foxtrot) + E2B_DOMAIN="$FOXTROT_DOMAIN" + E2B_API_KEY="$FOXTROT_API_KEY" + ;; + staging) + E2B_DOMAIN="e2b-staging.dev" + E2B_API_KEY="$STAGING_API_KEY" + ;; + juliett) + E2B_DOMAIN="e2b-juliett.dev" + E2B_API_KEY="$JULIETT_API_KEY" + ;; + *) + echo "Unknown target environment: $TARGET_ENVIRONMENT" >&2 + exit 1 + ;; + esac + + if [ -z "$E2B_DOMAIN" ]; then + echo "Missing E2B domain for target environment: $TARGET_ENVIRONMENT" >&2 + exit 1 + fi + + if [ -z "$E2B_API_KEY" ]; then + echo "Missing API key secret for target environment: $TARGET_ENVIRONMENT" >&2 + exit 1 + fi + + echo "::add-mask::$E2B_API_KEY" + + { + echo "E2B_DOMAIN=$E2B_DOMAIN" + echo "E2B_API_KEY=$E2B_API_KEY" + } >> "$GITHUB_ENV" + + { + echo "### Build target" + echo + echo "Target: $TARGET_ENVIRONMENT" + echo "Domain: $E2B_DOMAIN" + } >> "$GITHUB_STEP_SUMMARY" + - name: Build E2B template id: build-template working-directory: ./template run: | python build_prod.py env: - E2B_API_KEY: ${{ secrets.E2B_PROD_API_KEY }} - E2B_DOMAIN: ${{ vars.E2B_DOMAIN }} SKIP_CACHE: ${{ inputs.skip_cache }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8c66f04d..4991041f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ on: branches: - main -concurrency: ${{ github.workflow }}-${{ github.ref }} +concurrency: Release-${{ github.ref }}-foxtrot permissions: id-token: write From a7c89226bdcad2e495f7bd3f04de0912738d32d8 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:08:51 +0100 Subject: [PATCH 671/722] Added systemd oom handling and tests (#227) * added systemd oom handling and tests * format * reduce restart loop to 1s * explicitly stdout/stderr * sudo * move health check to avoid deadlocking process * added changeset * updated as per comments * removed burst in jupyter.service too * updated env vars --- .changeset/empty-knives-make.md | 5 ++ js/tests/systemd.test.ts | 67 +++++++++++++++++++++++ python/tests/async/test_async_systemd.py | 59 ++++++++++++++++++++ python/tests/sync/test_systemd.py | 55 +++++++++++++++++++ template/jupyter-healthcheck.sh | 23 ++++++++ template/start-up.sh | 20 +++---- template/systemd/code-interpreter.service | 17 ++++++ template/systemd/jupyter.service | 15 +++++ template/template.py | 30 ++++++++-- 9 files changed, 272 insertions(+), 19 deletions(-) create mode 100644 .changeset/empty-knives-make.md create mode 100644 js/tests/systemd.test.ts create mode 100644 python/tests/async/test_async_systemd.py create mode 100644 python/tests/sync/test_systemd.py create mode 100644 template/jupyter-healthcheck.sh create mode 100644 template/systemd/code-interpreter.service create mode 100644 template/systemd/jupyter.service diff --git a/.changeset/empty-knives-make.md b/.changeset/empty-knives-make.md new file mode 100644 index 00000000..68f99e66 --- /dev/null +++ b/.changeset/empty-knives-make.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +added systemd to handle process restarts diff --git a/js/tests/systemd.test.ts b/js/tests/systemd.test.ts new file mode 100644 index 00000000..76e75563 --- /dev/null +++ b/js/tests/systemd.test.ts @@ -0,0 +1,67 @@ +import { expect } from 'vitest' +import { sandboxTest, wait } from './setup' + +async function waitForHealth(sandbox: any, maxRetries = 10, intervalMs = 100) { + for (let i = 0; i < maxRetries; i++) { + try { + const result = await sandbox.commands.run( + 'curl -s -o /dev/null -w "%{http_code}" http://0.0.0.0:49999/health' + ) + if (result.stdout.trim() === '200') { + return true + } + } catch { + // Connection refused or other error, retry + } + await wait(intervalMs) + } + return false +} + +sandboxTest('restart after jupyter kill', async ({ sandbox }) => { + // Verify health is up initially + const initialHealth = await waitForHealth(sandbox) + expect(initialHealth).toBe(true) + + // Kill the jupyter process as root + // The command handle may get killed too (since killing jupyter cascades to code-interpreter), + // so we catch the error. + try { + await sandbox.commands.run("kill -9 $(pgrep -f 'jupyter server')", { + user: 'root', + }) + } catch { + // Expected — the kill cascade may terminate the command handle + } + + // Wait for systemd to restart both services + const recovered = await waitForHealth(sandbox, 60, 500) + expect(recovered).toBe(true) + + // Verify code execution works after recovery + const result = await sandbox.runCode('x = 1; x') + expect(result.text).toEqual('1') +}) + +sandboxTest('restart after code-interpreter kill', async ({ sandbox }) => { + // Verify health is up initially + const initialHealth = await waitForHealth(sandbox) + expect(initialHealth).toBe(true) + + // Kill the code-interpreter process as root + try { + await sandbox.commands.run("kill -9 $(pgrep -f 'uvicorn main:app')", { + user: 'root', + }) + } catch { + // Expected — killing code-interpreter may terminate the command handle + } + + // Wait for systemd to restart it and health to come back + const recovered = await waitForHealth(sandbox, 60, 500) + expect(recovered).toBe(true) + + // Verify code execution works after recovery + const result = await sandbox.runCode('x = 1; x') + expect(result.text).toEqual('1') +}) diff --git a/python/tests/async/test_async_systemd.py b/python/tests/async/test_async_systemd.py new file mode 100644 index 00000000..8a9f89ae --- /dev/null +++ b/python/tests/async/test_async_systemd.py @@ -0,0 +1,59 @@ +import asyncio + +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def wait_for_health(sandbox: AsyncSandbox, max_retries=10, interval_ms=100): + for _ in range(max_retries): + try: + result = await sandbox.commands.run( + 'curl -s -o /dev/null -w "%{http_code}" http://0.0.0.0:49999/health' + ) + if result.stdout.strip() == "200": + return True + except Exception: + pass + await asyncio.sleep(interval_ms / 1000) + return False + + +async def test_restart_after_jupyter_kill(async_sandbox: AsyncSandbox): + # Verify health is up initially + assert await wait_for_health(async_sandbox) + + # Kill the jupyter process as root + # The command handle may get killed too (killing jupyter cascades to code-interpreter), + # so we catch the error. + try: + await async_sandbox.commands.run( + "kill -9 $(pgrep -f 'jupyter server')", user="root" + ) + except Exception: + pass + + # Wait for systemd to restart both services + assert await wait_for_health(async_sandbox, 60, 500) + + # Verify code execution works after recovery + result = await async_sandbox.run_code("x = 1; x") + assert result.text == "1" + + +async def test_restart_after_code_interpreter_kill(async_sandbox: AsyncSandbox): + # Verify health is up initially + assert await wait_for_health(async_sandbox) + + # Kill the code-interpreter process as root + try: + await async_sandbox.commands.run( + "kill -9 $(pgrep -f 'uvicorn main:app')", user="root" + ) + except Exception: + pass + + # Wait for systemd to restart it and health to come back + assert await wait_for_health(async_sandbox, 60, 500) + + # Verify code execution works after recovery + result = await async_sandbox.run_code("x = 1; x") + assert result.text == "1" diff --git a/python/tests/sync/test_systemd.py b/python/tests/sync/test_systemd.py new file mode 100644 index 00000000..e6ccc256 --- /dev/null +++ b/python/tests/sync/test_systemd.py @@ -0,0 +1,55 @@ +import time + +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +def wait_for_health(sandbox: Sandbox, max_retries=10, interval_ms=100): + for _ in range(max_retries): + try: + result = sandbox.commands.run( + 'curl -s -o /dev/null -w "%{http_code}" http://0.0.0.0:49999/health' + ) + if result.stdout.strip() == "200": + return True + except Exception: + pass + time.sleep(interval_ms / 1000) + return False + + +def test_restart_after_jupyter_kill(sandbox: Sandbox): + # Verify health is up initially + assert wait_for_health(sandbox) + + # Kill the jupyter process as root + # The command handle may get killed too (killing jupyter cascades to code-interpreter), + # so we catch the error. + try: + sandbox.commands.run("kill -9 $(pgrep -f 'jupyter server')", user="root") + except Exception: + pass + + # Wait for systemd to restart both services + assert wait_for_health(sandbox, 60, 500) + + # Verify code execution works after recovery + result = sandbox.run_code("x = 1; x") + assert result.text == "1" + + +def test_restart_after_code_interpreter_kill(sandbox: Sandbox): + # Verify health is up initially + assert wait_for_health(sandbox) + + # Kill the code-interpreter process as root + try: + sandbox.commands.run("kill -9 $(pgrep -f 'uvicorn main:app')", user="root") + except Exception: + pass + + # Wait for systemd to restart it and health to come back + assert wait_for_health(sandbox, 60, 500) + + # Verify code execution works after recovery + result = sandbox.run_code("x = 1; x") + assert result.text == "1" diff --git a/template/jupyter-healthcheck.sh b/template/jupyter-healthcheck.sh new file mode 100644 index 00000000..a4c00131 --- /dev/null +++ b/template/jupyter-healthcheck.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Custom health check for Jupyter Server +# Verifies the server is responsive via the /api/status endpoint + +MAX_RETRIES=50 +RETRY_INTERVAL=0.2 + +for i in $(seq 1 $MAX_RETRIES); do + status_code=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") + + if [ "$status_code" -eq 200 ]; then + echo "Jupyter Server is healthy" + exit 0 + fi + + if [ $((i % 10)) -eq 0 ]; then + echo "Waiting for Jupyter Server to become healthy... (attempt $i/$MAX_RETRIES)" + fi + sleep $RETRY_INTERVAL +done + +echo "Jupyter Server health check failed after $MAX_RETRIES attempts" +exit 1 diff --git a/template/start-up.sh b/template/start-up.sh index d30cfc9e..5786b039 100755 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -1,22 +1,16 @@ #!/bin/bash -function start_jupyter_server() { - counter=0 - response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") - while [[ ${response} -ne 200 ]]; do - let counter++ - if ((counter % 20 == 0)); then - echo "Waiting for Jupyter Server to start..." - sleep 0.1 - fi - - response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") - done +function start_code_interpreter() { + /root/.jupyter/jupyter-healthcheck.sh + if [ $? -ne 0 ]; then + echo "Jupyter Server failed to start, aborting." + exit 1 + fi cd /root/.server/ .venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } echo "Starting Code Interpreter server..." -start_jupyter_server & +start_code_interpreter & MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 diff --git a/template/systemd/code-interpreter.service b/template/systemd/code-interpreter.service new file mode 100644 index 00000000..04c165b4 --- /dev/null +++ b/template/systemd/code-interpreter.service @@ -0,0 +1,17 @@ +[Unit] +Description=Code Interpreter Server +Documentation=https://github.com/e2b-dev/code-interpreter +Requires=jupyter.service +After=jupyter.service +PartOf=jupyter.service +StartLimitBurst=0 + +[Service] +Type=simple +WorkingDirectory=/root/.server +ExecStartPre=/root/.jupyter/jupyter-healthcheck.sh +ExecStart=/root/.server/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 +Restart=on-failure +RestartSec=1 +StandardOutput=journal +StandardError=journal diff --git a/template/systemd/jupyter.service b/template/systemd/jupyter.service new file mode 100644 index 00000000..37b83f29 --- /dev/null +++ b/template/systemd/jupyter.service @@ -0,0 +1,15 @@ +[Unit] +Description=Jupyter Server +Documentation=https://jupyter-server.readthedocs.io +Wants=code-interpreter.service +StartLimitBurst=0 + +[Service] +Type=simple +Environment=MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc +ExecStart=/usr/local/bin/jupyter server --IdentityProvider.token="" +ExecStartPost=-/usr/bin/systemctl reset-failed code-interpreter +Restart=on-failure +RestartSec=1 +StandardOutput=null +StandardError=journal diff --git a/template/template.py b/template/template.py index e10e89a8..63ec447a 100644 --- a/template/template.py +++ b/template/template.py @@ -17,9 +17,6 @@ def make_template( "PIP_DEFAULT_TIMEOUT": "100", "PIP_DISABLE_PIP_VERSION_CHECK": "1", "PIP_NO_CACHE_DIR": "1", - "JUPYTER_CONFIG_PATH": "/root/.jupyter", - "IPYTHON_CONFIG_PATH": "/root/.ipython", - "SERVER_PATH": "/root/.server", "JAVA_VERSION": "11", "JAVA_HOME": "/usr/lib/jvm/jdk-${JAVA_VERSION}", "IJAVA_VERSION": "1.3.0", @@ -110,14 +107,30 @@ def make_template( # Copy configuration files template = ( template.copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") - .copy("start-up.sh", ".jupyter/start-up.sh") - .run_cmd("chmod +x .jupyter/start-up.sh") + .copy("jupyter-healthcheck.sh", ".jupyter/jupyter-healthcheck.sh") + .run_cmd("chmod +x .jupyter/jupyter-healthcheck.sh") .copy("jupyter_server_config.py", ".jupyter/") .make_dir(".ipython/profile_default/startup") .copy("ipython_kernel_config.py", ".ipython/profile_default/") .copy("startup_scripts", ".ipython/profile_default/startup") ) + if not is_docker: + template = ( + template.copy( + "systemd/jupyter.service", "/etc/systemd/system/jupyter.service" + ) + .copy( + "systemd/code-interpreter.service", + "/etc/systemd/system/code-interpreter.service", + ) + .run_cmd("systemctl daemon-reload") + ) + else: + template = template.copy("start-up.sh", ".jupyter/start-up.sh").run_cmd( + "chmod +x .jupyter/start-up.sh" + ) + if is_docker: # create user user and /home/user template = template.run_cmd("useradd -m user") @@ -130,6 +143,11 @@ def make_template( template = template.set_user("user").set_workdir("/home/user") + if is_docker: + start_cmd = "sudo /root/.jupyter/start-up.sh" + else: + start_cmd = "sudo systemctl start jupyter" + return template.set_start_cmd( - "sudo /root/.jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") + start_cmd, wait_for_url("http://localhost:49999/health") ) From 125784a79889ba2043f324358d71a1ab2187f9b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Mar 2026 13:23:19 +0000 Subject: [PATCH 672/722] [skip ci] Release new versions --- .changeset/empty-knives-make.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/empty-knives-make.md diff --git a/.changeset/empty-knives-make.md b/.changeset/empty-knives-make.md deleted file mode 100644 index 68f99e66..00000000 --- a/.changeset/empty-knives-make.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -added systemd to handle process restarts diff --git a/template/package.json b/template/package.json index 17497708..c2c0de45 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.3.0", + "version": "0.3.1", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 3cbac659f781bfd7c21a6926a263775bfc894180 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:08:07 +0100 Subject: [PATCH 673/722] Update patch-updates (#229) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/js_tests.yml | 2 +- python/poetry.lock | 6 +++--- template/requirements-dev.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index 395c7c52..a7a328fe 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -62,7 +62,7 @@ jobs: - name: Install Bun uses: oven-sh/setup-bun@v2 with: - bun-version: 1.3.10 + bun-version: 1.3.11 - name: Run Bun tests run: pnpm test:bun diff --git a/python/poetry.lock b/python/poetry.lock index 58a1fcab..5f2f67f4 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -186,13 +186,13 @@ files = [ [[package]] name = "e2b" -version = "2.15.2" +version = "2.15.3" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.15.2-py3-none-any.whl", hash = "sha256:19a56fbdea25974dc81426ed48337eae6cea91d404f5bcf8861a5a2c6e4d982a"}, - {file = "e2b-2.15.2.tar.gz", hash = "sha256:414379d2421d6827eeb2eb50a4d6b3fdb7d691b39ff73b5ea05ca4b532819831"}, + {file = "e2b-2.15.3-py3-none-any.whl", hash = "sha256:0934f69f93f42cc4ef19415af003b13eb12d4e721b06f0ffa5aac91e6cf7c6b8"}, + {file = "e2b-2.15.3.tar.gz", hash = "sha256:a15da5162db88d46dfa3593b08d9b3b31bb5fac36ba66c7e6ae3b652f56c06d8"}, ] [package.dependencies] diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index c1821021..7601a5fd 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.15.2 +e2b==2.15.3 python-dotenv==1.2.2 \ No newline at end of file From d064e06884a88edb5d0579f0897a0aba0e6001f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:59:33 +0000 Subject: [PATCH 674/722] Update dependency e2b (#231) * Update dependency e2b * chore: add changeset --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jakub Novak --- .changeset/clever-radios-send.md | 6 ++++++ pnpm-lock.yaml | 24 ++++++++++++------------ python/poetry.lock | 6 +++--- 3 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 .changeset/clever-radios-send.md diff --git a/.changeset/clever-radios-send.md b/.changeset/clever-radios-send.md new file mode 100644 index 00000000..166f905f --- /dev/null +++ b/.changeset/clever-radios-send.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-python': minor +'@e2b/code-interpreter': minor +--- + +Bump e2b core package diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 205c48b3..26b279e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: dependencies: e2b: specifier: ^2.8.4 - version: 2.14.1 + version: 2.15.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -987,8 +987,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.14.1: - resolution: {integrity: sha512-g0NPZNzwIaePTahu9ixBtqrw9IZQ8ThK8dt+DU394+jmxQJ+69c2t8A0j973/j+bHo3QdNFxIRIH6zDcC3ueaw==} + e2b@2.15.0: + resolution: {integrity: sha512-wjdrWBB/H9Lmo1vpJaCKlpcNjHKzztAL+/0q4gv8mpD96rrE4eh45kIxOMbGwb0vFXaDjjL2d93CYGAZDfKlPg==} engines: {node: '>=20'} easy-table@1.2.0: @@ -1313,8 +1313,8 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -1654,8 +1654,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.5.11: - resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} + tar@7.5.12: + resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} engines: {node: '>=18'} text-table@0.2.0: @@ -2660,7 +2660,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.14.1: + e2b@2.15.0: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) @@ -2671,7 +2671,7 @@ snapshots: glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.11 + tar: 7.5.12 easy-table@1.2.0: dependencies: @@ -3068,7 +3068,7 @@ snapshots: loupe@3.2.1: {} - lru-cache@11.2.6: {} + lru-cache@11.2.7: {} lru-cache@6.0.0: dependencies: @@ -3195,7 +3195,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.6 + lru-cache: 11.2.7 minipass: 7.1.3 path-type@4.0.0: {} @@ -3364,7 +3364,7 @@ snapshots: tapable@2.2.1: {} - tar@7.5.11: + tar@7.5.12: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 diff --git a/python/poetry.lock b/python/poetry.lock index 5f2f67f4..acaad693 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -186,13 +186,13 @@ files = [ [[package]] name = "e2b" -version = "2.15.3" +version = "2.16.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.15.3-py3-none-any.whl", hash = "sha256:0934f69f93f42cc4ef19415af003b13eb12d4e721b06f0ffa5aac91e6cf7c6b8"}, - {file = "e2b-2.15.3.tar.gz", hash = "sha256:a15da5162db88d46dfa3593b08d9b3b31bb5fac36ba66c7e6ae3b652f56c06d8"}, + {file = "e2b-2.16.0-py3-none-any.whl", hash = "sha256:e2bb38fce01e1fe076818aa731b45208f2eef4b843d90b61c48cb23985a7ef52"}, + {file = "e2b-2.16.0.tar.gz", hash = "sha256:e661fbd5524bf4435730eca081de7b74861f30366731a027c1c8503316e8890c"}, ] [package.dependencies] From e6f37d6982aa2a4e618db175a650a38647901cfe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Mar 2026 17:01:14 +0000 Subject: [PATCH 675/722] [skip ci] Release new versions --- .changeset/clever-radios-send.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/clever-radios-send.md diff --git a/.changeset/clever-radios-send.md b/.changeset/clever-radios-send.md deleted file mode 100644 index 166f905f..00000000 --- a/.changeset/clever-radios-send.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-python': minor -'@e2b/code-interpreter': minor ---- - -Bump e2b core package diff --git a/js/package.json b/js/package.json index 4d54a7fc..20eac2b7 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.3.3", + "version": "2.4.0", "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 10e057ca..411295ab 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.5.0", + "version": "2.6.0", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 61c1e5eb..27da009a 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.5.0" +version = "2.6.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" From 6d703a4a9ef84f96258fff4a5116c0b152a7e113 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 17:03:38 +0000 Subject: [PATCH 676/722] Update dependency e2b to v2.16.0 (#232) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index 7601a5fd..da8ae26f 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.15.3 +e2b==2.16.0 python-dotenv==1.2.2 \ No newline at end of file From fc7b503c64403e5627d0d1483abca097d4050841 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 24 Mar 2026 20:58:49 +0100 Subject: [PATCH 677/722] fixes local Docker testing setup (#238) * preserve E2B_LOCAL var in sudo * disable reconnect and systemd tests on debug * fmt --- js/tests/reconnect.test.ts | 4 +- js/tests/systemd.test.ts | 88 ++++++++++++---------- python/tests/async/test_async_reconnect.py | 3 + python/tests/async/test_async_systemd.py | 4 + python/tests/sync/test_reconnect.py | 3 + python/tests/sync/test_systemd.py | 4 + template/template.py | 2 +- 7 files changed, 64 insertions(+), 44 deletions(-) diff --git a/js/tests/reconnect.test.ts b/js/tests/reconnect.test.ts index c80e3cf8..4699fcf1 100644 --- a/js/tests/reconnect.test.ts +++ b/js/tests/reconnect.test.ts @@ -1,9 +1,9 @@ import { expect } from 'vitest' import { Sandbox } from '../src' -import { sandboxTest } from './setup' +import { isDebug, sandboxTest } from './setup' -sandboxTest('reconnect', async ({ sandbox }) => { +sandboxTest.skipIf(isDebug)('reconnect', async ({ sandbox }) => { sandbox = await Sandbox.connect(sandbox.sandboxId) const result = await sandbox.runCode('x =1; x') diff --git a/js/tests/systemd.test.ts b/js/tests/systemd.test.ts index 76e75563..28f59398 100644 --- a/js/tests/systemd.test.ts +++ b/js/tests/systemd.test.ts @@ -1,5 +1,5 @@ import { expect } from 'vitest' -import { sandboxTest, wait } from './setup' +import { isDebug, sandboxTest, wait } from './setup' async function waitForHealth(sandbox: any, maxRetries = 10, intervalMs = 100) { for (let i = 0; i < maxRetries; i++) { @@ -18,50 +18,56 @@ async function waitForHealth(sandbox: any, maxRetries = 10, intervalMs = 100) { return false } -sandboxTest('restart after jupyter kill', async ({ sandbox }) => { - // Verify health is up initially - const initialHealth = await waitForHealth(sandbox) - expect(initialHealth).toBe(true) +sandboxTest.skipIf(isDebug)( + 'restart after jupyter kill', + async ({ sandbox }) => { + // Verify health is up initially + const initialHealth = await waitForHealth(sandbox) + expect(initialHealth).toBe(true) - // Kill the jupyter process as root - // The command handle may get killed too (since killing jupyter cascades to code-interpreter), - // so we catch the error. - try { - await sandbox.commands.run("kill -9 $(pgrep -f 'jupyter server')", { - user: 'root', - }) - } catch { - // Expected — the kill cascade may terminate the command handle - } + // Kill the jupyter process as root + // The command handle may get killed too (since killing jupyter cascades to code-interpreter), + // so we catch the error. + try { + await sandbox.commands.run("kill -9 $(pgrep -f 'jupyter server')", { + user: 'root', + }) + } catch { + // Expected — the kill cascade may terminate the command handle + } - // Wait for systemd to restart both services - const recovered = await waitForHealth(sandbox, 60, 500) - expect(recovered).toBe(true) + // Wait for systemd to restart both services + const recovered = await waitForHealth(sandbox, 60, 500) + expect(recovered).toBe(true) - // Verify code execution works after recovery - const result = await sandbox.runCode('x = 1; x') - expect(result.text).toEqual('1') -}) + // Verify code execution works after recovery + const result = await sandbox.runCode('x = 1; x') + expect(result.text).toEqual('1') + } +) -sandboxTest('restart after code-interpreter kill', async ({ sandbox }) => { - // Verify health is up initially - const initialHealth = await waitForHealth(sandbox) - expect(initialHealth).toBe(true) +sandboxTest.skipIf(isDebug)( + 'restart after code-interpreter kill', + async ({ sandbox }) => { + // Verify health is up initially + const initialHealth = await waitForHealth(sandbox) + expect(initialHealth).toBe(true) - // Kill the code-interpreter process as root - try { - await sandbox.commands.run("kill -9 $(pgrep -f 'uvicorn main:app')", { - user: 'root', - }) - } catch { - // Expected — killing code-interpreter may terminate the command handle - } + // Kill the code-interpreter process as root + try { + await sandbox.commands.run("kill -9 $(pgrep -f 'uvicorn main:app')", { + user: 'root', + }) + } catch { + // Expected — killing code-interpreter may terminate the command handle + } - // Wait for systemd to restart it and health to come back - const recovered = await waitForHealth(sandbox, 60, 500) - expect(recovered).toBe(true) + // Wait for systemd to restart it and health to come back + const recovered = await waitForHealth(sandbox, 60, 500) + expect(recovered).toBe(true) - // Verify code execution works after recovery - const result = await sandbox.runCode('x = 1; x') - expect(result.text).toEqual('1') -}) + // Verify code execution works after recovery + const result = await sandbox.runCode('x = 1; x') + expect(result.text).toEqual('1') + } +) diff --git a/python/tests/async/test_async_reconnect.py b/python/tests/async/test_async_reconnect.py index 9ed16f4a..6cd36c83 100644 --- a/python/tests/async/test_async_reconnect.py +++ b/python/tests/async/test_async_reconnect.py @@ -1,6 +1,9 @@ +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox +@pytest.mark.skip_debug async def test_reconnect(async_sandbox: AsyncSandbox): sandbox_id = async_sandbox.sandbox_id diff --git a/python/tests/async/test_async_systemd.py b/python/tests/async/test_async_systemd.py index 8a9f89ae..5a129abc 100644 --- a/python/tests/async/test_async_systemd.py +++ b/python/tests/async/test_async_systemd.py @@ -1,5 +1,7 @@ import asyncio +import pytest + from e2b_code_interpreter.code_interpreter_async import AsyncSandbox @@ -17,6 +19,7 @@ async def wait_for_health(sandbox: AsyncSandbox, max_retries=10, interval_ms=100 return False +@pytest.mark.skip_debug async def test_restart_after_jupyter_kill(async_sandbox: AsyncSandbox): # Verify health is up initially assert await wait_for_health(async_sandbox) @@ -39,6 +42,7 @@ async def test_restart_after_jupyter_kill(async_sandbox: AsyncSandbox): assert result.text == "1" +@pytest.mark.skip_debug async def test_restart_after_code_interpreter_kill(async_sandbox: AsyncSandbox): # Verify health is up initially assert await wait_for_health(async_sandbox) diff --git a/python/tests/sync/test_reconnect.py b/python/tests/sync/test_reconnect.py index 27800a84..f74b73de 100644 --- a/python/tests/sync/test_reconnect.py +++ b/python/tests/sync/test_reconnect.py @@ -1,6 +1,9 @@ +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox +@pytest.mark.skip_debug def test_reconnect(sandbox: Sandbox): sandbox_id = sandbox.sandbox_id diff --git a/python/tests/sync/test_systemd.py b/python/tests/sync/test_systemd.py index e6ccc256..574ed7d0 100644 --- a/python/tests/sync/test_systemd.py +++ b/python/tests/sync/test_systemd.py @@ -1,5 +1,7 @@ import time +import pytest + from e2b_code_interpreter.code_interpreter_sync import Sandbox @@ -17,6 +19,7 @@ def wait_for_health(sandbox: Sandbox, max_retries=10, interval_ms=100): return False +@pytest.mark.skip_debug def test_restart_after_jupyter_kill(sandbox: Sandbox): # Verify health is up initially assert wait_for_health(sandbox) @@ -37,6 +40,7 @@ def test_restart_after_jupyter_kill(sandbox: Sandbox): assert result.text == "1" +@pytest.mark.skip_debug def test_restart_after_code_interpreter_kill(sandbox: Sandbox): # Verify health is up initially assert wait_for_health(sandbox) diff --git a/template/template.py b/template/template.py index 63ec447a..9101636a 100644 --- a/template/template.py +++ b/template/template.py @@ -144,7 +144,7 @@ def make_template( template = template.set_user("user").set_workdir("/home/user") if is_docker: - start_cmd = "sudo /root/.jupyter/start-up.sh" + start_cmd = "sudo --preserve-env=E2B_LOCAL /root/.jupyter/start-up.sh" else: start_cmd = "sudo systemctl start jupyter" From 86ded61c5797336cdc1a4b590aefc10318e60831 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 10:43:09 -0700 Subject: [PATCH 678/722] Update dependency nltk to v3.9.4 [SECURITY] (#239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 7f9fa70e..23e0c23c 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -19,7 +19,7 @@ gensim==4.4.0 imageio==2.37.3 joblib==1.5.3 librosa==0.11.0 -nltk==3.9.3 +nltk==3.9.4 numpy==2.3.5 numba==0.63.1 opencv-python==4.11.0.86 From 52cce19c17747fa3833a79d4cb1528308ee79a44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 10:43:27 -0700 Subject: [PATCH 679/722] Update dependency requests to v2.33.0 [SECURITY] (#240) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- template/server/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/template/requirements.txt b/template/requirements.txt index 23e0c23c..56f77bd8 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -29,7 +29,7 @@ kaleido==1.0.0 pytest==8.3.5 python-docx==1.1.2 pytz==2025.2 -requests==2.32.5 +requests==2.33.0 scikit-image==0.25.2 scikit-learn==1.6.1 scipy==1.17.1 diff --git a/template/server/requirements.txt b/template/server/requirements.txt index 7277633c..b3e44b71 100644 --- a/template/server/requirements.txt +++ b/template/server/requirements.txt @@ -2,5 +2,5 @@ fastapi==0.111.0 httpx==0.28.1 websockets==12.0 uvicorn[standard]==0.30.1 -requests==2.32.5 +requests==2.33.0 pydantic==2.9.1 From 88bd5ece203fc335258813948181f051ab8526d7 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:46:17 +0200 Subject: [PATCH 680/722] Enable CORS for Code Interpreter Server (#242) --- .changeset/stale-forks-lay.md | 5 +++++ template/server/main.py | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 .changeset/stale-forks-lay.md diff --git a/.changeset/stale-forks-lay.md b/.changeset/stale-forks-lay.md new file mode 100644 index 00000000..3fa5eb16 --- /dev/null +++ b/.changeset/stale-forks-lay.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +allow cors diff --git a/template/server/main.py b/template/server/main.py index 1f296926..59215f57 100644 --- a/template/server/main.py +++ b/template/server/main.py @@ -6,6 +6,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI, Request +from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import PlainTextResponse from api.models.context import Context @@ -60,6 +61,13 @@ async def lifespan(app: FastAPI): app = FastAPI(lifespan=lifespan) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_methods=["*"], + allow_headers=["*"], +) + logger.info("Starting Code Interpreter server") From cff55c1fce6a6777c69e58bad8bcb46d1e6f5dd9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 30 Mar 2026 16:01:05 +0000 Subject: [PATCH 681/722] [skip ci] Release new versions --- .changeset/stale-forks-lay.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/stale-forks-lay.md diff --git a/.changeset/stale-forks-lay.md b/.changeset/stale-forks-lay.md deleted file mode 100644 index 3fa5eb16..00000000 --- a/.changeset/stale-forks-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -allow cors diff --git a/template/package.json b/template/package.json index c2c0de45..e94c7195 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.3.1", + "version": "0.3.2", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 6a3e536f06563c7cad39f784956a8160b486783c Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 31 Mar 2026 22:15:56 +0200 Subject: [PATCH 682/722] Normalize language in cwd (#243) * normalize language in cwd * added ts and node * updated --- .changeset/loud-emus-pump.md | 5 +++++ template/server/messaging.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/loud-emus-pump.md diff --git a/.changeset/loud-emus-pump.md b/.changeset/loud-emus-pump.md new file mode 100644 index 00000000..486b1243 --- /dev/null +++ b/.changeset/loud-emus-pump.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +normalize language for setting cwd diff --git a/template/server/messaging.py b/template/server/messaging.py index 0b151f8e..bbc19170 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -265,7 +265,7 @@ async def change_current_directory( request = self._get_execute_request( message_id, f"Deno.chdir('{path}')", True ) - elif language == "js": + elif language in ("javascript", "typescript"): request = self._get_execute_request( message_id, f"process.chdir('{path}')", True ) From dc46077e2438d04a2bac18ed96da2f6370d48b94 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 31 Mar 2026 20:25:18 +0000 Subject: [PATCH 683/722] [skip ci] Release new versions --- .changeset/loud-emus-pump.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/loud-emus-pump.md diff --git a/.changeset/loud-emus-pump.md b/.changeset/loud-emus-pump.md deleted file mode 100644 index 486b1243..00000000 --- a/.changeset/loud-emus-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -normalize language for setting cwd diff --git a/template/package.json b/template/package.json index e94c7195..3917346d 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.3.2", + "version": "0.3.3", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 82e18365802a23da64f47b8967c9fb9626a63d32 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Tue, 31 Mar 2026 22:36:10 +0200 Subject: [PATCH 684/722] added tests for pwd (#244) * added tests for pwd * fmt * updated tests --- js/tests/cwd.test.ts | 42 ++++++++++++++++++++++++++++ python/tests/async/test_async_cwd.py | 35 +++++++++++++++++++++++ python/tests/sync/test_cwd.py | 33 ++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 js/tests/cwd.test.ts create mode 100644 python/tests/async/test_async_cwd.py create mode 100644 python/tests/sync/test_cwd.py diff --git a/js/tests/cwd.test.ts b/js/tests/cwd.test.ts new file mode 100644 index 00000000..b9a35ca3 --- /dev/null +++ b/js/tests/cwd.test.ts @@ -0,0 +1,42 @@ +import { expect } from 'vitest' + +import { isDebug, sandboxTest } from './setup' + +// Skip these tests in debug mode — the pwd and user in the testing docker container +// are not the same as in the actual sandbox. + +sandboxTest.skipIf(isDebug)('cwd python', async ({ sandbox }) => { + const result = await sandbox.runCode( + 'from pathlib import Path; print(Path.cwd())', + { language: 'python' } + ) + expect(result.logs.stdout.join().trim()).toEqual('/home/user') +}) + +sandboxTest.skipIf(isDebug)('cwd javascript', async ({ sandbox }) => { + const result = await sandbox.runCode('process.cwd()', { + language: 'js', + }) + expect(result.text).toEqual('/home/user') +}) + +sandboxTest.skipIf(isDebug)('cwd typescript', async ({ sandbox }) => { + const result = await sandbox.runCode('process.cwd()', { + language: 'ts', + }) + expect(result.text).toEqual('/home/user') +}) + +sandboxTest.skipIf(isDebug)('cwd r', async ({ sandbox }) => { + const result = await sandbox.runCode('getwd()', { + language: 'r', + }) + expect(result.results[0]?.text.trim()).toEqual('[1] "/home/user"') +}) + +sandboxTest.skipIf(isDebug)('cwd java', async ({ sandbox }) => { + const result = await sandbox.runCode('System.getProperty("user.dir")', { + language: 'java', + }) + expect(result.results[0]?.text.trim()).toEqual('/home/user') +}) diff --git a/python/tests/async/test_async_cwd.py b/python/tests/async/test_async_cwd.py new file mode 100644 index 00000000..e03b3e68 --- /dev/null +++ b/python/tests/async/test_async_cwd.py @@ -0,0 +1,35 @@ +import pytest + +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +@pytest.mark.skip_debug() +async def test_cwd_python(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code("from pathlib import Path; print(Path.cwd())") + assert "".join(result.logs.stdout).strip() == "/home/user" + + +@pytest.mark.skip_debug() +async def test_cwd_javascript(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code("process.cwd()", language="js") + assert result.text == "/home/user" + + +@pytest.mark.skip_debug() +async def test_cwd_typescript(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code("process.cwd()", language="ts") + assert result.text == "/home/user" + + +@pytest.mark.skip_debug() +async def test_cwd_r(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code("getwd()", language="r") + assert result.results[0].text.strip() == '[1] "/home/user"' + + +@pytest.mark.skip_debug() +async def test_cwd_java(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code( + 'System.getProperty("user.dir")', language="java" + ) + assert result.results[0].text.strip() == "/home/user" diff --git a/python/tests/sync/test_cwd.py b/python/tests/sync/test_cwd.py new file mode 100644 index 00000000..35f91a2b --- /dev/null +++ b/python/tests/sync/test_cwd.py @@ -0,0 +1,33 @@ +import pytest + +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +@pytest.mark.skip_debug() +def test_cwd_python(sandbox: Sandbox): + result = sandbox.run_code("from pathlib import Path; print(Path.cwd())") + assert "".join(result.logs.stdout).strip() == "/home/user" + + +@pytest.mark.skip_debug() +def test_cwd_javascript(sandbox: Sandbox): + result = sandbox.run_code("process.cwd()", language="js") + assert result.text == "/home/user" + + +@pytest.mark.skip_debug() +def test_cwd_typescript(sandbox: Sandbox): + result = sandbox.run_code("process.cwd()", language="ts") + assert result.text == "/home/user" + + +@pytest.mark.skip_debug() +def test_cwd_r(sandbox: Sandbox): + result = sandbox.run_code("getwd()", language="r") + assert result.results[0].text.strip() == '[1] "/home/user"' + + +@pytest.mark.skip_debug() +def test_cwd_java(sandbox: Sandbox): + result = sandbox.run_code('System.getProperty("user.dir")', language="java") + assert result.results[0].text.strip() == "/home/user" From 6158a8af7b93eb9eaec3e9eebbb929d0d61d52f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:34:01 +0200 Subject: [PATCH 685/722] Update dependency aiohttp to v3.13.4 [SECURITY] (#246) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 56f77bd8..39e863ff 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -12,7 +12,7 @@ pillow==12.1.1 e2b_charts # Other packages -aiohttp==3.13.3 +aiohttp==3.13.4 beautifulsoup4==4.14.3 bokeh==3.9.0 gensim==4.4.0 From 52b5767ff4dac6787abcf07d33c9447ec9e813f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:34:22 +0200 Subject: [PATCH 686/722] Bump aiohttp from 3.13.3 to 3.13.4 in /template in the pip group across 1 directory (#245) Bump aiohttp in /template in the pip group across 1 directory --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.13.4 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From f32624998888cdd309c6087a659d436ffc14bc1d Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:20:33 +0200 Subject: [PATCH 687/722] Release lock for interruptable client requests (#237) * release lock on client disconnect * move back * fmt * move clean up back to original place * added changeset * format * delete ineffective timeout tests * added server tests * undo server tests * interrupt * format * bugbot * addressed comments --- .changeset/clever-bears-accept.md | 5 ++ js/tests/interrupt.test.ts | 25 +++++++++ python/tests/async/test_async_interrupt.py | 25 +++++++++ python/tests/sync/test_interrupt.py | 23 ++++++++ template/server/messaging.py | 63 +++++++++++++++++++--- 5 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 .changeset/clever-bears-accept.md create mode 100644 js/tests/interrupt.test.ts create mode 100644 python/tests/async/test_async_interrupt.py create mode 100644 python/tests/sync/test_interrupt.py diff --git a/.changeset/clever-bears-accept.md b/.changeset/clever-bears-accept.md new file mode 100644 index 00000000..80474ba7 --- /dev/null +++ b/.changeset/clever-bears-accept.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +interrupt kernel execution on client disconnect diff --git a/js/tests/interrupt.test.ts b/js/tests/interrupt.test.ts new file mode 100644 index 00000000..be4084b0 --- /dev/null +++ b/js/tests/interrupt.test.ts @@ -0,0 +1,25 @@ +import { expect } from 'vitest' + +import { sandboxTest, wait } from './setup' + +sandboxTest( + 'subsequent execution works after client timeout', + async ({ sandbox }) => { + // Start a long-running execution with a short timeout. + // This simulates a client disconnect: the SDK aborts the connection, + // which should trigger the server to interrupt the kernel (#213). + await expect( + sandbox.runCode('import time; time.sleep(300)', { timeoutMs: 3_000 }) + ).rejects.toThrow() + + // Wait for the server to detect the disconnect (via keepalive write + // failure) and interrupt the kernel. + await wait(5_000) + + // Run a simple execution. Without the kernel interrupt fix, this would + // block behind the still-running sleep(30) and time out. + const result = await sandbox.runCode('1 + 1', { timeoutMs: 10_000 }) + expect(result.text).toEqual('2') + }, + 60_000 +) diff --git a/python/tests/async/test_async_interrupt.py b/python/tests/async/test_async_interrupt.py new file mode 100644 index 00000000..ad8a9a0e --- /dev/null +++ b/python/tests/async/test_async_interrupt.py @@ -0,0 +1,25 @@ +import asyncio + +import pytest + +from e2b import TimeoutException +from e2b_code_interpreter.code_interpreter_async import AsyncSandbox + + +async def test_subsequent_execution_works_after_client_timeout( + async_sandbox: AsyncSandbox, +): + # Start a long-running execution with a short timeout. + # This simulates a client disconnect: the SDK closes the connection, + # which should trigger the server to interrupt the kernel (#213). + with pytest.raises(TimeoutException): + await async_sandbox.run_code("import time; time.sleep(300)", timeout=3) + + # Wait for the server to detect the disconnect (via keepalive write + # failure) and interrupt the kernel. + await asyncio.sleep(5) + + # Run a simple execution. Without the kernel interrupt fix, this would + # block behind the still-running sleep(30) and time out. + result = await async_sandbox.run_code("1 + 1", timeout=10) + assert result.text == "2" diff --git a/python/tests/sync/test_interrupt.py b/python/tests/sync/test_interrupt.py new file mode 100644 index 00000000..d4c5ff15 --- /dev/null +++ b/python/tests/sync/test_interrupt.py @@ -0,0 +1,23 @@ +import time + +import pytest + +from e2b import TimeoutException +from e2b_code_interpreter.code_interpreter_sync import Sandbox + + +def test_subsequent_execution_works_after_client_timeout(sandbox: Sandbox): + # Start a long-running execution with a short timeout. + # This simulates a client disconnect: the SDK closes the connection, + # which should trigger the server to interrupt the kernel (#213). + with pytest.raises(TimeoutException): + sandbox.run_code("import time; time.sleep(300)", timeout=3) + + # Wait for the server to detect the disconnect (via keepalive write + # failure) and interrupt the kernel. + time.sleep(5) + + # Run a simple execution. Without the kernel interrupt fix, this would + # block behind the still-running sleep(30) and time out. + result = sandbox.run_code("1 + 1", timeout=10) + assert result.text == "2" diff --git a/template/server/messaging.py b/template/server/messaging.py index bbc19170..d5fdb270 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -4,6 +4,8 @@ import uuid import asyncio +import httpx + from asyncio import Queue from typing import ( Dict, @@ -26,6 +28,7 @@ OutputType, UnexpectedEndOfExecution, ) +from consts import JUPYTER_BASE_URL from errors import ExecutionError from envs import get_envs @@ -33,6 +36,7 @@ MAX_RECONNECT_RETRIES = 3 PING_TIMEOUT = 30 +KEEPALIVE_INTERVAL = 5 # seconds between keepalive pings during streaming class Execution: @@ -97,6 +101,22 @@ async def connect(self): name="receive_message", ) + async def interrupt(self): + """Interrupt the current kernel execution via the Jupyter REST API.""" + try: + async with httpx.AsyncClient() as client: + response = await client.post( + f"{JUPYTER_BASE_URL}/api/kernels/{self.context_id}/interrupt" + ) + if response.is_success: + logger.info(f"Kernel {self.context_id} interrupted successfully") + else: + logger.error( + f"Failed to interrupt kernel {self.context_id}: {response.status_code}" + ) + except Exception as e: + logger.error(f"Error interrupting kernel {self.context_id}: {e}") + def _get_execute_request( self, msg_id: str, code: Union[str, StrictStr], background: bool ) -> str: @@ -238,8 +258,24 @@ async def _cleanup_env_vars(self, env_vars: Dict[StrictStr, str]): async def _wait_for_result(self, message_id: str): queue = self._executions[message_id].queue + # Use a timeout on queue.get() to periodically send keepalives. + # Without keepalives, the generator blocks indefinitely waiting for + # kernel output. If the client silently disappears (e.g. network + # failure), uvicorn can only detect the broken connection when it + # tries to write — so we force a write every KEEPALIVE_INTERVAL + # seconds. This ensures timely disconnect detection and kernel + # interrupt for abandoned executions (see #213). while True: - output = await queue.get() + try: + output = await asyncio.wait_for(queue.get(), timeout=KEEPALIVE_INTERVAL) + except asyncio.TimeoutError: + # Yield a keepalive so Starlette writes to the socket. + # If the client has disconnected, the write fails and + # uvicorn delivers http.disconnect, which cancels this + # generator via CancelledError. + yield {"type": "keepalive"} + continue + if output.type == OutputType.END_OF_EXECUTION: break @@ -362,11 +398,26 @@ async def execute( ) await execution.queue.put(UnexpectedEndOfExecution()) - # Stream the results - async for item in self._wait_for_result(message_id): - yield item - - del self._executions[message_id] + # Stream the results. + # If the client disconnects (Starlette cancels the task), we + # interrupt the kernel so the next execution isn't blocked (#213). + try: + async for item in self._wait_for_result(message_id): + yield item + except (asyncio.CancelledError, GeneratorExit): + logger.warning( + f"Client disconnected during execution ({message_id}), interrupting kernel" + ) + # Shield the interrupt from the ongoing cancellation so + # the HTTP request to the kernel actually completes. + try: + await asyncio.shield(self.interrupt()) + except asyncio.CancelledError: + pass + raise + finally: + if message_id in self._executions: + del self._executions[message_id] # Clean up env vars in a separate request after the main code has run if env_vars: From a1b5f41b2a5c37939d07c4785ee3027cf1c5fcc4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 Apr 2026 13:07:20 +0200 Subject: [PATCH 688/722] Update dependency pillow to v12.2.0 [SECURITY] (#249) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 39e863ff..fca3979c 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -6,7 +6,7 @@ ipython==9.2.0 orjson==3.11.7 pandas==2.2.3 matplotlib==3.10.8 -pillow==12.1.1 +pillow==12.2.0 # Latest version for e2b_charts From 6d54054eb16539d5c5f22f9896e2cb2f9cd824d9 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:58:50 +0200 Subject: [PATCH 689/722] Add language autocomplete for supported languages (#247) * Add language autocomplete for js, ts, r, java, bash Co-Authored-By: Claude Opus 4.6 * Fix eslint ban-types error for string & {} Use NonNullable instead of {} to satisfy @typescript-eslint/ban-types. Co-Authored-By: Claude Opus 4.6 * Simplify language type to plain string union Co-Authored-By: Claude Opus 4.6 * Use string & {} with eslint-disable for language autocomplete Co-Authored-By: Claude Opus 4.6 * Format sandbox.ts with prettier Co-Authored-By: Claude Opus 4.6 * Use eslint-disable/enable block for ban-types on multiline type Co-Authored-By: Claude Opus 4.6 * Format Python language type annotations for ruff Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- .changeset/add-language-overloads.md | 6 +++ js/src/index.ts | 7 +++- js/src/sandbox.ts | 41 ++++++++----------- python/e2b_code_interpreter/__init__.py | 1 + .../code_interpreter_async.py | 41 ++----------------- .../code_interpreter_sync.py | 41 ++----------------- python/e2b_code_interpreter/models.py | 6 +++ 7 files changed, 43 insertions(+), 100 deletions(-) create mode 100644 .changeset/add-language-overloads.md diff --git a/.changeset/add-language-overloads.md b/.changeset/add-language-overloads.md new file mode 100644 index 00000000..0a1f00bd --- /dev/null +++ b/.changeset/add-language-overloads.md @@ -0,0 +1,6 @@ +--- +"@e2b/code-interpreter": patch +"e2b-code-interpreter": patch +--- + +Add autocomplete support for javascript, typescript, r, java, and bash languages in runCode/run_code and createCodeContext/create_code_context diff --git a/js/src/index.ts b/js/src/index.ts index 2ad762ba..d4598121 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,7 +1,12 @@ export * from 'e2b' export { Sandbox } from './sandbox' -export type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox' +export type { + Context, + RunCodeLanguage, + RunCodeOpts, + CreateCodeContextOpts, +} from './sandbox' export type { Logs, ExecutionError, diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index a02b9d9e..0b320cc6 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -33,6 +33,20 @@ export type Context = { cwd: string } +/* eslint-disable @typescript-eslint/ban-types */ +/** + * Supported language for code execution. + */ +export type RunCodeLanguage = + | 'python' + | 'javascript' + | 'typescript' + | 'r' + | 'java' + | 'bash' + | (string & {}) +/* eslint-enable @typescript-eslint/ban-types */ + /** * Options for running code. */ @@ -88,7 +102,7 @@ export interface CreateCodeContextOpts { * * @default python */ - language?: string + language?: RunCodeLanguage /** * Timeout for the request in **milliseconds**. * @@ -128,29 +142,6 @@ export class Sandbox extends BaseSandbox { )}` } - /** - * Run the code as Python. - * - * Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - * - * You can reference previously defined variables, imports, and functions in the code. - * - * @param code code to execute. - * @param opts options for executing the code. - * - * @returns `Execution` result object. - */ - async runCode( - code: string, - opts?: RunCodeOpts & { - /** - * Language to use for code execution. - * - * If not defined, the default Python context is used. - */ - language?: 'python' - } - ): Promise /** * Run the code for the specified language. * @@ -172,7 +163,7 @@ export class Sandbox extends BaseSandbox { * * If not defined, the default Python context is used. */ - language?: string + language?: RunCodeLanguage } ): Promise /** diff --git a/python/e2b_code_interpreter/__init__.py b/python/e2b_code_interpreter/__init__.py index 7562f51a..5202d5de 100644 --- a/python/e2b_code_interpreter/__init__.py +++ b/python/e2b_code_interpreter/__init__.py @@ -10,4 +10,5 @@ Logs, OutputHandler, OutputMessage, + RunCodeLanguage, ) diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index de938240..35684cd1 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload, Union, Literal, List +from typing import Optional, Dict, overload, Union, List from httpx import AsyncClient from e2b import ( @@ -18,6 +18,7 @@ Execution, ExecutionError, Context, + RunCodeLanguage, Result, aextract_exception, OutputHandlerWithAsync, @@ -68,41 +69,7 @@ def _client(self) -> AsyncClient: async def run_code( self, code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, - on_result: Optional[OutputHandlerWithAsync[Result]] = None, - on_error: Optional[OutputHandlerWithAsync[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None, - ) -> Execution: - """ - Runs the code as Python. - - Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - - You can reference previously defined variables, imports, and functions in the code. - - :param code: Code to execute - :param language: Language to use for code execution. If not defined, the default Python context is used. - :param on_stdout: Callback for stdout messages - :param on_stderr: Callback for stderr messages - :param on_result: Callback for the `Result` object - :param on_error: Callback for the `ExecutionError` object - :param envs: Custom environment variables - :param timeout: Timeout for the code execution in **seconds** - :param request_timeout: Timeout for the request in **seconds** - - :return: `Execution` result object - """ - ... - - @overload - async def run_code( - self, - code: str, - language: Optional[str] = None, + language: Optional[RunCodeLanguage] = None, on_stdout: Optional[OutputHandlerWithAsync[OutputMessage]] = None, on_stderr: Optional[OutputHandlerWithAsync[OutputMessage]] = None, on_result: Optional[OutputHandlerWithAsync[Result]] = None, @@ -236,7 +203,7 @@ async def run_code( async def create_code_context( self, cwd: Optional[str] = None, - language: Optional[str] = None, + language: Optional[RunCodeLanguage] = None, request_timeout: Optional[float] = None, ) -> Context: """ diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 3adb2804..6020cc89 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -1,7 +1,7 @@ import logging import httpx -from typing import Optional, Dict, overload, Literal, Union, List +from typing import Optional, Dict, overload, Union, List from httpx import Client from e2b import Sandbox as BaseSandbox, InvalidArgumentException @@ -13,6 +13,7 @@ from e2b_code_interpreter.models import ( ExecutionError, Execution, + RunCodeLanguage, Context, Result, extract_exception, @@ -65,41 +66,7 @@ def _client(self) -> Client: def run_code( self, code: str, - language: Union[Literal["python"], None] = None, - on_stdout: Optional[OutputHandler[OutputMessage]] = None, - on_stderr: Optional[OutputHandler[OutputMessage]] = None, - on_result: Optional[OutputHandler[Result]] = None, - on_error: Optional[OutputHandler[ExecutionError]] = None, - envs: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - request_timeout: Optional[float] = None, - ) -> Execution: - """ - Runs the code as Python. - - Specify the `language` or `context` option to run the code as a different language or in a different `Context`. - - You can reference previously defined variables, imports, and functions in the code. - - :param code: Code to execute - :param language: Language to use for code execution. If not defined, the default Python context is used. - :param on_stdout: Callback for stdout messages - :param on_stderr: Callback for stderr messages - :param on_result: Callback for the `Result` object - :param on_error: Callback for the `ExecutionError` object - :param envs: Custom environment variables - :param timeout: Timeout for the code execution in **seconds** - :param request_timeout: Timeout for the request in **seconds** - - :return: `Execution` result object - """ - ... - - @overload - def run_code( - self, - code: str, - language: Optional[str] = None, + language: Optional[RunCodeLanguage] = None, on_stdout: Optional[OutputHandler[OutputMessage]] = None, on_stderr: Optional[OutputHandler[OutputMessage]] = None, on_result: Optional[OutputHandler[Result]] = None, @@ -232,7 +199,7 @@ def run_code( def create_code_context( self, cwd: Optional[str] = None, - language: Optional[str] = None, + language: Optional[RunCodeLanguage] = None, request_timeout: Optional[float] = None, ) -> Context: """ diff --git a/python/e2b_code_interpreter/models.py b/python/e2b_code_interpreter/models.py index ef280e18..ff691b54 100644 --- a/python/e2b_code_interpreter/models.py +++ b/python/e2b_code_interpreter/models.py @@ -6,6 +6,7 @@ from dataclasses import dataclass, field from typing import ( List, + Literal, Optional, Iterable, Dict, @@ -20,6 +21,11 @@ from .charts import Chart, _deserialize_chart +RunCodeLanguage = Union[ + Literal["python", "javascript", "typescript", "r", "java", "bash"], + str, +] + T = TypeVar("T") OutputHandler = Union[Callable[[T], Any],] From 1c917b80a814e1f0a90dec455df3c7300c085387 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:28:15 +0200 Subject: [PATCH 690/722] Force npm self-install in release workflow (#258) Works around npm's "Cannot find module 'promise-retry'" error when upgrading to npm 11.6 over the npm 10.x bundled with Node 22. Co-authored-by: Claude Opus 4.7 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4991041f..e2c89e29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -345,7 +345,7 @@ jobs: - name: Update npm run: | - npm install -g npm@^11.6 + npm install -g --force npm@^11.6 npm --version - name: Install dependencies From 7115ef8f4ce08e20105710874253b234a9a94945 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 24 Apr 2026 15:45:43 +0200 Subject: [PATCH 691/722] Use Node 24 for release job to get npm 11 (#259) * Force npm self-install in release workflow Works around npm's "Cannot find module 'promise-retry'" error when upgrading to npm 11.6 over the npm 10.x bundled with Node 22. Co-Authored-By: Claude Opus 4.7 * Use Node 24 for release job instead of upgrading npm Node 24.15 ships with npm 11.12, which already satisfies the OIDC publish requirement. Avoids the broken npm self-install in Node 22's tool cache (npm/cli#8859, "Cannot find module 'promise-retry'") by skipping the upgrade step entirely. Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- .github/workflows/release.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2c89e29..84b5d3a6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -331,10 +331,10 @@ jobs: with: version: 9.5 - - name: Setup Node.js 22 + - name: Setup Node.js 24 uses: actions/setup-node@v6 with: - node-version: "22.x" + node-version: "24.x" registry-url: 'https://registry.npmjs.org' cache: pnpm @@ -343,11 +343,6 @@ jobs: pnpm config set auto-install-peers true pnpm config set exclude-links-from-lockfile true - - name: Update npm - run: | - npm install -g --force npm@^11.6 - npm --version - - name: Install dependencies run: pnpm install --frozen-lockfile From a16388c065a5d64e195dc34a09eabde1bfb8e0be Mon Sep 17 00:00:00 2001 From: Matt Brockman Date: Mon, 27 Apr 2026 15:04:45 -0700 Subject: [PATCH 692/722] Bump e2b vesions (#260) * bump e2b to newest --- .changeset/update-e2b-sdk-minimums.md | 6 ++++++ js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/update-e2b-sdk-minimums.md diff --git a/.changeset/update-e2b-sdk-minimums.md b/.changeset/update-e2b-sdk-minimums.md new file mode 100644 index 00000000..bd64e1de --- /dev/null +++ b/.changeset/update-e2b-sdk-minimums.md @@ -0,0 +1,6 @@ +--- +"@e2b/code-interpreter": patch +"e2b-code-interpreter": patch +--- + +Raise the minimum supported e2b SDK dependency versions. diff --git a/js/package.json b/js/package.json index 20eac2b7..aebb604f 100644 --- a/js/package.json +++ b/js/package.json @@ -71,6 +71,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.8.4" + "e2b": "^2.19.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26b279e0..09025639 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.8.4 - version: 2.15.0 + specifier: ^2.19.2 + version: 2.19.2 devDependencies: '@types/node': specifier: ^20.19.19 @@ -987,8 +987,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.15.0: - resolution: {integrity: sha512-wjdrWBB/H9Lmo1vpJaCKlpcNjHKzztAL+/0q4gv8mpD96rrE4eh45kIxOMbGwb0vFXaDjjL2d93CYGAZDfKlPg==} + e2b@2.19.2: + resolution: {integrity: sha512-AJtaQ72XIjdOBGnsvzVuYveYmy4ZDALLzZddN7sFIgd49eCY7u7Nwx7TXp97vZLPTEgfCwEqn1U9mehDrQMp3g==} engines: {node: '>=20'} easy-table@1.2.0: @@ -2660,7 +2660,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.15.0: + e2b@2.19.2: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) diff --git a/python/poetry.lock b/python/poetry.lock index acaad693..af0baa4c 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -186,13 +186,13 @@ files = [ [[package]] name = "e2b" -version = "2.16.0" +version = "2.20.2" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.16.0-py3-none-any.whl", hash = "sha256:e2bb38fce01e1fe076818aa731b45208f2eef4b843d90b61c48cb23985a7ef52"}, - {file = "e2b-2.16.0.tar.gz", hash = "sha256:e661fbd5524bf4435730eca081de7b74861f30366731a027c1c8503316e8890c"}, + {file = "e2b-2.20.2-py3-none-any.whl", hash = "sha256:8ef964a4d1204a9fd61f4499662175a7a98ad173a81e7e848961799f77750276"}, + {file = "e2b-2.20.2.tar.gz", hash = "sha256:ce69f65e0b07c1002ac4e386d109e4e658575efb2a774aefced92393f2cb2388"}, ] [package.dependencies] @@ -1060,4 +1060,4 @@ bracex = ">=2.1.1" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "ad2d93b63a361a6a6e9f2163c8035f516eb7f7714e459438bb2f3ddc1edfc129" +content-hash = "d6fbf63c1a861953087c36c747f986bda24374c8b74e4159c4e8653ee42c8cdb" diff --git a/python/pyproject.toml b/python/pyproject.toml index 27da009a..b099b2a8 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.10" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.7.0" +e2b = "^2.20.2" [tool.poetry.group.dev.dependencies] pytest = "^8.2.0" From 81a811cb7052f3f6d91705aa57f13b9190bafd39 Mon Sep 17 00:00:00 2001 From: Matt Brockman Date: Mon, 27 Apr 2026 19:04:58 -0700 Subject: [PATCH 693/722] Fix Python package name in changesets (#261) --- .changeset/add-language-overloads.md | 2 +- .changeset/update-e2b-sdk-minimums.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/add-language-overloads.md b/.changeset/add-language-overloads.md index 0a1f00bd..6888ca74 100644 --- a/.changeset/add-language-overloads.md +++ b/.changeset/add-language-overloads.md @@ -1,6 +1,6 @@ --- "@e2b/code-interpreter": patch -"e2b-code-interpreter": patch +"@e2b/code-interpreter-python": patch --- Add autocomplete support for javascript, typescript, r, java, and bash languages in runCode/run_code and createCodeContext/create_code_context diff --git a/.changeset/update-e2b-sdk-minimums.md b/.changeset/update-e2b-sdk-minimums.md index bd64e1de..ba1de8fa 100644 --- a/.changeset/update-e2b-sdk-minimums.md +++ b/.changeset/update-e2b-sdk-minimums.md @@ -1,6 +1,6 @@ --- "@e2b/code-interpreter": patch -"e2b-code-interpreter": patch +"@e2b/code-interpreter-python": patch --- Raise the minimum supported e2b SDK dependency versions. From e770c8589cb5298eb7eb0f76b587ae8c1acc7816 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 28 Apr 2026 02:13:20 +0000 Subject: [PATCH 694/722] [skip ci] Release new versions --- .changeset/add-language-overloads.md | 6 ------ .changeset/clever-bears-accept.md | 5 ----- .changeset/update-e2b-sdk-minimums.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- template/package.json | 2 +- 7 files changed, 4 insertions(+), 21 deletions(-) delete mode 100644 .changeset/add-language-overloads.md delete mode 100644 .changeset/clever-bears-accept.md delete mode 100644 .changeset/update-e2b-sdk-minimums.md diff --git a/.changeset/add-language-overloads.md b/.changeset/add-language-overloads.md deleted file mode 100644 index 6888ca74..00000000 --- a/.changeset/add-language-overloads.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@e2b/code-interpreter": patch -"@e2b/code-interpreter-python": patch ---- - -Add autocomplete support for javascript, typescript, r, java, and bash languages in runCode/run_code and createCodeContext/create_code_context diff --git a/.changeset/clever-bears-accept.md b/.changeset/clever-bears-accept.md deleted file mode 100644 index 80474ba7..00000000 --- a/.changeset/clever-bears-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -interrupt kernel execution on client disconnect diff --git a/.changeset/update-e2b-sdk-minimums.md b/.changeset/update-e2b-sdk-minimums.md deleted file mode 100644 index ba1de8fa..00000000 --- a/.changeset/update-e2b-sdk-minimums.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@e2b/code-interpreter": patch -"@e2b/code-interpreter-python": patch ---- - -Raise the minimum supported e2b SDK dependency versions. diff --git a/js/package.json b/js/package.json index aebb604f..90eaeaba 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.4.0", + "version": "2.4.1", "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 411295ab..9f7c7982 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.6.0", + "version": "2.6.1", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index b099b2a8..efdd237e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.6.0" +version = "2.6.1" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" diff --git a/template/package.json b/template/package.json index 3917346d..a59ad1f8 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.3.3", + "version": "0.3.4", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 4db7f15815637d97371dcc0696815af53b866fd9 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:26:37 +0200 Subject: [PATCH 695/722] Bump e2b SDK dependencies to latest (#263) * Bump e2b SDK dependencies to latest Co-Authored-By: Claude Opus 4.7 * Use workspace package name in changeset Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- .changeset/bump-e2b-deps.md | 6 ++++++ js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/bump-e2b-deps.md diff --git a/.changeset/bump-e2b-deps.md b/.changeset/bump-e2b-deps.md new file mode 100644 index 00000000..ba1de8fa --- /dev/null +++ b/.changeset/bump-e2b-deps.md @@ -0,0 +1,6 @@ +--- +"@e2b/code-interpreter": patch +"@e2b/code-interpreter-python": patch +--- + +Raise the minimum supported e2b SDK dependency versions. diff --git a/js/package.json b/js/package.json index 90eaeaba..f9e88b8e 100644 --- a/js/package.json +++ b/js/package.json @@ -71,6 +71,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.19.2" + "e2b": "^2.19.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09025639..e700fcab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.19.2 - version: 2.19.2 + specifier: ^2.19.4 + version: 2.19.4 devDependencies: '@types/node': specifier: ^20.19.19 @@ -987,8 +987,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.19.2: - resolution: {integrity: sha512-AJtaQ72XIjdOBGnsvzVuYveYmy4ZDALLzZddN7sFIgd49eCY7u7Nwx7TXp97vZLPTEgfCwEqn1U9mehDrQMp3g==} + e2b@2.19.4: + resolution: {integrity: sha512-9RefLykkjzVu+kUQfX5RxBonmZb08jcXIrRCRmZ8zutbG2bKV6PPyhV9O7mcyB1ZVHHO9UD2G8Z0VtY0lC+AAQ==} engines: {node: '>=20'} easy-table@1.2.0: @@ -2660,7 +2660,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.19.2: + e2b@2.19.4: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) diff --git a/python/poetry.lock b/python/poetry.lock index af0baa4c..768b74e4 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -186,13 +186,13 @@ files = [ [[package]] name = "e2b" -version = "2.20.2" +version = "2.20.3" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.20.2-py3-none-any.whl", hash = "sha256:8ef964a4d1204a9fd61f4499662175a7a98ad173a81e7e848961799f77750276"}, - {file = "e2b-2.20.2.tar.gz", hash = "sha256:ce69f65e0b07c1002ac4e386d109e4e658575efb2a774aefced92393f2cb2388"}, + {file = "e2b-2.20.3-py3-none-any.whl", hash = "sha256:46c6b5ffc45c9ca6dc270dd4d29427cef6a2600c55a895565657ff2bedc06303"}, + {file = "e2b-2.20.3.tar.gz", hash = "sha256:c6e91f71946755e1579b4ca1e175819d9f174b932b92e115cf36c2fd04674f3c"}, ] [package.dependencies] @@ -1060,4 +1060,4 @@ bracex = ">=2.1.1" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "d6fbf63c1a861953087c36c747f986bda24374c8b74e4159c4e8653ee42c8cdb" +content-hash = "85967515c3cebeb03c66f25c9dcd1efa143f086d5106dfbd0233d609745e0ada" diff --git a/python/pyproject.toml b/python/pyproject.toml index efdd237e..8c503af9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.10" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.20.2" +e2b = "^2.20.3" [tool.poetry.group.dev.dependencies] pytest = "^8.2.0" From fb68a5419f743338e2e70fe0e14716d0e2fca949 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Apr 2026 18:29:01 +0000 Subject: [PATCH 696/722] [skip ci] Release new versions --- .changeset/bump-e2b-deps.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/bump-e2b-deps.md diff --git a/.changeset/bump-e2b-deps.md b/.changeset/bump-e2b-deps.md deleted file mode 100644 index ba1de8fa..00000000 --- a/.changeset/bump-e2b-deps.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@e2b/code-interpreter": patch -"@e2b/code-interpreter-python": patch ---- - -Raise the minimum supported e2b SDK dependency versions. diff --git a/js/package.json b/js/package.json index f9e88b8e..4c410b6a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.4.1", + "version": "2.4.2", "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 9f7c7982..5f6b1265 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.6.1", + "version": "2.6.2", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index 8c503af9..4b46e803 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.6.1" +version = "2.6.2" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" From 4b5da3b94f592e12b0c461b7b1f763c4e0d4a6ac Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 30 Apr 2026 21:09:59 +0200 Subject: [PATCH 697/722] Fix Dependabot security alerts (12 vulnerabilities) (#264) * Fix Dependabot security alerts Bump vulnerable npm and Python dev/transitive dependencies: - npm: postcss, vite, brace-expansion, smol-toml - python/: pytest (^9.0.3), pytest-asyncio (^1.3.0), pillow, pygments, python-dotenv - chart_data_extractor/: pytest (^9.0.3), pillow, pygments - template/requirements.txt: pytest 9.0.3 Co-Authored-By: Claude Opus 4.7 * Migrate conftest.py to pytest-asyncio 1.x The session-scoped event_loop fixture override is no longer honored in pytest-asyncio 1.x. Replace it with `asyncio_default_fixture_loop_scope` and `asyncio_default_test_loop_scope` set to session in pytest.ini, and convert async_sandbox_factory to an async fixture that yields and awaits sandbox cleanup directly instead of calling run_until_complete from a sync finalizer. Co-Authored-By: Claude Opus 4.7 * Regenerate poetry locks with Poetry 1.8.5 CI installs Poetry from .tool-versions (currently 1.8.5). Regenerating the locks under Poetry 2.1.1 produced lock-version 2.1 with Poetry-2.x- only metadata, which makes Poetry 1.8.5 fall back to a re-resolve and defeats the deterministic install this PR depends on. Co-Authored-By: Claude Opus 4.7 * Make async_sandbox_factory teardown exception-safe Use asyncio.gather(..., return_exceptions=True) so a failure killing one sandbox doesn't skip cleanup of the others, matching the independence the previous per-finalizer approach provided. Co-Authored-By: Claude Opus 4.7 * Restrict poetry lock churn to security bumps Restore chart_data_extractor/poetry.lock to its Poetry 2.1.1 form (matches main; pydantic stays at 2.9.2). Rebuild python/poetry.lock from main with poetry lock --no-update + targeted poetry update for the vulnerable packages, so runtime deps (attrs, e2b, httpx) stay on their existing pins instead of pulling latest. Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- chart_data_extractor/poetry.lock | 206 ++++----- chart_data_extractor/pyproject.toml | 2 +- pnpm-lock.yaml | 637 +++++++++++++++++++--------- python/poetry.lock | 241 ++++++----- python/pyproject.toml | 4 +- python/pytest.ini | 4 +- python/tests/conftest.py | 32 +- template/requirements.txt | 2 +- 8 files changed, 690 insertions(+), 438 deletions(-) diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index 74c58811..41fadde6 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -596,103 +596,103 @@ files = [ [[package]] name = "pillow" -version = "12.1.1" +version = "12.2.0" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, - {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, - {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, - {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, - {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, - {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, - {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, - {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, - {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, - {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, - {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, - {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, - {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, - {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, - {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, - {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, - {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, - {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, - {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, - {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, - {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, - {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, - {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, - {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa"}, + {file = "pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032"}, + {file = "pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5"}, + {file = "pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909"}, + {file = "pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808"}, + {file = "pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60"}, + {file = "pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5"}, + {file = "pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940"}, + {file = "pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5"}, + {file = "pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795"}, + {file = "pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e"}, + {file = "pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b"}, + {file = "pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea"}, + {file = "pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24"}, + {file = "pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98"}, + {file = "pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104"}, + {file = "pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7"}, + {file = "pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150"}, + {file = "pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43"}, + {file = "pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354"}, + {file = "pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1"}, + {file = "pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e"}, + {file = "pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5"}, ] [package.extras] @@ -847,14 +847,14 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] [package.extras] @@ -877,21 +877,21 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.3" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, - {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, + {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, + {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, ] [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1" -packaging = ">=20" +iniconfig = ">=1.0.1" +packaging = ">=22" pluggy = ">=1.5,<2" pygments = ">=2.7.2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} @@ -1059,4 +1059,4 @@ markers = {dev = "python_version < \"3.11\""} [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "7c5ae094b100602377714f266326fd947b979c004c0bd1dcaf915f290f63069b" +content-hash = "3cc28939d00ff71865731a15db02967ee9edafb37daa70de9a9e1be1c397ac18" diff --git a/chart_data_extractor/pyproject.toml b/chart_data_extractor/pyproject.toml index 1604bbac..66cf7255 100644 --- a/chart_data_extractor/pyproject.toml +++ b/chart_data_extractor/pyproject.toml @@ -17,7 +17,7 @@ matplotlib = "^3.10.3" pydantic = "^2.9.1" [tool.poetry.group.dev.dependencies] -pytest = "^8.3.5" +pytest = "^9.0.3" python-dotenv = "^1.2.1" pytest-dotenv = "^0.5.2" ruff = "^0.11.12" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e700fcab..c92e4c61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,7 +65,7 @@ importers: version: 17.1.18 tsup: specifier: ^8.5.1 - version: 8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.5.1(jiti@2.4.2)(postcss@8.5.12)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.5.3 version: 5.7.3 @@ -118,23 +118,17 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.27.2': resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} @@ -142,10 +136,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [android] '@esbuild/android-arm@0.27.2': @@ -154,10 +148,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm] os: [android] '@esbuild/android-x64@0.27.2': @@ -166,11 +160,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.27.2': resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} @@ -178,10 +172,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.27.2': @@ -190,11 +184,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.27.2': resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} @@ -202,10 +196,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.27.2': @@ -214,11 +208,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.27.2': resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} @@ -226,10 +220,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.27.2': @@ -238,10 +232,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.27.2': @@ -250,10 +244,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} - cpu: [loong64] + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.27.2': @@ -262,10 +256,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} - cpu: [mips64el] + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.27.2': @@ -274,10 +268,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.27.2': @@ -286,10 +280,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.27.2': @@ -298,10 +292,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} - cpu: [s390x] + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.27.2': @@ -310,10 +304,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.27.2': @@ -322,11 +316,11 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + cpu: [x64] + os: [linux] '@esbuild/netbsd-arm64@0.27.2': resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} @@ -334,10 +328,10 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.27.2': @@ -346,11 +340,11 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + cpu: [x64] + os: [netbsd] '@esbuild/openbsd-arm64@0.27.2': resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} @@ -358,10 +352,10 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.27.2': @@ -370,17 +364,23 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.2': resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + cpu: [arm64] + os: [openharmony] '@esbuild/sunos-x64@0.27.2': resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} @@ -388,11 +388,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.27.2': resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} @@ -400,10 +400,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.27.2': @@ -412,10 +412,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.27.2': @@ -424,6 +424,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -516,51 +522,111 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.60.2': + resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.39.0': resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.60.2': + resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.39.0': resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.60.2': + resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.39.0': resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.60.2': + resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.39.0': resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.60.2': + resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.39.0': resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.60.2': + resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.39.0': resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.39.0': resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.60.2': + resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.39.0': resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.60.2': + resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.60.2': + resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.60.2': + resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} cpu: [loong64] @@ -571,46 +637,111 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.60.2': + resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.39.0': resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.39.0': resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.60.2': + resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.39.0': resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.60.2': + resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.39.0': resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.60.2': + resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.39.0': resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.60.2': + resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.60.2': + resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.2': + resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.39.0': resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.60.2': + resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.39.0': resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.60.2': + resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.2': + resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.39.0': resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.60.2': + resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + cpu: [x64] + os: [win32] + '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -640,6 +771,9 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -853,14 +987,14 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -1001,13 +1135,13 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -1367,8 +1501,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1514,8 +1648,8 @@ packages: yaml: optional: true - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1568,6 +1702,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.60.2: + resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1595,8 +1734,8 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.3.1: - resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -1763,19 +1902,19 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -1932,159 +2071,162 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.11.0 - '@esbuild/aix-ppc64@0.25.0': - optional: true - '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/android-arm64@0.25.0': + '@esbuild/aix-ppc64@0.27.7': optional: true '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm@0.25.0': + '@esbuild/android-arm64@0.27.7': optional: true '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-x64@0.25.0': + '@esbuild/android-arm@0.27.7': optional: true '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.25.0': + '@esbuild/android-x64@0.27.7': optional: true '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-x64@0.25.0': + '@esbuild/darwin-arm64@0.27.7': optional: true '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.25.0': + '@esbuild/darwin-x64@0.27.7': optional: true '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.25.0': + '@esbuild/freebsd-arm64@0.27.7': optional: true '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/linux-arm64@0.25.0': + '@esbuild/freebsd-x64@0.27.7': optional: true '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.25.0': + '@esbuild/linux-arm64@0.27.7': optional: true '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.0': + '@esbuild/linux-arm@0.27.7': optional: true '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-loong64@0.25.0': + '@esbuild/linux-ia32@0.27.7': optional: true '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.0': + '@esbuild/linux-loong64@0.27.7': optional: true '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-ppc64@0.25.0': + '@esbuild/linux-mips64el@0.27.7': optional: true '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.0': + '@esbuild/linux-ppc64@0.27.7': optional: true '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-s390x@0.25.0': + '@esbuild/linux-riscv64@0.27.7': optional: true '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-x64@0.25.0': + '@esbuild/linux-s390x@0.27.7': optional: true '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.0': + '@esbuild/linux-x64@0.27.7': optional: true '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.25.0': + '@esbuild/netbsd-arm64@0.27.7': optional: true '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.0': + '@esbuild/netbsd-x64@0.27.7': optional: true '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.25.0': + '@esbuild/openbsd-arm64@0.27.7': optional: true '@esbuild/openbsd-x64@0.27.2': optional: true + '@esbuild/openbsd-x64@0.27.7': + optional: true + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/sunos-x64@0.25.0': + '@esbuild/openharmony-arm64@0.27.7': optional: true '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.0': + '@esbuild/sunos-x64@0.27.7': optional: true '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-ia32@0.25.0': + '@esbuild/win32-arm64@0.27.7': optional: true '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-x64@0.25.0': + '@esbuild/win32-ia32@0.27.7': optional: true '@esbuild/win32-x64@0.27.2': optional: true + '@esbuild/win32-x64@0.27.7': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -2186,63 +2328,138 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.39.0': optional: true + '@rollup/rollup-android-arm-eabi@4.60.2': + optional: true + '@rollup/rollup-android-arm64@4.39.0': optional: true + '@rollup/rollup-android-arm64@4.60.2': + optional: true + '@rollup/rollup-darwin-arm64@4.39.0': optional: true + '@rollup/rollup-darwin-arm64@4.60.2': + optional: true + '@rollup/rollup-darwin-x64@4.39.0': optional: true + '@rollup/rollup-darwin-x64@4.60.2': + optional: true + '@rollup/rollup-freebsd-arm64@4.39.0': optional: true + '@rollup/rollup-freebsd-arm64@4.60.2': + optional: true + '@rollup/rollup-freebsd-x64@4.39.0': optional: true + '@rollup/rollup-freebsd-x64@4.60.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.39.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.60.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.39.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.60.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.2': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.39.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.60.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.39.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.60.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.39.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.60.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.39.0': optional: true + '@rollup/rollup-linux-x64-musl@4.60.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.39.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.60.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.39.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.60.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.39.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.60.2': + optional: true + '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 @@ -2282,6 +2499,8 @@ snapshots: '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} + '@types/json-schema@7.0.15': {} '@types/node@12.20.55': {} @@ -2469,13 +2688,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -2547,16 +2766,16 @@ snapshots: dependencies: is-windows: 1.0.2 - brace-expansion@1.1.12: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.1.0: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.4: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -2686,34 +2905,6 @@ snapshots: es-module-lexer@1.7.0: {} - esbuild@0.25.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 - esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -2743,6 +2934,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escape-string-regexp@4.0.0: {} eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): @@ -3036,7 +3256,7 @@ snapshots: picocolors: 1.1.1 picomatch: 4.0.2 pretty-ms: 9.0.0 - smol-toml: 1.3.1 + smol-toml: 1.6.1 strip-json-comments: 5.0.1 summary: 2.1.0 typescript: 5.7.3 @@ -3087,19 +3307,19 @@ snapshots: minimatch@10.2.4: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.14 minimatch@9.0.3: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.0 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.0 minimist@1.2.8: {} @@ -3124,7 +3344,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.8: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -3224,17 +3444,17 @@ snapshots: platform@1.3.6: {} - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.12)(yaml@2.7.0): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.3 + postcss: 8.5.12 yaml: 2.7.0 - postcss@8.5.3: + postcss@8.5.12: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3295,6 +3515,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.39.0 fsevents: 2.3.3 + rollup@4.60.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.2 + '@rollup/rollup-android-arm64': 4.60.2 + '@rollup/rollup-darwin-arm64': 4.60.2 + '@rollup/rollup-darwin-x64': 4.60.2 + '@rollup/rollup-freebsd-arm64': 4.60.2 + '@rollup/rollup-freebsd-x64': 4.60.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 + '@rollup/rollup-linux-arm-musleabihf': 4.60.2 + '@rollup/rollup-linux-arm64-gnu': 4.60.2 + '@rollup/rollup-linux-arm64-musl': 4.60.2 + '@rollup/rollup-linux-loong64-gnu': 4.60.2 + '@rollup/rollup-linux-loong64-musl': 4.60.2 + '@rollup/rollup-linux-ppc64-gnu': 4.60.2 + '@rollup/rollup-linux-ppc64-musl': 4.60.2 + '@rollup/rollup-linux-riscv64-gnu': 4.60.2 + '@rollup/rollup-linux-riscv64-musl': 4.60.2 + '@rollup/rollup-linux-s390x-gnu': 4.60.2 + '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@rollup/rollup-linux-x64-musl': 4.60.2 + '@rollup/rollup-openbsd-x64': 4.60.2 + '@rollup/rollup-openharmony-arm64': 4.60.2 + '@rollup/rollup-win32-arm64-msvc': 4.60.2 + '@rollup/rollup-win32-ia32-msvc': 4.60.2 + '@rollup/rollup-win32-x64-gnu': 4.60.2 + '@rollup/rollup-win32-x64-msvc': 4.60.2 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3315,7 +3566,7 @@ snapshots: slash@3.0.0: {} - smol-toml@1.3.1: {} + smol-toml@1.6.1: {} source-map-js@1.2.1: {} @@ -3409,7 +3660,7 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.5.1(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.5.1(jiti@2.4.2)(postcss@8.5.12)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -3420,7 +3671,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.12)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.39.0 source-map: 0.7.6 @@ -3429,7 +3680,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.12 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -3465,7 +3716,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3480,13 +3731,13 @@ snapshots: - tsx - yaml - vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): + vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: - esbuild: 0.25.0 + esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.3 - rollup: 4.39.0 + postcss: 8.5.12 + rollup: 4.60.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.37 @@ -3498,7 +3749,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3516,7 +3767,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) vite-node: 3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/python/poetry.lock b/python/poetry.lock index 768b74e4..12155fe6 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "anyio" @@ -41,6 +41,17 @@ tests = ["attrs[tests-no-zope]", "zope-interface"] tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +[[package]] +name = "backports-asyncio-runner" +version = "1.2.0" +description = "Backport of asyncio.Runner, a context manager that controls event loop life cycle." +optional = false +python-versions = "<3.11,>=3.8" +files = [ + {file = "backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5"}, + {file = "backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162"}, +] + [[package]] name = "bracex" version = "2.6" @@ -682,102 +693,102 @@ files = [ [[package]] name = "pillow" -version = "12.1.1" +version = "12.2.0" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" files = [ - {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, - {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, - {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, - {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, - {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, - {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, - {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, - {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, - {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, - {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, - {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, - {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, - {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, - {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, - {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, - {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, - {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, - {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, - {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, - {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, - {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, - {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, - {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, - {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa"}, + {file = "pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032"}, + {file = "pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5"}, + {file = "pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909"}, + {file = "pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808"}, + {file = "pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60"}, + {file = "pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5"}, + {file = "pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940"}, + {file = "pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5"}, + {file = "pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795"}, + {file = "pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e"}, + {file = "pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b"}, + {file = "pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea"}, + {file = "pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24"}, + {file = "pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98"}, + {file = "pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104"}, + {file = "pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7"}, + {file = "pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150"}, + {file = "pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43"}, + {file = "pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354"}, + {file = "pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1"}, + {file = "pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e"}, + {file = "pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5"}, ] [package.extras] @@ -824,13 +835,13 @@ files = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] [package.extras] @@ -852,20 +863,20 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.3" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, - {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, + {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, + {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, ] [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1" -packaging = ">=20" +iniconfig = ">=1.0.1" +packaging = ">=22" pluggy = ">=1.5,<2" pygments = ">=2.7.2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} @@ -875,20 +886,22 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests [[package]] name = "pytest-asyncio" -version = "0.24.0" +version = "1.3.0" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, - {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, + {file = "pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5"}, + {file = "pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5"}, ] [package.dependencies] -pytest = ">=8.2,<9" +backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""} +pytest = ">=8.2,<10" +typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""} [package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] @@ -942,13 +955,13 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, + {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, ] [package.extras] @@ -1060,4 +1073,4 @@ bracex = ">=2.1.1" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "85967515c3cebeb03c66f25c9dcd1efa143f086d5106dfbd0233d609745e0ada" +content-hash = "a721caa46b51d44bb130b27e81b7225970cc58fb0bd3936d9ea44bdc18f472fb" diff --git a/python/pyproject.toml b/python/pyproject.toml index 4b46e803..e17b0f9d 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -17,10 +17,10 @@ attrs = ">=21.3.0" e2b = "^2.20.3" [tool.poetry.group.dev.dependencies] -pytest = "^8.2.0" +pytest = "^9.0.3" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" -pytest-asyncio = "^0.24.0" +pytest-asyncio = "^1.3.0" pytest-xdist = "^3.6.1" matplotlib = "^3.8.0" ruff = "^0.11.12" diff --git a/python/pytest.ini b/python/pytest.ini index 7695413b..5d05c876 100644 --- a/python/pytest.ini +++ b/python/pytest.ini @@ -2,6 +2,8 @@ [pytest] markers = skip_debug: skip test if E2B_DEBUG is set. -asyncio_mode=auto +asyncio_mode = auto +asyncio_default_fixture_loop_scope = session +asyncio_default_test_loop_scope = session addopts = "--import-mode=importlib" "--numprocesses=2" diff --git a/python/tests/conftest.py b/python/tests/conftest.py index a571e00a..199b0a12 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -43,20 +43,10 @@ def sandbox(sandbox_factory): return sandbox_factory() -# override the event loop so it never closes -# this helps us with the global-scoped async http transport -@pytest.fixture(scope="session") -def event_loop(): - try: - loop = asyncio.get_running_loop() - except RuntimeError: - loop = asyncio.new_event_loop() - yield loop - loop.close() - - @pytest.fixture -def async_sandbox_factory(request, template, sandbox_test_id, event_loop): +async def async_sandbox_factory(template, sandbox_test_id): + sandboxes: list[AsyncSandbox] = [] + async def factory(*, template_name: str = template, **kwargs): kwargs.setdefault("timeout", 60) @@ -64,18 +54,14 @@ async def factory(*, template_name: str = template, **kwargs): metadata.setdefault("sandbox_test_id", sandbox_test_id) sandbox = await AsyncSandbox.create(template_name, **kwargs) - - def kill(): - async def _kill(): - await sandbox.kill() - - event_loop.run_until_complete(_kill()) - - request.addfinalizer(kill) - + sandboxes.append(sandbox) return sandbox - return factory + yield factory + + await asyncio.gather( + *(sandbox.kill() for sandbox in sandboxes), return_exceptions=True + ) @pytest.fixture diff --git a/template/requirements.txt b/template/requirements.txt index fca3979c..ebb9ce65 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -26,7 +26,7 @@ opencv-python==4.11.0.86 openpyxl==3.1.5 plotly==6.0.1 kaleido==1.0.0 -pytest==8.3.5 +pytest==9.0.3 python-docx==1.1.2 pytz==2025.2 requests==2.33.0 From 34be25bbccb3bd98c07a0a20e9116cc205ee8b22 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 14 May 2026 14:19:00 +0200 Subject: [PATCH 698/722] Remove Deno kernel (#268) * Remove Deno kernel Drops the Deno Jupyter kernel from the template along with its language tests, kernel spec, env vars, and language branches in the messaging server. Co-Authored-By: Claude Opus 4.7 * Add changeset for Deno kernel removal Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- .changeset/remove-deno-kernel.md | 5 ++ js/tests/languages/deno.test.ts | 99 ----------------------------- python/tests/languages/test_deno.py | 97 ---------------------------- template/deno.json | 14 ---- template/server/messaging.py | 8 --- template/template.py | 14 +--- 6 files changed, 6 insertions(+), 231 deletions(-) create mode 100644 .changeset/remove-deno-kernel.md delete mode 100644 js/tests/languages/deno.test.ts delete mode 100644 python/tests/languages/test_deno.py delete mode 100644 template/deno.json diff --git a/.changeset/remove-deno-kernel.md b/.changeset/remove-deno-kernel.md new file mode 100644 index 00000000..6de7819d --- /dev/null +++ b/.changeset/remove-deno-kernel.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': minor +--- + +remove Deno kernel diff --git a/js/tests/languages/deno.test.ts b/js/tests/languages/deno.test.ts deleted file mode 100644 index a595f7a9..00000000 --- a/js/tests/languages/deno.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { expect } from 'vitest' - -import { sandboxTest } from '../setup' - -sandboxTest.skip('js simple', async ({ sandbox }) => { - const result = await sandbox.runCode('console.log("Hello, World!")', { - language: 'deno', - }) - - expect(result.logs.stdout.join().trim()).toEqual('Hello, World!') -}) - -sandboxTest.skip('js import', async ({ sandbox }) => { - const result = await sandbox.runCode( - 'import isOdd from "npm:is-odd"\nisOdd(3)', - { language: 'deno' } - ) - - expect(result.results[0].text).toEqual('true') -}) - -sandboxTest.skip('js top level await', async ({ sandbox }) => { - const result = await sandbox.runCode( - ` - async function main() { - return 'Hello, World!' - } - - await main() - `, - { language: 'deno' } - ) - expect(result.results[0].text).toEqual('Hello, World!') -}) - -sandboxTest.skip('js es6', async ({ sandbox }) => { - const result = await sandbox.runCode( - ` - const add = (x, y) => x + y; - add(1, 2)`, - { language: 'deno' } - ) - expect(result.results[0].text).toEqual('3') -}) - -sandboxTest.skip('js context', async ({ sandbox }) => { - await sandbox.runCode('const z = 1', { language: 'deno' }) - const result = await sandbox.runCode('z', { language: 'deno' }) - expect(result.results[0].text).toEqual('1') -}) - -sandboxTest.skip('js cwd', async ({ sandbox }) => { - const result = await sandbox.runCode('process.cwd()', { language: 'deno' }) - expect(result.results[0].text).toEqual('/home/user') - - const ctx = await sandbox.createCodeContext({ - cwd: '/home', - language: 'deno', - }) - const result2 = await sandbox.runCode('process.cwd()', { context: ctx }) - expect(result2.results[0].text).toEqual('/home') -}) - -sandboxTest.skip('ts simple', async ({ sandbox }) => { - const result = await sandbox.runCode( - ` -function subtract(x: number, y: number): number { - return x - y; -} - -subtract(1, 2) -`, - { language: 'deno' } - ) - - expect(result.results[0].text).toEqual('-1') -}) - -sandboxTest.skip('test display', async ({ sandbox }) => { - const result = await sandbox.runCode( - ` - { - [Symbol.for("Jupyter.display")]() { - return { - // Plain text content - "text/plain": "Hello world!", - - // HTML output - "text/html": "

    Hello world!

    ", - } - } -} -`, - { language: 'deno' } - ) - - expect(result.results[0].html).toBe('

    Hello world!

    ') - expect(result.results[0].text).toBe('Hello world!') -}) diff --git a/python/tests/languages/test_deno.py b/python/tests/languages/test_deno.py deleted file mode 100644 index 74c3e57b..00000000 --- a/python/tests/languages/test_deno.py +++ /dev/null @@ -1,97 +0,0 @@ -import pytest - -from e2b_code_interpreter import AsyncSandbox - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_javascript(async_sandbox: AsyncSandbox): - code = """ - console.log('Hello, World!') - """ - execution = await async_sandbox.run_code(code, language="deno") - assert execution.logs.stdout == ["Hello, World!\n"] - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_import(async_sandbox: AsyncSandbox): - code = """ - import isOdd from 'npm:is-odd' - isOdd(3) - """ - execution = await async_sandbox.run_code(code, language="deno") - assert execution.results[0].text == "true" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_toplevel_await(async_sandbox: AsyncSandbox): - code = """ - async function main() { - return 'Hello, World!' - } - - await main() - """ - execution = await async_sandbox.run_code(code, language="deno") - assert execution.results[0].text == "Hello, World!" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_es6(async_sandbox: AsyncSandbox): - code = """ -const add = (x, y) => x + y; -add(1, 2); - """ - execution = await async_sandbox.run_code(code, language="deno") - assert execution.results[0].text == "3" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_context(async_sandbox: AsyncSandbox): - await async_sandbox.run_code("const x = 1", language="deno") - execution = await async_sandbox.run_code("x", language="deno") - assert execution.results[0].text == "1" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_cwd(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code("process.cwd()", language="deno") - assert execution.results[0].text == "/home/user" - - ctx = await async_sandbox.create_code_context("/home", language="deno") - execution = await async_sandbox.run_code("process.cwd()", context=ctx) - assert execution.results[0].text == "/home" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_typescript(async_sandbox: AsyncSandbox): - execution = await async_sandbox.run_code( - """ -function subtract(x: number, y: number): number { - return x - y; -} - -subtract(1, 2); -""", - language="deno", - ) - assert execution.results[0].text == "-1" - - -@pytest.mark.skip(reason="Deno is not supported yet") -async def test_display(async_sandbox: AsyncSandbox): - code = """ -{ - [Symbol.for("Jupyter.display")]() { - return { - // Plain text content - "text/plain": "Hello world!", - - // HTML output - "text/html": "

    Hello world!

    ", - } - } -} - """ - execution = await async_sandbox.run_code(code, language="deno") - assert execution.results[0].text == "Hello world!" - assert execution.results[0].html == "

    Hello world!

    " diff --git a/template/deno.json b/template/deno.json deleted file mode 100644 index 3c491e44..00000000 --- a/template/deno.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "argv": [ - "/usr/bin/deno", - "jupyter", - "--kernel", - "--conn", - "{connection_file}" - ], - "display_name": "Deno", - "env": { - "NO_COLOR": "1" - }, - "language": "typescript" -} diff --git a/template/server/messaging.py b/template/server/messaging.py index d5fdb270..0db59af0 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -154,8 +154,6 @@ def _set_env_var_snippet(self, key: str, value: str) -> str: return f"import os; os.environ['{key}'] = '{value}'" elif self.language in ["javascript", "typescript"]: return f"process.env['{key}'] = '{value}'" - elif self.language == "deno": - return f"Deno.env.set('{key}', '{value}')" elif self.language == "r": return f'Sys.setenv({key} = "{value}")' elif self.language == "java": @@ -170,8 +168,6 @@ def _delete_env_var_snippet(self, key: str) -> str: return f"import os; del os.environ['{key}']" elif self.language in ["javascript", "typescript"]: return f"delete process.env['{key}']" - elif self.language == "deno": - return f"Deno.env.delete('{key}')" elif self.language == "r": return f"Sys.unsetenv('{key}')" elif self.language == "java": @@ -297,10 +293,6 @@ async def change_current_directory( self._executions[message_id] = Execution(in_background=True) if language == "python": request = self._get_execute_request(message_id, f"%cd {path}", True) - elif language == "deno": - request = self._get_execute_request( - message_id, f"Deno.chdir('{path}')", True - ) elif language in ("javascript", "typescript"): request = self._get_execute_request( message_id, f"process.chdir('{path}')", True diff --git a/template/template.py b/template/template.py index 9101636a..62fec9e2 100644 --- a/template/template.py +++ b/template/template.py @@ -2,7 +2,7 @@ def make_template( - kernels: list[str] = ["python", "r", "javascript", "deno", "bash", "java"], + kernels: list[str] = ["python", "r", "javascript", "bash", "java"], is_docker: bool = False, ): enabled_kernels = set(["python", "javascript"] + kernels) @@ -20,8 +20,6 @@ def make_template( "JAVA_VERSION": "11", "JAVA_HOME": "/usr/lib/jvm/jdk-${JAVA_VERSION}", "IJAVA_VERSION": "1.3.0", - "DENO_INSTALL": "/opt/deno", - "DENO_VERSION": "v2.4.0", "R_VERSION": "4.5.*", } ) @@ -62,16 +60,6 @@ def make_template( g=True, ).run_cmd("ijsinstall --install=global") - # Install Deno Kernel if requested - if "deno" in enabled_kernels: - template = template.run_cmd( - [ - "curl -fsSL https://deno.land/install.sh | sh -s ${DENO_VERSION}", - "PATH=$DENO_INSTALL/bin:$PATH", - "deno jupyter --unstable --install", - ] - ).copy("deno.json", ".local/share/jupyter/kernels/deno/kernel.json") - # Install Bash Kernel if requested if "bash" in enabled_kernels: template = template.pip_install("bash_kernel").run_cmd( From b24e9797b2285a3664b0d18e81ab4c6360702636 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 14 May 2026 12:35:06 +0000 Subject: [PATCH 699/722] [skip ci] Release new versions --- .changeset/remove-deno-kernel.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/remove-deno-kernel.md diff --git a/.changeset/remove-deno-kernel.md b/.changeset/remove-deno-kernel.md deleted file mode 100644 index 6de7819d..00000000 --- a/.changeset/remove-deno-kernel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': minor ---- - -remove Deno kernel diff --git a/template/package.json b/template/package.json index a59ad1f8..a7081302 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.3.4", + "version": "0.4.0", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 5fedbeaa2f5e0515b6fd9dd5d8300b7e1d4570c7 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 14 May 2026 20:19:54 +0200 Subject: [PATCH 700/722] Apply cwd to bash kernel contexts (#269) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Apply cwd to bash kernel contexts The change_current_directory handler in the template server only had branches for python, javascript/typescript, r, and java — bash fell through to the no-op else, so a context created with a non-default cwd still returned `/` from `pwd`. Added a bash branch that sends `cd ` and added bash cwd tests across sync/async python and js suites. Co-Authored-By: Claude Opus 4.7 * Quote path in bash cd snippet Matches the quoting used in the js, r, and java branches so paths containing spaces or shell metacharacters cd to the intended directory. Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- .changeset/bash-cwd.md | 5 +++++ js/tests/cwd.test.ts | 7 +++++++ python/tests/async/test_async_cwd.py | 6 ++++++ python/tests/sync/test_cwd.py | 6 ++++++ template/server/messaging.py | 2 ++ 5 files changed, 26 insertions(+) create mode 100644 .changeset/bash-cwd.md diff --git a/.changeset/bash-cwd.md b/.changeset/bash-cwd.md new file mode 100644 index 00000000..99103155 --- /dev/null +++ b/.changeset/bash-cwd.md @@ -0,0 +1,5 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +Apply cwd to bash kernel contexts (previously ignored, so `pwd` returned `/` regardless of the requested working directory) diff --git a/js/tests/cwd.test.ts b/js/tests/cwd.test.ts index b9a35ca3..14b671d4 100644 --- a/js/tests/cwd.test.ts +++ b/js/tests/cwd.test.ts @@ -40,3 +40,10 @@ sandboxTest.skipIf(isDebug)('cwd java', async ({ sandbox }) => { }) expect(result.results[0]?.text.trim()).toEqual('/home/user') }) + +sandboxTest.skipIf(isDebug)('cwd bash', async ({ sandbox }) => { + const result = await sandbox.runCode('pwd', { + language: 'bash', + }) + expect(result.logs.stdout.join().trim()).toEqual('/home/user') +}) diff --git a/python/tests/async/test_async_cwd.py b/python/tests/async/test_async_cwd.py index e03b3e68..1896d767 100644 --- a/python/tests/async/test_async_cwd.py +++ b/python/tests/async/test_async_cwd.py @@ -33,3 +33,9 @@ async def test_cwd_java(async_sandbox: AsyncSandbox): 'System.getProperty("user.dir")', language="java" ) assert result.results[0].text.strip() == "/home/user" + + +@pytest.mark.skip_debug() +async def test_cwd_bash(async_sandbox: AsyncSandbox): + result = await async_sandbox.run_code("pwd", language="bash") + assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/python/tests/sync/test_cwd.py b/python/tests/sync/test_cwd.py index 35f91a2b..b238f7e9 100644 --- a/python/tests/sync/test_cwd.py +++ b/python/tests/sync/test_cwd.py @@ -31,3 +31,9 @@ def test_cwd_r(sandbox: Sandbox): def test_cwd_java(sandbox: Sandbox): result = sandbox.run_code('System.getProperty("user.dir")', language="java") assert result.results[0].text.strip() == "/home/user" + + +@pytest.mark.skip_debug() +def test_cwd_bash(sandbox: Sandbox): + result = sandbox.run_code("pwd", language="bash") + assert "".join(result.logs.stdout).strip() == "/home/user" diff --git a/template/server/messaging.py b/template/server/messaging.py index 0db59af0..c51f8b21 100644 --- a/template/server/messaging.py +++ b/template/server/messaging.py @@ -304,6 +304,8 @@ async def change_current_directory( request = self._get_execute_request( message_id, f'System.setProperty("user.dir", "{path}");', True ) + elif language == "bash": + request = self._get_execute_request(message_id, f"cd '{path}'", True) else: return From e257dcb409a1a9101d5ebd3caf3e6349b77df050 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 14 May 2026 18:39:50 +0000 Subject: [PATCH 701/722] [skip ci] Release new versions --- .changeset/bash-cwd.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/bash-cwd.md diff --git a/.changeset/bash-cwd.md b/.changeset/bash-cwd.md deleted file mode 100644 index 99103155..00000000 --- a/.changeset/bash-cwd.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -Apply cwd to bash kernel contexts (previously ignored, so `pwd` returned `/` regardless of the requested working directory) diff --git a/template/package.json b/template/package.json index a7081302..b72b91ec 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.4.0", + "version": "0.4.1", "scripts": { "lint": "ruff check .", "format": "ruff format ." From b355e7cd14696237210794927ab6ef208e9753b7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 04:54:43 -0700 Subject: [PATCH 702/722] Update dependency urllib3 to v2.7.0 [SECURITY] (#267) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index ebb9ce65..944167f4 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -38,7 +38,7 @@ soundfile==0.13.1 spacy==3.8.11 textblob==0.19.0 tornado==6.5.5 -urllib3==2.6.3 +urllib3==2.7.0 xarray==2025.4.0 xlrd==2.0.2 sympy==1.14.0 From 5740716ad5e5672bdd77d9678828a5a2532c9a5f Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 22 May 2026 17:17:33 +0100 Subject: [PATCH 703/722] perf(template): defer heavy imports (#272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit perf(startup): defer heavy imports in 0002_data.py The IPython startup script imports pandas, matplotlib.pyplot, e2b_charts, and orjson at module load time. Every Python kernel pays that cost in resident memory, regardless of whether the customer ever displays a DataFrame, Figure, or large JSON object — and that resident heap is captured in the snapshot at every pause. Move the heavy imports into the formatter __call__ bodies so they are only resolved when a matching object is actually rendered. Top-level imports are limited to IPython + traitlets, which is what the formatter class definitions actually need. IPython invokes every registered formatter for every displayed object, so a naive "import pandas" at the top of __call__ would shift the cost from kernel boot to the first cell with any output. Instead, gate on sys.modules.get("pandas"): a pandas.DataFrame cannot exist unless the user has already imported pandas. The same sentinel works for the matplotlib + e2b_charts dependency chain in E2BChartFormatter. Sessions that never touch pandas/matplotlib now never load them. E2BDataFormatter previously declared type_printers={pandas.DataFrame: …}, which forced pandas at class-definition time. The new version dispatches via isinstance() inside __call__ — slightly more work per formatted object, but the heavy dependencies stay unloaded until the user genuinely needs them. Signed-off-by: Nikita Kalyazin --- template/startup_scripts/0002_data.py | 67 ++++++++++++++------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/template/startup_scripts/0002_data.py b/template/startup_scripts/0002_data.py index 1f621904..3e994487 100644 --- a/template/startup_scripts/0002_data.py +++ b/template/startup_scripts/0002_data.py @@ -1,33 +1,9 @@ -import pandas -from matplotlib.pyplot import Figure +import sys + import IPython from IPython.core.formatters import BaseFormatter, JSONFormatter from traitlets.traitlets import Unicode, ObjectName -from e2b_charts import chart_figure_to_dict -import orjson - - -def _figure_repr_e2b_chart_(self: Figure): - """ - This method is used to extract data from the figure object to a dictionary - """ - # Get all Axes objects from the Figure - try: - return chart_figure_to_dict(self) - except: # noqa: E722 - return {} - - -def _dataframe_repr_e2b_data_(self: pandas.DataFrame): - result = self.to_dict(orient="list") - for key, value in result.items(): - # Check each column's values - result[key] = [ - v.isoformat() if isinstance(v, pandas.Timestamp) else v for v in value - ] - return result - class E2BDataFormatter(BaseFormatter): format_type = Unicode("e2b/data") @@ -35,7 +11,23 @@ class E2BDataFormatter(BaseFormatter): print_method = ObjectName("_repr_e2b_data_") _return_type = (dict, str) - type_printers = {pandas.DataFrame: _dataframe_repr_e2b_data_} + def __call__(self, obj): + # IPython invokes every registered formatter for every displayed + # object. Gate on sys.modules so a non-DataFrame output (e.g. an + # int from `1 + 1`) doesn't pay the pandas import cost — a + # pandas.DataFrame can only exist if the user already imported + # pandas. + pandas = sys.modules.get("pandas") + if pandas is None or not isinstance(obj, pandas.DataFrame): + return super().__call__(obj) + + result = obj.to_dict(orient="list") + for key, value in result.items(): + # Check each column's values + result[key] = [ + v.isoformat() if isinstance(v, pandas.Timestamp) else v for v in value + ] + return result class E2BChartFormatter(BaseFormatter): @@ -45,19 +37,30 @@ class E2BChartFormatter(BaseFormatter): _return_type = (dict, str) def __call__(self, obj): - # Figure object is for some reason removed on execution of the cell, - # so it can't be used in type_printers or with top-level import + # Same sys.modules gate as E2BDataFormatter: a matplotlib Figure + # can only exist if the user already imported matplotlib. + if sys.modules.get("matplotlib") is None: + return super().__call__(obj) + from matplotlib.pyplot import Figure - if isinstance(obj, Figure): - return _figure_repr_e2b_chart_(obj) - return super().__call__(obj) + if not isinstance(obj, Figure): + return super().__call__(obj) + + from e2b_charts import chart_figure_to_dict + + try: + return chart_figure_to_dict(obj) + except: # noqa: E722 + return {} class E2BJSONFormatter(JSONFormatter): def __call__(self, obj): if isinstance(obj, (list, dict)): try: + import orjson + return orjson.loads( orjson.dumps( obj, option=orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS From a214875acbdfcf163e2cdb91585612a6f2b88891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Fri, 22 May 2026 22:05:57 +0200 Subject: [PATCH 704/722] chore: update e2b js to 2.24 and python to 2.23 (#273) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Force HTTP/1.1 transport for Jupyter requests The base e2b SDK's shared transport now defaults to http2=True. On the streaming /execute endpoint HTTP/2 multiplexing means a cancelled request only resets the H2 stream — the underlying TCP connection stays open and the server can't detect the client disconnect, so long-running executions can't be cancelled reliably. Use e2b's get_transport with http2=False for the Jupyter client to keep a 1:1 mapping between TCP connection and request. * Apply suggestion from @jakubno --- .changeset/update-e2b-deps.md | 22 + js/package.json | 2 +- pnpm-lock.yaml | 19 +- .../code_interpreter_async.py | 20 +- .../code_interpreter_sync.py | 17 +- python/poetry.lock | 967 ++++++++++-------- python/pyproject.toml | 2 +- 7 files changed, 593 insertions(+), 456 deletions(-) create mode 100644 .changeset/update-e2b-deps.md diff --git a/.changeset/update-e2b-deps.md b/.changeset/update-e2b-deps.md new file mode 100644 index 00000000..56162e1b --- /dev/null +++ b/.changeset/update-e2b-deps.md @@ -0,0 +1,22 @@ +--- +'@e2b/code-interpreter': minor +'@e2b/code-interpreter-python': minor +--- + +Update e2b SDK versions + +Remove `Sandbox.betaCreate` (JS) and `Sandbox.beta_create` (Python). These methods were a beta of the `lifecycle` configuration that has since shipped on `Sandbox.create`. Migrate by calling `Sandbox.create` with the `lifecycle` option: + +```ts +// before +await Sandbox.betaCreate({ autoPause: true }) +// after +await Sandbox.create({ lifecycle: { onTimeout: 'pause' } }) +``` + +```python +# before +Sandbox.beta_create(auto_pause=True) +# after +Sandbox.create(lifecycle={"on_timeout": "pause"}) +``` diff --git a/js/package.json b/js/package.json index 4c410b6a..340e9816 100644 --- a/js/package.json +++ b/js/package.json @@ -71,6 +71,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.19.4" + "e2b": "^2.24.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c92e4c61..462277e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.19.4 - version: 2.19.4 + specifier: ^2.24.0 + version: 2.24.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -1121,9 +1121,9 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.19.4: - resolution: {integrity: sha512-9RefLykkjzVu+kUQfX5RxBonmZb08jcXIrRCRmZ8zutbG2bKV6PPyhV9O7mcyB1ZVHHO9UD2G8Z0VtY0lC+AAQ==} - engines: {node: '>=20'} + e2b@2.24.0: + resolution: {integrity: sha512-Vj9BvHRNXbXvlchz6N0Qf8oXBS6Nb3nkh8EvdYBky1f0FEs2+85hMtgJwgKxcbfJlVfzz3K1GaKb6HxcO4Xlug==} + engines: {node: '>=20.18.1'} easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} @@ -1890,6 +1890,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2879,7 +2883,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.19.4: + e2b@2.24.0: dependencies: '@bufbuild/protobuf': 2.11.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) @@ -2891,6 +2895,7 @@ snapshots: openapi-fetch: 0.14.1 platform: 1.3.6 tar: 7.5.12 + undici: 7.25.0 easy-table@1.2.0: dependencies: @@ -3704,6 +3709,8 @@ snapshots: undici-types@6.21.0: {} + undici@7.25.0: {} + universalify@0.1.2: {} uri-js@4.4.1: diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index 35684cd1..4f3696c4 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -8,6 +8,7 @@ AsyncSandbox as BaseAsyncSandbox, InvalidArgumentException, ) +from e2b.api.client_async import get_transport from e2b_code_interpreter.constants import ( DEFAULT_TEMPLATE, @@ -63,7 +64,24 @@ def _jupyter_url(self) -> str: @property def _client(self) -> AsyncClient: - return AsyncClient(transport=self._transport) + # TODO: Remove later + # Use a dedicated HTTP/1.1 transport for Jupyter requests. + # + # The base SDK's shared transport now defaults to http2=True. With + # HTTP/2, multiple requests are multiplexed over a single TCP + # connection, so when a client cancels a request (e.g. the caller + # disconnects from the streaming `/execute` endpoint) the server + # may not detect the disconnect: only the HTTP/2 stream is + # cancelled, the underlying TCP connection stays open. + # + # Forcing HTTP/1.1 here keeps the 1:1 mapping between TCP + # connection and request, so client disconnects propagate to the + # server as a TCP close and long-running executions can be + # cancelled reliably. The helper also caches the transport + # per-event-loop for async. + return AsyncClient( + transport=get_transport(self.connection_config, http2=False), + ) @overload async def run_code( diff --git a/python/e2b_code_interpreter/code_interpreter_sync.py b/python/e2b_code_interpreter/code_interpreter_sync.py index 6020cc89..bea57db4 100644 --- a/python/e2b_code_interpreter/code_interpreter_sync.py +++ b/python/e2b_code_interpreter/code_interpreter_sync.py @@ -4,6 +4,7 @@ from typing import Optional, Dict, overload, Union, List from httpx import Client from e2b import Sandbox as BaseSandbox, InvalidArgumentException +from e2b.api.client_sync import get_transport from e2b_code_interpreter.constants import ( DEFAULT_TEMPLATE, @@ -60,7 +61,21 @@ def _jupyter_url(self) -> str: @property def _client(self) -> Client: - return Client(transport=self._transport) + # TODO: Remove later + # Use a dedicated HTTP/1.1 transport for Jupyter requests. + # + # The base SDK's shared transport now defaults to http2=True. With + # HTTP/2, multiple requests are multiplexed over a single TCP + # connection, so when a client cancels a request (e.g. the caller + # disconnects from the streaming `/execute` endpoint) the server + # may not detect the disconnect: only the HTTP/2 stream is + # cancelled, the underlying TCP connection stays open. + # + # Forcing HTTP/1.1 here keeps the 1:1 mapping between TCP + # connection and request, so client disconnects propagate to the + # server as a TCP close and long-running executions can be + # cancelled reliably. + return Client(transport=get_transport(self.connection_config, http2=False)) @overload def run_code( diff --git a/python/poetry.lock b/python/poetry.lock index 12155fe6..52e9fbea 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,46 +1,35 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" +version = "4.13.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708"}, + {file = "anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +trio = ["trio (>=0.32.0)"] [[package]] name = "attrs" -version = "23.2.0" +version = "26.1.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309"}, + {file = "attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32"}, ] -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - [[package]] name = "backports-asyncio-runner" version = "1.2.0" @@ -65,13 +54,13 @@ files = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2026.5.20" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897"}, + {file = "certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d"}, ] [[package]] @@ -87,76 +76,68 @@ files = [ [[package]] name = "contourpy" -version = "1.3.0" +version = "1.3.2" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, - {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, - {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, - {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, - {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, - {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, - {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, - {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, - {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, - {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, - {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, - {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, - {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, + {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, + {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"}, + {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"}, + {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"}, + {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"}, + {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"}, + {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"}, + {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"}, + {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"}, + {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"}, + {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"}, + {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"}, + {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"}, ] [package.dependencies] @@ -165,7 +146,7 @@ numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] @@ -197,18 +178,19 @@ files = [ [[package]] name = "e2b" -version = "2.20.3" +version = "2.23.1" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.20.3-py3-none-any.whl", hash = "sha256:46c6b5ffc45c9ca6dc270dd4d29427cef6a2600c55a895565657ff2bedc06303"}, - {file = "e2b-2.20.3.tar.gz", hash = "sha256:c6e91f71946755e1579b4ca1e175819d9f174b932b92e115cf36c2fd04674f3c"}, + {file = "e2b-2.23.1-py3-none-any.whl", hash = "sha256:55a7d2d51b091a21a972eb4a284170bf8c0fd1a1564c44eaea8f2cd0b1195e9d"}, + {file = "e2b-2.23.1.tar.gz", hash = "sha256:ce8cfd388c2e4f8a9467cc363000746b68ecf7d48d9e6af5f81ad7e6d4756bce"}, ] [package.dependencies] attrs = ">=23.2.0" dockerfile-parse = ">=2.0.1,<3.0.0" +h2 = ">=4,<5" httpcore = ">=1.0.5,<2.0.0" httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" @@ -220,27 +202,30 @@ wcmatch = ">=10.1,<11.0" [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.1.1" +version = "2.1.2" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" files = [ - {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, - {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, + {file = "execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec"}, + {file = "execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd"}, ] [package.extras] @@ -248,69 +233,61 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.60.2" +version = "4.63.0" description = "Tools to manipulate font files" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e36fadcf7e8ca6e34d490eef86ed638d6fd9c55d2f514b05687622cfc4a7050"}, - {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e500fc9c04bee749ceabfc20cb4903f6981c2139050d85720ea7ada61b75d5c"}, - {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22efea5e784e1d1cd8d7b856c198e360a979383ebc6dea4604743b56da1cbc34"}, - {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:677aa92d84d335e4d301d8ba04afca6f575316bc647b6782cb0921943fcb6343"}, - {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:edd49d3defbf35476e78b61ff737ff5efea811acff68d44233a95a5a48252334"}, - {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:126839492b69cecc5baf2bddcde60caab2ffafd867bbae2a88463fce6078ca3a"}, - {file = "fonttools-4.60.2-cp310-cp310-win32.whl", hash = "sha256:ffcab6f5537136046ca902ed2491ab081ba271b07591b916289b7c27ff845f96"}, - {file = "fonttools-4.60.2-cp310-cp310-win_amd64.whl", hash = "sha256:9c68b287c7ffcd29dd83b5f961004b2a54a862a88825d52ea219c6220309ba45"}, - {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2aed0a7931401b3875265717a24c726f87ecfedbb7b3426c2ca4d2812e281ae"}, - {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea6868e9d2b816c9076cfea77754686f3c19149873bdbc5acde437631c15df1"}, - {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fa27f34950aa1fe0f0b1abe25eed04770a3b3b34ad94e5ace82cc341589678a"}, - {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13a53d479d187b09bfaa4a35ffcbc334fc494ff355f0a587386099cb66674f1e"}, - {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fac5e921d3bd0ca3bb8517dced2784f0742bc8ca28579a68b139f04ea323a779"}, - {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:648f4f9186fd7f1f3cd57dbf00d67a583720d5011feca67a5e88b3a491952cfb"}, - {file = "fonttools-4.60.2-cp311-cp311-win32.whl", hash = "sha256:3274e15fad871bead5453d5ce02658f6d0c7bc7e7021e2a5b8b04e2f9e40da1a"}, - {file = "fonttools-4.60.2-cp311-cp311-win_amd64.whl", hash = "sha256:91d058d5a483a1525b367803abb69de0923fbd45e1f82ebd000f5c8aa65bc78e"}, - {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e0164b7609d2b5c5dd4e044b8085b7bd7ca7363ef8c269a4ab5b5d4885a426b2"}, - {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1dd3d9574fc595c1e97faccae0f264dc88784ddf7fbf54c939528378bacc0033"}, - {file = "fonttools-4.60.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98d0719f1b11c2817307d2da2e94296a3b2a3503f8d6252a101dca3ee663b917"}, - {file = "fonttools-4.60.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d3ea26957dd07209f207b4fff64c702efe5496de153a54d3b91007ec28904dd"}, - {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ee301273b0850f3a515299f212898f37421f42ff9adfc341702582ca5073c13"}, - {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6eb4694cc3b9c03b7c01d65a9cf35b577f21aa6abdbeeb08d3114b842a58153"}, - {file = "fonttools-4.60.2-cp312-cp312-win32.whl", hash = "sha256:57f07b616c69c244cc1a5a51072eeef07dddda5ebef9ca5c6e9cf6d59ae65b70"}, - {file = "fonttools-4.60.2-cp312-cp312-win_amd64.whl", hash = "sha256:310035802392f1fe5a7cf43d76f6ff4a24c919e4c72c0352e7b8176e2584b8a0"}, - {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bb5fd231e56ccd7403212636dcccffc96c5ae0d6f9e4721fa0a32cb2e3ca432"}, - {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:536b5fab7b6fec78ccf59b5c59489189d9d0a8b0d3a77ed1858be59afb096696"}, - {file = "fonttools-4.60.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b9288fc38252ac86a9570f19313ecbc9ff678982e0f27c757a85f1f284d3400"}, - {file = "fonttools-4.60.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93fcb420791d839ef592eada2b69997c445d0ce9c969b5190f2e16828ec10607"}, - {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7916a381b094db4052ac284255186aebf74c5440248b78860cb41e300036f598"}, - {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58c8c393d5e16b15662cfc2d988491940458aa87894c662154f50c7b49440bef"}, - {file = "fonttools-4.60.2-cp313-cp313-win32.whl", hash = "sha256:19c6e0afd8b02008caa0aa08ab896dfce5d0bcb510c49b2c499541d5cb95a963"}, - {file = "fonttools-4.60.2-cp313-cp313-win_amd64.whl", hash = "sha256:6a500dc59e11b2338c2dba1f8cf11a4ae8be35ec24af8b2628b8759a61457b76"}, - {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9387c532acbe323bbf2a920f132bce3c408a609d5f9dcfc6532fbc7e37f8ccbb"}, - {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6f1c824185b5b8fb681297f315f26ae55abb0d560c2579242feea8236b1cfef"}, - {file = "fonttools-4.60.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:55a3129d1e4030b1a30260f1b32fe76781b585fb2111d04a988e141c09eb6403"}, - {file = "fonttools-4.60.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b196e63753abc33b3b97a6fd6de4b7c4fef5552c0a5ba5e562be214d1e9668e0"}, - {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de76c8d740fb55745f3b154f0470c56db92ae3be27af8ad6c2e88f1458260c9a"}, - {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ba6303225c95998c9fda2d410aa792c3d2c1390a09df58d194b03e17583fa25"}, - {file = "fonttools-4.60.2-cp314-cp314-win32.whl", hash = "sha256:0a89728ce10d7c816fedaa5380c06d2793e7a8a634d7ce16810e536c22047384"}, - {file = "fonttools-4.60.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa8446e6ab8bd778b82cb1077058a2addba86f30de27ab9cc18ed32b34bc8667"}, - {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4063bc81ac5a4137642865cb63dd270e37b3cd1f55a07c0d6e41d072699ccca2"}, - {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebfdb66fa69732ed604ab8e2a0431e6deff35e933a11d73418cbc7823d03b8e1"}, - {file = "fonttools-4.60.2-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50b10b3b1a72d1d54c61b0e59239e1a94c0958f4a06a1febf97ce75388dd91a4"}, - {file = "fonttools-4.60.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:beae16891a13b4a2ddec9b39b4de76092a3025e4d1c82362e3042b62295d5e4d"}, - {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:522f017fdb3766fd5d2d321774ef351cc6ce88ad4e6ac9efe643e4a2b9d528db"}, - {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82cceceaf9c09a965a75b84a4b240dd3768e596ffb65ef53852681606fe7c9ba"}, - {file = "fonttools-4.60.2-cp314-cp314t-win32.whl", hash = "sha256:bbfbc918a75437fe7e6d64d1b1e1f713237df1cf00f3a36dedae910b2ba01cee"}, - {file = "fonttools-4.60.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0e5cd9b0830f6550d58c84f3ab151a9892b50c4f9d538c5603c0ce6fff2eb3f1"}, - {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3c75b8b42f7f93906bdba9eb1197bb76aecbe9a0a7cf6feec75f7605b5e8008"}, - {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0f86c8c37bc0ec0b9c141d5e90c717ff614e93c187f06d80f18c7057097f71bc"}, - {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe905403fe59683b0e9a45f234af2866834376b8821f34633b1c76fb731b6311"}, - {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38ce703b60a906e421e12d9e3a7f064883f5e61bb23e8961f4be33cfe578500b"}, - {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9e810c06f3e79185cecf120e58b343ea5a89b54dd695fd644446bcf8c026da5e"}, - {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:38faec8cc1d12122599814d15a402183f5123fb7608dac956121e7c6742aebc5"}, - {file = "fonttools-4.60.2-cp39-cp39-win32.whl", hash = "sha256:80a45cf7bf659acb7b36578f300231873daba67bd3ca8cce181c73f861f14a37"}, - {file = "fonttools-4.60.2-cp39-cp39-win_amd64.whl", hash = "sha256:c355d5972071938e1b1e0f5a1df001f68ecf1a62f34a3407dc8e0beccf052501"}, - {file = "fonttools-4.60.2-py3-none-any.whl", hash = "sha256:73cf92eeda67cf6ff10c8af56fc8f4f07c1647d989a979be9e388a49be26552a"}, - {file = "fonttools-4.60.2.tar.gz", hash = "sha256:d29552e6b155ebfc685b0aecf8d429cb76c14ab734c22ef5d3dea6fdf800c92c"}, + {file = "fonttools-4.63.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e3297a6a4059b4acc3a1e9a8b04741f240a80044eef08ebd32e8b5bcdddce75b"}, + {file = "fonttools-4.63.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1cd75a03ad8cb5bc40c90bfde68c0c47de423aa19e5c0f362b43520645eea94"}, + {file = "fonttools-4.63.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0425b277a59cff3d80ca42162a8de360f318438a2ac83570842a678d826d579"}, + {file = "fonttools-4.63.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d7e5c9973aa04c95650c96e5f5ad865fbf42d62079163ecfab1e01cbc2504c22"}, + {file = "fonttools-4.63.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cb014d58140a38135f16064c74c652ed57aa0b75cbf8bb59cac821f7edb5334e"}, + {file = "fonttools-4.63.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:032038247a96c1690f9f31e377c389383c902531b085aa4e4dabd6f57f870e69"}, + {file = "fonttools-4.63.0-cp310-cp310-win32.whl", hash = "sha256:a8b33a82979e0a6a34ff435cc81317be1f95ec1ebb7a3a2d1c8a6a54f02ae44e"}, + {file = "fonttools-4.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c18358a155d75034911c5ee397a5b44cd19dd325dbb8b35fb60bf421d6a72ac"}, + {file = "fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f"}, + {file = "fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9"}, + {file = "fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b"}, + {file = "fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18"}, + {file = "fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0"}, + {file = "fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007"}, + {file = "fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb"}, + {file = "fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c"}, + {file = "fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02"}, + {file = "fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0"}, + {file = "fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af"}, + {file = "fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8"}, + {file = "fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b"}, + {file = "fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78"}, + {file = "fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263"}, + {file = "fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272"}, + {file = "fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd"}, + {file = "fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59"}, + {file = "fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d"}, + {file = "fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68"}, + {file = "fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be"}, + {file = "fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27"}, + {file = "fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380"}, + {file = "fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b"}, + {file = "fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745"}, + {file = "fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03"}, + {file = "fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49"}, + {file = "fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b"}, + {file = "fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6"}, + {file = "fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4"}, + {file = "fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616"}, + {file = "fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5"}, + {file = "fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001"}, + {file = "fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e"}, + {file = "fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096"}, + {file = "fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f"}, + {file = "fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40"}, + {file = "fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196"}, + {file = "fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8"}, + {file = "fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419"}, + {file = "fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d"}, + {file = "fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0"}, ] [package.extras] @@ -337,6 +314,32 @@ files = [ {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "h2" +version = "4.3.0" +description = "Pure-Python HTTP/2 protocol implementation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd"}, + {file = "h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1"}, +] + +[package.dependencies] +hpack = ">=4.1,<5" +hyperframe = ">=6.1,<7" + +[[package]] +name = "hpack" +version = "4.1.0" +description = "Pure-Python HPACK header encoding" +optional = false +python-versions = ">=3.9" +files = [ + {file = "hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496"}, + {file = "hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca"}, +] + [[package]] name = "httpcore" version = "1.0.9" @@ -382,160 +385,177 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "hyperframe" +version = "6.1.0" +description = "Pure-Python HTTP/2 framing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5"}, + {file = "hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08"}, +] + [[package]] name = "idna" -version = "3.7" +version = "3.16" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5"}, + {file = "idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d"}, ] +[package.extras] +all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] name = "kiwisolver" -version = "1.4.7" +version = "1.5.0" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, - {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, - {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, - {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1"}, + {file = "kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a"}, ] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a"}, + {file = "markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49"}, ] [package.dependencies] @@ -543,62 +563,75 @@ mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] +plugins = ["mdit-py-plugins (>=0.5.0)"] profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "pytest-timeout", "requests"] [[package]] name = "matplotlib" -version = "3.9.4" +version = "3.10.9" description = "Python plotting package" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, - {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, - {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26"}, - {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50"}, - {file = "matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5"}, - {file = "matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d"}, - {file = "matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c"}, - {file = "matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099"}, - {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249"}, - {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423"}, - {file = "matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e"}, - {file = "matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3"}, - {file = "matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70"}, - {file = "matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483"}, - {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f"}, - {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00"}, - {file = "matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0"}, - {file = "matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b"}, - {file = "matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6"}, - {file = "matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45"}, - {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858"}, - {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64"}, - {file = "matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df"}, - {file = "matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799"}, - {file = "matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb"}, - {file = "matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a"}, - {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c"}, - {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764"}, - {file = "matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041"}, - {file = "matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965"}, - {file = "matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c"}, - {file = "matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7"}, - {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e"}, - {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c"}, - {file = "matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb"}, - {file = "matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865"}, - {file = "matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294"}, + {file = "matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65"}, + {file = "matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9"}, + {file = "matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2"}, + {file = "matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838"}, + {file = "matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99"}, + {file = "matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2"}, + {file = "matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4"}, + {file = "matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4"}, + {file = "matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358"}, ] [package.dependencies] @@ -609,11 +642,11 @@ kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" -pyparsing = ">=2.3.1" +pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7,<10)"] [[package]] name = "mdurl" @@ -628,67 +661,77 @@ files = [ [[package]] name = "numpy" -version = "2.0.2" +version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, - {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, - {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, - {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, - {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, - {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, - {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, - {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, - {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, - {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, + {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, + {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, + {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, + {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, + {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, + {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, + {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, + {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, + {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, + {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, + {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, ] [[package]] name = "packaging" -version = "24.1" +version = "26.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, + {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, ] [[package]] @@ -801,36 +844,34 @@ xmp = ["defusedxml"] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "6.33.5" +version = "7.35.0" description = "" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, - {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, - {file = "protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5"}, - {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190"}, - {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd"}, - {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0"}, - {file = "protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c"}, - {file = "protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a"}, - {file = "protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02"}, - {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, + {file = "protobuf-7.35.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:66be6c513931c794fa92c080ffee41671390da3d79da219cf9c0c0907f035dda"}, + {file = "protobuf-7.35.0-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:fcbe42a4ac09d3ec9c987ddfcd956afd0b15f1ff613bd8371bde9405ffd5c8e5"}, + {file = "protobuf-7.35.0-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:4cbf5cc286130e06a6c9bbefac442431173906dfcc979712183d4adcc01b37ee"}, + {file = "protobuf-7.35.0-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:6c0f98f10c8a05ea30f8993dfef2de093d27b490fdae78bb60c8343795d55011"}, + {file = "protobuf-7.35.0-cp310-abi3-win32.whl", hash = "sha256:4c4617b83ade0e279d1d2bfe04025a1adb87f9ed657de038620dc0ff959357f6"}, + {file = "protobuf-7.35.0-cp310-abi3-win_amd64.whl", hash = "sha256:f05bcadf9a2a6b8dda047007075135fb7d08c73d9177aabc067e1be46881a201"}, + {file = "protobuf-7.35.0-py3-none-any.whl", hash = "sha256:c13f325cf242bad135c350629eeb5d54b24228eb472fb3e2e9ebbd4c5dc20ca0"}, + {file = "protobuf-7.35.0.tar.gz", hash = "sha256:a2efd84605f41e559f1881b0912b44099d0a2ac9bf46b3474823f10fb393b0e6"}, ] [[package]] @@ -849,13 +890,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.2.3" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +version = "3.3.2" +description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" files = [ - {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, - {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -921,13 +962,13 @@ python-dotenv = ">=0.9.1" [[package]] name = "pytest-xdist" -version = "3.6.1" +version = "3.8.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, - {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, + {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"}, + {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"}, ] [package.dependencies] @@ -969,13 +1010,13 @@ cli = ["click (>=5.0)"] [[package]] name = "rich" -version = "14.2.0" +version = "15.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, - {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, + {file = "rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb"}, + {file = "rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36"}, ] [package.dependencies] @@ -1014,46 +1055,80 @@ files = [ [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.4.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc"}, + {file = "tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"}, + {file = "tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e"}, + {file = "tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1"}, + {file = "tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917"}, + {file = "tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9"}, + {file = "tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5"}, + {file = "tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd"}, + {file = "tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36"}, + {file = "tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba"}, + {file = "tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6"}, + {file = "tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7"}, + {file = "tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f"}, + {file = "tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8"}, + {file = "tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26"}, + {file = "tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396"}, + {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, + {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] [[package]] name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] @@ -1073,4 +1148,4 @@ bracex = ">=2.1.1" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "a721caa46b51d44bb130b27e81b7225970cc58fb0bd3936d9ea44bdc18f472fb" +content-hash = "eaf5b7c74ed5b658d308d5ca93601080221ae823e6881c04b06b287b964f2d5f" diff --git a/python/pyproject.toml b/python/pyproject.toml index e17b0f9d..f6e355d1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.10" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.20.3" +e2b = "^2.23.1" [tool.poetry.group.dev.dependencies] pytest = "^9.0.3" From 0b3906db64e00f73fe7a961d302a945d9f54b4bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 22 May 2026 20:07:26 +0000 Subject: [PATCH 705/722] [skip ci] Release new versions --- .changeset/update-e2b-deps.md | 22 ---------------------- js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 25 deletions(-) delete mode 100644 .changeset/update-e2b-deps.md diff --git a/.changeset/update-e2b-deps.md b/.changeset/update-e2b-deps.md deleted file mode 100644 index 56162e1b..00000000 --- a/.changeset/update-e2b-deps.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -'@e2b/code-interpreter': minor -'@e2b/code-interpreter-python': minor ---- - -Update e2b SDK versions - -Remove `Sandbox.betaCreate` (JS) and `Sandbox.beta_create` (Python). These methods were a beta of the `lifecycle` configuration that has since shipped on `Sandbox.create`. Migrate by calling `Sandbox.create` with the `lifecycle` option: - -```ts -// before -await Sandbox.betaCreate({ autoPause: true }) -// after -await Sandbox.create({ lifecycle: { onTimeout: 'pause' } }) -``` - -```python -# before -Sandbox.beta_create(auto_pause=True) -# after -Sandbox.create(lifecycle={"on_timeout": "pause"}) -``` diff --git a/js/package.json b/js/package.json index 340e9816..4b659b1f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.4.2", + "version": "2.5.0", "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 5f6b1265..5530a546 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.6.2", + "version": "2.7.0", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index f6e355d1..46cdb32e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.6.2" +version = "2.7.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT" From 889859552977832595b6e996eecfb90b4de10af4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 May 2026 23:44:16 -0700 Subject: [PATCH 706/722] Bump the pip group across 3 directories with 1 update (#248) * Bump the pip group across 3 directories with 1 update Bumps the pip group with 1 update in the /chart_data_extractor directory: [pillow](https://github.com/python-pillow/Pillow). Bumps the pip group with 1 update in the /python directory: [pillow](https://github.com/python-pillow/Pillow). Bumps the pip group with 1 update in the /template directory: [pillow](https://github.com/python-pillow/Pillow). Updates `pillow` from 12.1.1 to 12.2.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.1.1...12.2.0) Updates `pillow` from 12.1.1 to 12.2.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.1.1...12.2.0) Updates `pillow` from 12.1.1 to 12.2.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.1.1...12.2.0) --- updated-dependencies: - dependency-name: pillow dependency-version: 12.2.0 dependency-type: indirect dependency-group: pip - dependency-name: pillow dependency-version: 12.2.0 dependency-type: indirect dependency-group: pip - dependency-name: pillow dependency-version: 12.2.0 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] * chore: add changeset --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jakub Novak --- .changeset/orange-ghosts-invent.md | 6 ++ chart_data_extractor/poetry.lock | 92 ++---------------------------- 2 files changed, 10 insertions(+), 88 deletions(-) create mode 100644 .changeset/orange-ghosts-invent.md diff --git a/.changeset/orange-ghosts-invent.md b/.changeset/orange-ghosts-invent.md new file mode 100644 index 00000000..9b041894 --- /dev/null +++ b/.changeset/orange-ghosts-invent.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter-template': patch +--- + +perf(template): defer heavy imports +chore: bump dependencies diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index 41fadde6..1ccee7bf 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -133,7 +133,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, @@ -440,7 +440,6 @@ description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" groups = ["main"] -markers = "python_version < \"3.13\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -499,89 +498,6 @@ files = [ {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, ] -[[package]] -name = "numpy" -version = "2.4.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.13\"" -files = [ - {file = "numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb"}, - {file = "numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147"}, - {file = "numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920"}, - {file = "numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9"}, - {file = "numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470"}, - {file = "numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71"}, - {file = "numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15"}, - {file = "numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52"}, - {file = "numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd"}, - {file = "numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec"}, - {file = "numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67"}, - {file = "numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef"}, - {file = "numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e"}, - {file = "numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4"}, - {file = "numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18"}, - {file = "numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5"}, - {file = "numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97"}, - {file = "numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c"}, - {file = "numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc"}, - {file = "numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9"}, - {file = "numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5"}, - {file = "numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e"}, - {file = "numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3"}, - {file = "numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9"}, - {file = "numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee"}, - {file = "numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f"}, - {file = "numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f"}, - {file = "numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc"}, - {file = "numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476"}, - {file = "numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92"}, - {file = "numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687"}, - {file = "numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd"}, - {file = "numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d"}, - {file = "numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875"}, - {file = "numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070"}, - {file = "numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73"}, - {file = "numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368"}, - {file = "numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22"}, - {file = "numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a"}, - {file = "numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349"}, - {file = "numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c"}, - {file = "numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26"}, - {file = "numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02"}, - {file = "numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4"}, - {file = "numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168"}, - {file = "numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b"}, - {file = "numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950"}, - {file = "numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd"}, - {file = "numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24"}, - {file = "numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0"}, - {file = "numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0"}, - {file = "numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a"}, - {file = "numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc"}, - {file = "numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7"}, - {file = "numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657"}, - {file = "numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7"}, - {file = "numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093"}, - {file = "numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a"}, - {file = "numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611"}, - {file = "numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720"}, - {file = "numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5"}, - {file = "numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0"}, - {file = "numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b"}, - {file = "numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857"}, - {file = "numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5"}, - {file = "numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd"}, -] - [[package]] name = "packaging" version = "24.1" @@ -992,7 +908,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, @@ -1054,7 +970,7 @@ files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -markers = {dev = "python_version < \"3.11\""} +markers = {dev = "python_version == \"3.10\""} [metadata] lock-version = "2.1" From 7259623dd5100b0f1f09c1066ce3a1c8b070d752 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 26 May 2026 06:58:16 +0000 Subject: [PATCH 707/722] [skip ci] Release new versions --- .changeset/orange-ghosts-invent.md | 6 ------ template/package.json | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 .changeset/orange-ghosts-invent.md diff --git a/.changeset/orange-ghosts-invent.md b/.changeset/orange-ghosts-invent.md deleted file mode 100644 index 9b041894..00000000 --- a/.changeset/orange-ghosts-invent.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter-template': patch ---- - -perf(template): defer heavy imports -chore: bump dependencies diff --git a/template/package.json b/template/package.json index b72b91ec..627797d6 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.4.1", + "version": "0.4.2", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 842dec49dbce56a849997ee28a1a27b99ece71d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:57:26 +0200 Subject: [PATCH 708/722] Update dependency ipython to v9.14.0 (#233) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 944167f4..4bc5e58f 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -1,7 +1,7 @@ # Jupyter server requirements jupyter-server==2.16.0 ipykernel==6.29.5 -ipython==9.2.0 +ipython==9.14.0 orjson==3.11.7 pandas==2.2.3 From 60c6c318569a3dfac0c297736cc439eb0d85ccef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 19:20:01 +0200 Subject: [PATCH 709/722] Update dependency ipykernel to v6.31.0 (#230) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 4bc5e58f..dfaeb75f 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -1,6 +1,6 @@ # Jupyter server requirements jupyter-server==2.16.0 -ipykernel==6.29.5 +ipykernel==6.31.0 ipython==9.14.0 orjson==3.11.7 From 8deea7556ca3a8b7745b2ec14384729bb1265764 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:07:59 +0200 Subject: [PATCH 710/722] Bump the npm_and_yarn group across 2 directories with 1 update (#275) Bumps the npm_and_yarn group with 1 update in the / directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /js directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Updates `vitest` from 3.2.4 to 4.1.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest) Updates `vitest` from 3.2.4 to 4.1.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-version: 4.1.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vitest dependency-version: 4.1.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- js/package.json | 2 +- pnpm-lock.yaml | 592 ++++++++++++++++++++++-------------------------- 2 files changed, 267 insertions(+), 327 deletions(-) diff --git a/js/package.json b/js/package.json index 4b659b1f..9421424a 100644 --- a/js/package.json +++ b/js/package.json @@ -44,7 +44,7 @@ "npm-check-updates": "^17.1.14", "tsup": "^8.5.1", "typescript": "^5.5.3", - "vitest": "^3.2.4" + "vitest": "^4.1.0" }, "files": [ "dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 462277e6..2d43c651 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,13 +65,13 @@ importers: version: 17.1.18 tsup: specifier: ^8.5.1 - version: 8.5.1(jiti@2.4.2)(postcss@8.5.12)(typescript@5.7.3)(yaml@2.7.0) + version: 8.5.1(jiti@2.4.2)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.5.3 version: 5.7.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + specifier: ^4.1.0 + version: 4.1.0(@types/node@20.19.37)(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) python: {} @@ -481,8 +481,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -522,8 +522,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.60.2': - resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} cpu: [arm] os: [android] @@ -532,8 +532,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.60.2': - resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} cpu: [arm64] os: [android] @@ -542,8 +542,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.60.2': - resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} cpu: [arm64] os: [darwin] @@ -552,8 +552,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.2': - resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} cpu: [x64] os: [darwin] @@ -562,8 +562,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.60.2': - resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} cpu: [arm64] os: [freebsd] @@ -572,8 +572,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.2': - resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} cpu: [x64] os: [freebsd] @@ -582,8 +582,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': - resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} cpu: [arm] os: [linux] @@ -592,8 +592,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.60.2': - resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} cpu: [arm] os: [linux] @@ -602,8 +602,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.60.2': - resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} cpu: [arm64] os: [linux] @@ -612,18 +612,18 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.60.2': - resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.60.2': - resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.60.2': - resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} cpu: [loong64] os: [linux] @@ -637,13 +637,13 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.60.2': - resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.60.2': - resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} cpu: [ppc64] os: [linux] @@ -652,8 +652,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.60.2': - resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} cpu: [riscv64] os: [linux] @@ -662,8 +662,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.60.2': - resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} cpu: [riscv64] os: [linux] @@ -672,8 +672,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.60.2': - resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} cpu: [s390x] os: [linux] @@ -682,8 +682,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.60.2': - resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} cpu: [x64] os: [linux] @@ -692,18 +692,18 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.60.2': - resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.60.2': - resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.2': - resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} cpu: [arm64] os: [openharmony] @@ -712,8 +712,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.60.2': - resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} cpu: [arm64] os: [win32] @@ -722,13 +722,13 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.2': - resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.2': - resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} cpu: [x64] os: [win32] @@ -737,16 +737,20 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.2': - resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} cpu: [x64] os: [win32] '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. hasBin: true + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stylistic/eslint-plugin-js@1.8.1': resolution: {integrity: sha512-c5c2C8Mos5tTQd+NWpqwEu7VT6SSRooAguFPMj1cp2RkTYl1ynKoXo8MWy3k4rkbzoeYHrqC2UlUzsroAN7wtQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -771,8 +775,8 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -904,35 +908,36 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.0': + resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.1.0': + resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.0': + resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.1.0': + resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.1.0': + resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.0': + resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.0': + resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1015,9 +1020,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1030,10 +1035,6 @@ packages: changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1074,6 +1075,9 @@ packages: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1096,10 +1100,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1132,8 +1132,8 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} @@ -1205,8 +1205,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} extendable-error@0.1.7: @@ -1381,9 +1381,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -1441,12 +1438,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} @@ -1455,8 +1446,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1501,8 +1492,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1518,6 +1509,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1597,23 +1591,19 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@4.0.1: @@ -1648,8 +1638,8 @@ packages: yaml: optional: true - postcss@8.5.12: - resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1702,8 +1692,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.60.2: - resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1755,8 +1745,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -1774,9 +1764,6 @@ packages: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1813,20 +1800,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -1901,11 +1888,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.3.2: resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1946,26 +1928,33 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.0: + resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.0 + '@vitest/browser-preview': 4.1.0 + '@vitest/browser-webdriverio': 4.1.0 + '@vitest/ui': 4.1.0 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -2275,19 +2264,19 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@manypkg/find-root@1.1.0': dependencies: @@ -2332,67 +2321,67 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.39.0': optional: true - '@rollup/rollup-android-arm-eabi@4.60.2': + '@rollup/rollup-android-arm-eabi@4.61.0': optional: true '@rollup/rollup-android-arm64@4.39.0': optional: true - '@rollup/rollup-android-arm64@4.60.2': + '@rollup/rollup-android-arm64@4.61.0': optional: true '@rollup/rollup-darwin-arm64@4.39.0': optional: true - '@rollup/rollup-darwin-arm64@4.60.2': + '@rollup/rollup-darwin-arm64@4.61.0': optional: true '@rollup/rollup-darwin-x64@4.39.0': optional: true - '@rollup/rollup-darwin-x64@4.60.2': + '@rollup/rollup-darwin-x64@4.61.0': optional: true '@rollup/rollup-freebsd-arm64@4.39.0': optional: true - '@rollup/rollup-freebsd-arm64@4.60.2': + '@rollup/rollup-freebsd-arm64@4.61.0': optional: true '@rollup/rollup-freebsd-x64@4.39.0': optional: true - '@rollup/rollup-freebsd-x64@4.60.2': + '@rollup/rollup-freebsd-x64@4.61.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.39.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.39.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.2': + '@rollup/rollup-linux-arm-musleabihf@4.61.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.2': + '@rollup/rollup-linux-arm64-gnu@4.61.0': optional: true '@rollup/rollup-linux-arm64-musl@4.39.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.2': + '@rollup/rollup-linux-arm64-musl@4.61.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.2': + '@rollup/rollup-linux-loong64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.2': + '@rollup/rollup-linux-loong64-musl@4.61.0': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.39.0': @@ -2401,67 +2390,67 @@ snapshots: '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.2': + '@rollup/rollup-linux-ppc64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.2': + '@rollup/rollup-linux-ppc64-musl@4.61.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.2': + '@rollup/rollup-linux-riscv64-gnu@4.61.0': optional: true '@rollup/rollup-linux-riscv64-musl@4.39.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.2': + '@rollup/rollup-linux-riscv64-musl@4.61.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.39.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.2': + '@rollup/rollup-linux-s390x-gnu@4.61.0': optional: true '@rollup/rollup-linux-x64-gnu@4.39.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.2': + '@rollup/rollup-linux-x64-gnu@4.61.0': optional: true '@rollup/rollup-linux-x64-musl@4.39.0': optional: true - '@rollup/rollup-linux-x64-musl@4.60.2': + '@rollup/rollup-linux-x64-musl@4.61.0': optional: true - '@rollup/rollup-openbsd-x64@4.60.2': + '@rollup/rollup-openbsd-x64@4.61.0': optional: true - '@rollup/rollup-openharmony-arm64@4.60.2': + '@rollup/rollup-openharmony-arm64@4.61.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.39.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.2': + '@rollup/rollup-win32-arm64-msvc@4.61.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.39.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.2': + '@rollup/rollup-win32-ia32-msvc@4.61.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.2': + '@rollup/rollup-win32-x64-gnu@4.61.0': optional: true '@rollup/rollup-win32-x64-msvc@4.39.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.2': + '@rollup/rollup-win32-x64-msvc@4.61.0': optional: true '@snyk/github-codeowners@1.1.0': @@ -2470,6 +2459,8 @@ snapshots: ignore: 5.3.1 p-map: 4.0.0 + '@standard-schema/spec@1.1.0': {} + '@stylistic/eslint-plugin-js@1.8.1(eslint@8.57.1)': dependencies: '@types/eslint': 8.56.12 @@ -2503,7 +2494,7 @@ snapshots: '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} @@ -2684,47 +2675,46 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.2.4': + '@vitest/expect@4.1.0': dependencies: + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@4.1.0(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.1.0 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.1.0': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.4': + '@vitest/runner@4.1.0': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.1.0 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.1.0': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + '@vitest/pretty-format': 4.1.0 + '@vitest/utils': 4.1.0 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.1.0': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.1.0': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.0 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -2796,13 +2786,7 @@ snapshots: callsites@3.1.0: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -2816,8 +2800,6 @@ snapshots: udc: 1.0.1 underscore: 1.13.6 - check-error@2.1.1: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.1 @@ -2845,6 +2827,8 @@ snapshots: consola@3.4.0: {} + convert-source-map@2.0.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2859,8 +2843,6 @@ snapshots: dependencies: ms: 2.1.3 - deep-eql@5.0.2: {} - deep-is@0.1.4: {} defaults@1.0.4: @@ -2908,7 +2890,7 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} esbuild@0.27.2: optionalDependencies: @@ -3049,11 +3031,11 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.9 esutils@2.0.3: {} - expect-type@1.2.1: {} + expect-type@1.3.0: {} extendable-error@0.1.7: {} @@ -3075,9 +3057,9 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 file-entry-cache@6.0.1: dependencies: @@ -3099,7 +3081,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.17 + magic-string: 0.30.21 mlly: 1.8.0 rollup: 4.39.0 @@ -3222,8 +3204,6 @@ snapshots: joycon@3.1.1: {} - js-tokens@9.0.1: {} - js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -3289,26 +3269,22 @@ snapshots: lodash.merge@4.6.2: {} - loupe@3.1.3: {} - - loupe@3.2.1: {} - lru-cache@11.2.7: {} lru-cache@6.0.0: dependencies: yallist: 4.0.0 - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 merge2@1.4.1: {} micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 minimatch@10.2.4: dependencies: @@ -3349,7 +3325,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -3357,6 +3333,8 @@ snapshots: object-assign@4.1.1: {} + obug@2.1.1: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -3427,15 +3405,13 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} picomatch@4.0.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pify@4.0.1: {} @@ -3449,17 +3425,17 @@ snapshots: platform@1.3.6: {} - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.12)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.15)(yaml@2.7.0): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.12 + postcss: 8.5.15 yaml: 2.7.0 - postcss@8.5.12: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3520,35 +3496,35 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.39.0 fsevents: 2.3.3 - rollup@4.60.2: + rollup@4.61.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.2 - '@rollup/rollup-android-arm64': 4.60.2 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-darwin-x64': 4.60.2 - '@rollup/rollup-freebsd-arm64': 4.60.2 - '@rollup/rollup-freebsd-x64': 4.60.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 - '@rollup/rollup-linux-arm-musleabihf': 4.60.2 - '@rollup/rollup-linux-arm64-gnu': 4.60.2 - '@rollup/rollup-linux-arm64-musl': 4.60.2 - '@rollup/rollup-linux-loong64-gnu': 4.60.2 - '@rollup/rollup-linux-loong64-musl': 4.60.2 - '@rollup/rollup-linux-ppc64-gnu': 4.60.2 - '@rollup/rollup-linux-ppc64-musl': 4.60.2 - '@rollup/rollup-linux-riscv64-gnu': 4.60.2 - '@rollup/rollup-linux-riscv64-musl': 4.60.2 - '@rollup/rollup-linux-s390x-gnu': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 - '@rollup/rollup-linux-x64-musl': 4.60.2 - '@rollup/rollup-openbsd-x64': 4.60.2 - '@rollup/rollup-openharmony-arm64': 4.60.2 - '@rollup/rollup-win32-arm64-msvc': 4.60.2 - '@rollup/rollup-win32-ia32-msvc': 4.60.2 - '@rollup/rollup-win32-x64-gnu': 4.60.2 - '@rollup/rollup-win32-x64-msvc': 4.60.2 + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -3586,7 +3562,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.9.0: {} + std-env@4.1.0: {} strip-ansi@6.0.1: dependencies: @@ -3598,10 +3574,6 @@ snapshots: strip-json-comments@5.0.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -3642,16 +3614,19 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.2.4: {} + tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - tinypool@1.1.1: {} + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinyrainbow@2.0.0: {} + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinyspy@4.0.4: {} + tinyrainbow@3.1.0: {} to-regex-range@5.0.1: dependencies: @@ -3665,7 +3640,7 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.5.1(jiti@2.4.2)(postcss@8.5.12)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.5.1(jiti@2.4.2)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -3676,7 +3651,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.12)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.15)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.39.0 source-map: 0.7.6 @@ -3685,7 +3660,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.12 + postcss: 8.5.15 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -3717,81 +3692,46 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.12 - rollup: 4.60.2 - tinyglobby: 0.2.15 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.0 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 20.19.37 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - debug: 4.4.3 - expect-type: 1.2.1 - magic-string: 0.30.17 + vitest@4.1.0(@types/node@20.19.37)(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)): + dependencies: + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.2.4(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.37 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml vscode-languageserver-textdocument@1.0.12: {} From e30e25a5c2e95ef5487be1c5bc8b214f78557153 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:58:43 +0200 Subject: [PATCH 711/722] Update patch-updates (#277) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/js_tests.yml | 2 +- chart_data_extractor/poetry.lock | 114 ++++++++++++++--------------- pnpm-lock.yaml | 120 ++++++++++++++++--------------- template/requirements.txt | 8 +-- 4 files changed, 125 insertions(+), 119 deletions(-) diff --git a/.github/workflows/js_tests.yml b/.github/workflows/js_tests.yml index a7a328fe..43eb551b 100644 --- a/.github/workflows/js_tests.yml +++ b/.github/workflows/js_tests.yml @@ -62,7 +62,7 @@ jobs: - name: Install Bun uses: oven-sh/setup-bun@v2 with: - bun-version: 1.3.11 + bun-version: 1.3.14 - name: Run Bun tests run: pnpm test:bun diff --git a/chart_data_extractor/poetry.lock b/chart_data_extractor/poetry.lock index 1ccee7bf..9ee99afb 100644 --- a/chart_data_extractor/poetry.lock +++ b/chart_data_extractor/poetry.lock @@ -356,67 +356,67 @@ files = [ [[package]] name = "matplotlib" -version = "3.10.8" +version = "3.10.9" description = "Python plotting package" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, - {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, - {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, - {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, - {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, - {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, - {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, - {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, - {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, - {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, - {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294"}, + {file = "matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65"}, + {file = "matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9"}, + {file = "matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2"}, + {file = "matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838"}, + {file = "matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99"}, + {file = "matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2"}, + {file = "matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4"}, + {file = "matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4"}, + {file = "matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358"}, ] [package.dependencies] @@ -431,7 +431,7 @@ pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7,<10)"] [[package]] name = "numpy" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d43c651..816ffcc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,13 +53,13 @@ importers: devDependencies: '@types/node': specifier: ^20.19.19 - version: 20.19.37 + version: 20.19.41 dotenv: specifier: ^16.4.5 version: 16.6.1 knip: specifier: ^5.25.1 - version: 5.43.6(@types/node@20.19.37)(typescript@5.7.3) + version: 5.43.6(@types/node@20.19.41)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 version: 17.1.18 @@ -71,7 +71,7 @@ importers: version: 5.7.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@20.19.37)(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) + version: 4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)) python: {} @@ -784,8 +784,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.37': - resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + '@types/node@20.19.41': + resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -910,34 +910,34 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@vitest/expect@4.1.0': - resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@4.1.0': - resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.0': - resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@4.1.0': - resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@4.1.0': - resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@4.1.0': - resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/utils@4.1.0': - resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1928,21 +1928,23 @@ packages: yaml: optional: true - vitest@4.1.0: - resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.0 - '@vitest/browser-preview': 4.1.0 - '@vitest/browser-webdriverio': 4.1.0 - '@vitest/ui': 4.1.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -1956,6 +1958,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -2500,7 +2506,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.37': + '@types/node@20.19.41': dependencies: undici-types: 6.21.0 @@ -2675,44 +2681,44 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@4.1.0': + '@vitest/expect@4.1.8': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 4.1.0 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0) - '@vitest/pretty-format@4.1.0': + '@vitest/pretty-format@4.1.8': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.0': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 4.1.0 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - '@vitest/snapshot@4.1.0': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.0': {} + '@vitest/spy@4.1.8': {} - '@vitest/utils@4.1.0': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.0 + '@vitest/pretty-format': 4.1.8 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -3227,11 +3233,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.43.6(@types/node@20.19.37)(typescript@5.7.3): + knip@5.43.6(@types/node@20.19.41)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.19.37 + '@types/node': 20.19.41 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -3692,7 +3698,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0): + vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -3701,20 +3707,20 @@ snapshots: rollup: 4.61.0 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.37 + '@types/node': 20.19.41 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@4.1.0(@types/node@20.19.37)(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)): + vitest@4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)): dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3726,10 +3732,10 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@20.19.37)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.37 + '@types/node': 20.19.41 transitivePeerDependencies: - msw diff --git a/template/requirements.txt b/template/requirements.txt index dfaeb75f..7e7e47ea 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -3,9 +3,9 @@ jupyter-server==2.16.0 ipykernel==6.31.0 ipython==9.14.0 -orjson==3.11.7 +orjson==3.11.9 pandas==2.2.3 -matplotlib==3.10.8 +matplotlib==3.10.9 pillow==12.2.0 # Latest version for @@ -35,9 +35,9 @@ scikit-learn==1.6.1 scipy==1.17.1 seaborn==0.13.2 soundfile==0.13.1 -spacy==3.8.11 +spacy==3.8.14 textblob==0.19.0 -tornado==6.5.5 +tornado==6.5.6 urllib3==2.7.0 xarray==2025.4.0 xlrd==2.0.2 From 4b278860a616a759542bae696cf6a056ee0018e3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:30:33 +0200 Subject: [PATCH 712/722] Update dependency e2b to v2.25.1 (#281) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements-dev.txt b/template/requirements-dev.txt index da8ae26f..c9bb5e36 100644 --- a/template/requirements-dev.txt +++ b/template/requirements-dev.txt @@ -1,2 +1,2 @@ -e2b==2.16.0 +e2b==2.25.1 python-dotenv==1.2.2 \ No newline at end of file From 4e8646494adb8103b7f3454ce1519aa0f0a47182 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 13:43:10 +0200 Subject: [PATCH 713/722] Update dependency kaleido to v1.3.0 (#282) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 7e7e47ea..4267f640 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -25,7 +25,7 @@ numba==0.63.1 opencv-python==4.11.0.86 openpyxl==3.1.5 plotly==6.0.1 -kaleido==1.0.0 +kaleido==1.3.0 pytest==9.0.3 python-docx==1.1.2 pytz==2025.2 From d7eb7a741119e028342fd9c6424c18a62902a037 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 13:59:36 +0200 Subject: [PATCH 714/722] Update dependency knip to v5.88.1 (#283) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 486 ++++++++++++++++++++++++++++++------------------- 1 file changed, 298 insertions(+), 188 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 816ffcc1..caf3cdff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,19 +59,19 @@ importers: version: 16.6.1 knip: specifier: ^5.25.1 - version: 5.43.6(@types/node@20.19.41)(typescript@5.7.3) + version: 5.88.1(@types/node@20.19.41)(typescript@5.7.3) npm-check-updates: specifier: ^17.1.14 version: 17.1.18 tsup: specifier: ^8.5.1 - version: 8.5.1(jiti@2.4.2)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.7.0) + version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.9.0) typescript: specifier: ^5.5.3 version: 5.7.3 vitest: specifier: ^4.1.0 - version: 4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)) + version: 4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0)) python: {} @@ -118,6 +118,15 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -493,29 +502,118 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - '@nodelib/fs.scandir@4.0.1': - resolution: {integrity: sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw==} - engines: {node: '>=18.18.0'} - '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - '@nodelib/fs.stat@4.0.0': - resolution: {integrity: sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg==} - engines: {node: '>=18.18.0'} - '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nodelib/fs.walk@3.0.1': - resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==} - engines: {node: '>=18.18.0'} + '@oxc-resolver/binding-android-arm-eabi@11.20.0': + resolution: {integrity: sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.20.0': + resolution: {integrity: sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.20.0': + resolution: {integrity: sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.20.0': + resolution: {integrity: sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.20.0': + resolution: {integrity: sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + resolution: {integrity: sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + resolution: {integrity: sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + resolution: {integrity: sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + resolution: {integrity: sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + resolution: {integrity: sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + resolution: {integrity: sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + resolution: {integrity: sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + resolution: {integrity: sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + resolution: {integrity: sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.20.0': + resolution: {integrity: sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-openharmony-arm64@11.20.0': + resolution: {integrity: sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.20.0': + resolution: {integrity: sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + resolution: {integrity: sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + resolution: {integrity: sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==} + cpu: [x64] + os: [win32] '@rollup/rollup-android-arm-eabi@4.39.0': resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} @@ -742,12 +840,6 @@ packages: cpu: [x64] os: [win32] - '@snyk/github-codeowners@1.1.0': - resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} - engines: {node: '>=8.10'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - hasBin: true - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -763,6 +855,9 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -949,10 +1044,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1043,14 +1134,6 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1103,9 +1186,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1125,13 +1205,6 @@ packages: resolution: {integrity: sha512-Vj9BvHRNXbXvlchz6N0Qf8oXBS6Nb3nkh8EvdYBky1f0FEs2+85hMtgJwgKxcbfJlVfzz3K1GaKb6HxcO4Xlug==} engines: {node: '>=20.18.1'} - easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} @@ -1228,6 +1301,9 @@ packages: fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1267,6 +1343,11 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1331,10 +1412,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1373,8 +1450,8 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true joycon@3.1.1: @@ -1404,13 +1481,13 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@5.43.6: - resolution: {integrity: sha512-bUCFlg44imdV5vayYxu0pIAB373S8Ufjda0qaI9oRZDH6ltJFwUoAO2j7nafxDmo5G0ZeP4IiLAHqlc3wYIONQ==} + knip@5.88.1: + resolution: {integrity: sha512-tpy5o7zu1MjawVkLPuahymVJekYY3kYjvzcoInhIchgePxTlo+api90tBv2KfhAIe5uXh+mez1tAfmbv8/TiZg==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: '@types/node': '>=18' - typescript: '>=5.0.4' + typescript: '>=5.0.4 <7' levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -1525,6 +1602,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + oxc-resolver@11.20.0: + resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -1549,10 +1629,6 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -1564,10 +1640,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1598,10 +1670,6 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -1651,10 +1719,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-ms@9.0.0: - resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} - engines: {node: '>=18'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1760,8 +1824,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-json-comments@5.0.1: - resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} sucrase@3.35.1: @@ -1769,17 +1833,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - summary@2.1.0: - resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - tar@7.5.12: resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} engines: {node: '>=18'} @@ -1833,6 +1890,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.1: resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} @@ -1871,6 +1931,10 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + unbash@2.2.0: + resolution: {integrity: sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==} + engines: {node: '>=14'} + underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -1975,8 +2039,9 @@ packages: vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -2002,23 +2067,17 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} hasBin: true yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-validation-error@3.3.0: - resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 - - zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: @@ -2070,6 +2129,22 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.11.0 + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.2': optional: true @@ -2300,29 +2375,85 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@nodelib/fs.scandir@2.1.5': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true - '@nodelib/fs.scandir@4.0.1': + '@nodelib/fs.scandir@2.1.5': dependencies: - '@nodelib/fs.stat': 4.0.0 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 '@nodelib/fs.stat@2.0.5': {} - '@nodelib/fs.stat@4.0.0': {} - '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 - '@nodelib/fs.walk@3.0.1': + '@oxc-resolver/binding-android-arm-eabi@11.20.0': + optional: true + + '@oxc-resolver/binding-android-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.20.0': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.20.0': dependencies: - '@nodelib/fs.scandir': 4.0.1 - fastq: 1.19.0 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + optional: true '@rollup/rollup-android-arm-eabi@4.39.0': optional: true @@ -2459,12 +2590,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.61.0': optional: true - '@snyk/github-codeowners@1.1.0': - dependencies: - commander: 4.1.1 - ignore: 5.3.1 - p-map: 4.0.0 - '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin-js@1.8.1(eslint@8.57.1)': @@ -2486,6 +2611,11 @@ snapshots: - supports-color - typescript + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -2690,13 +2820,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.8': dependencies: @@ -2728,11 +2858,6 @@ snapshots: acorn@8.15.0: {} - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -2812,11 +2937,6 @@ snapshots: chownr@3.0.0: {} - clean-stack@2.2.0: {} - - clone@1.0.4: - optional: true - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2851,11 +2971,6 @@ snapshots: deep-is@0.1.4: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - optional: true - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2885,17 +3000,6 @@ snapshots: tar: 7.5.12 undici: 7.25.0 - easy-table@1.2.0: - dependencies: - ansi-regex: 5.0.1 - optionalDependencies: - wcwidth: 1.0.1 - - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - es-module-lexer@2.1.0: {} esbuild@0.27.2: @@ -3063,6 +3167,10 @@ snapshots: dependencies: reusify: 1.0.4 + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -3104,6 +3212,10 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3175,8 +3287,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -3206,7 +3316,7 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 - jiti@2.4.2: {} + jiti@2.7.0: {} joycon@3.1.1: {} @@ -3233,26 +3343,23 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.43.6(@types/node@20.19.41)(typescript@5.7.3): + knip@5.88.1(@types/node@20.19.41)(typescript@5.7.3): dependencies: - '@nodelib/fs.walk': 3.0.1 - '@snyk/github-codeowners': 1.1.0 + '@nodelib/fs.walk': 1.2.8 '@types/node': 20.19.41 - easy-table: 1.2.0 - enhanced-resolve: 5.18.1 fast-glob: 3.3.3 - jiti: 2.4.2 - js-yaml: 4.1.1 + formatly: 0.3.0 + jiti: 2.7.0 minimist: 1.2.8 + oxc-resolver: 11.20.0 picocolors: 1.1.1 - picomatch: 4.0.2 - pretty-ms: 9.0.0 + picomatch: 4.0.4 smol-toml: 1.6.1 - strip-json-comments: 5.0.1 - summary: 2.1.0 + strip-json-comments: 5.0.3 typescript: 5.7.3 - zod: 3.22.4 - zod-validation-error: 3.3.0(zod@3.22.4) + unbash: 2.2.0 + yaml: 2.9.0 + zod: 4.4.3 levn@0.4.1: dependencies: @@ -3360,6 +3467,28 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + oxc-resolver@11.20.0: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.20.0 + '@oxc-resolver/binding-android-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-x64': 11.20.0 + '@oxc-resolver/binding-freebsd-x64': 11.20.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.20.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.20.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-musl': 11.20.0 + '@oxc-resolver/binding-openharmony-arm64': 11.20.0 + '@oxc-resolver/binding-wasm32-wasi': 11.20.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -3382,10 +3511,6 @@ snapshots: p-map@2.1.0: {} - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -3394,8 +3519,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-ms@4.0.0: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -3415,8 +3538,6 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.2: {} - picomatch@4.0.4: {} pify@4.0.1: {} @@ -3431,13 +3552,13 @@ snapshots: platform@1.3.6: {} - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.15)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.15)(yaml@2.9.0): dependencies: lilconfig: 3.1.2 optionalDependencies: - jiti: 2.4.2 + jiti: 2.7.0 postcss: 8.5.15 - yaml: 2.7.0 + yaml: 2.9.0 postcss@8.5.15: dependencies: @@ -3449,10 +3570,6 @@ snapshots: prettier@3.6.2: {} - pretty-ms@9.0.0: - dependencies: - parse-ms: 4.0.0 - punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -3578,7 +3695,7 @@ snapshots: strip-json-comments@3.1.1: {} - strip-json-comments@5.0.1: {} + strip-json-comments@5.0.3: {} sucrase@3.35.1: dependencies: @@ -3590,14 +3707,10 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 - summary@2.1.0: {} - supports-color@7.2.0: dependencies: has-flag: 4.0.0 - tapable@2.2.1: {} - tar@7.5.12: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -3646,7 +3759,10 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.5.1(jiti@2.4.2)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.7.0): + tslib@2.8.1: + optional: true + + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.15)(typescript@5.7.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -3657,7 +3773,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.15)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.15)(yaml@2.9.0) resolve-from: 5.0.0 rollup: 4.39.0 source-map: 0.7.6 @@ -3686,6 +3802,8 @@ snapshots: ufo@1.6.1: {} + unbash@2.2.0: {} + underscore@1.13.6: {} undici-types@6.21.0: {} @@ -3698,7 +3816,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0): + vite@7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -3709,13 +3827,13 @@ snapshots: optionalDependencies: '@types/node': 20.19.41 fsevents: 2.3.3 - jiti: 2.4.2 - yaml: 2.7.0 + jiti: 2.7.0 + yaml: 2.9.0 - vitest@4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)): + vitest@4.1.8(@types/node@20.19.41)(vite@7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/mocker': 4.1.8(vite@7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -3732,7 +3850,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@20.19.41)(jiti@2.4.2)(yaml@2.7.0) + vite: 7.3.2(@types/node@20.19.41)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.41 @@ -3743,10 +3861,7 @@ snapshots: vscode-languageserver-types@3.17.5: {} - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - optional: true + walk-up-path@4.0.0: {} which@2.0.2: dependencies: @@ -3765,13 +3880,8 @@ snapshots: yallist@5.0.0: {} - yaml@2.7.0: - optional: true + yaml@2.9.0: {} yocto-queue@0.1.0: {} - zod-validation-error@3.3.0(zod@3.22.4): - dependencies: - zod: 3.22.4 - - zod@3.22.4: {} + zod@4.4.3: {} From 95c4b8e009d92c78db075193a6d398f1fcb7c902 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 14:09:52 +0200 Subject: [PATCH 715/722] Update dependency aiohttp to v3.14.0 (#279) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- template/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/requirements.txt b/template/requirements.txt index 4267f640..6434f468 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -12,7 +12,7 @@ pillow==12.2.0 e2b_charts # Other packages -aiohttp==3.13.4 +aiohttp==3.14.0 beautifulsoup4==4.14.3 bokeh==3.9.0 gensim==4.4.0 From 3f67415acdf2f0529263a4ef29f5c24691e359d0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 14:31:42 +0200 Subject: [PATCH 716/722] Update dependency e2b (#280) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 88 +++++++++++++++++++++++----------------------- python/poetry.lock | 6 ++-- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index caf3cdff..acc389da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: dependencies: e2b: specifier: ^2.24.0 - version: 2.24.0 + version: 2.27.1 devDependencies: '@types/node': specifier: ^20.19.19 @@ -83,8 +83,8 @@ packages: resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.11.0': - resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + '@bufbuild/protobuf@2.12.0': + resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -1086,11 +1086,11 @@ packages: brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -1201,8 +1201,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.24.0: - resolution: {integrity: sha512-Vj9BvHRNXbXvlchz6N0Qf8oXBS6Nb3nkh8EvdYBky1f0FEs2+85hMtgJwgKxcbfJlVfzz3K1GaKb6HxcO4Xlug==} + e2b@2.27.1: + resolution: {integrity: sha512-xZ1vXSl4dpWxbvan5vihE2embXzHdlpK1N0CmFUIcj5kdGLpiQXGoQYsz1Dhy8wr9VO724DyRC7Y3iblMElLPQ==} engines: {node: '>=20.18.1'} es-module-lexer@2.1.0: @@ -1515,8 +1515,8 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -1534,8 +1534,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimatch@3.1.2: @@ -1837,8 +1837,8 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tar@7.5.12: - resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} + tar@7.5.16: + resolution: {integrity: sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==} engines: {node: '>=18'} text-table@0.2.0: @@ -1941,8 +1941,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.25.0: - resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + undici@7.27.0: + resolution: {integrity: sha512-+t2Z/GwkZQDtu00813aP66ygViGtPHKhhoFZpQKpKrE+9jIgES+Zw+mFNaDWOVRKiuJjuqKHzD3B1sfGg8+ZOQ==} engines: {node: '>=20.18.1'} universalify@0.1.2: @@ -2036,8 +2036,8 @@ packages: vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver-types@3.18.0: + resolution: {integrity: sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==} walk-up-path@4.0.0: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} @@ -2083,7 +2083,7 @@ snapshots: '@babel/runtime@7.28.6': {} - '@bufbuild/protobuf@2.11.0': {} + '@bufbuild/protobuf@2.12.0': {} '@changesets/errors@0.2.0': dependencies: @@ -2120,14 +2120,14 @@ snapshots: '@changesets/types@6.1.0': {} - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.0))': dependencies: - '@bufbuild/protobuf': 2.11.0 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) + '@bufbuild/protobuf': 2.12.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.12.0) - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.0)': dependencies: - '@bufbuild/protobuf': 2.11.0 + '@bufbuild/protobuf': 2.12.0 '@emnapi/core@1.10.0': dependencies: @@ -2896,11 +2896,11 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.0: + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -2978,7 +2978,7 @@ snapshots: dockerfile-ast@0.7.1: dependencies: vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 + vscode-languageserver-types: 3.18.0 doctrine@3.0.0: dependencies: @@ -2986,19 +2986,19 @@ snapshots: dotenv@16.6.1: {} - e2b@2.24.0: + e2b@2.27.1: dependencies: - '@bufbuild/protobuf': 2.11.0 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)) + '@bufbuild/protobuf': 2.12.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.12.0) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.12.0)) chalk: 5.6.2 compare-versions: 6.1.1 dockerfile-ast: 0.7.1 glob: 11.1.0 openapi-fetch: 0.14.1 platform: 1.3.6 - tar: 7.5.12 - undici: 7.25.0 + tar: 7.5.16 + undici: 7.27.0 es-module-lexer@2.1.0: {} @@ -3245,7 +3245,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.2.3 - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 2.0.2 @@ -3382,7 +3382,7 @@ snapshots: lodash.merge@4.6.2: {} - lru-cache@11.2.7: {} + lru-cache@11.5.1: {} lru-cache@6.0.0: dependencies: @@ -3399,9 +3399,9 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.2: dependencies: @@ -3409,11 +3409,11 @@ snapshots: minimatch@9.0.3: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimist@1.2.8: {} @@ -3527,7 +3527,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.5.1 minipass: 7.1.3 path-type@4.0.0: {} @@ -3711,7 +3711,7 @@ snapshots: dependencies: has-flag: 4.0.0 - tar@7.5.12: + tar@7.5.16: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -3808,7 +3808,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.25.0: {} + undici@7.27.0: {} universalify@0.1.2: {} @@ -3859,7 +3859,7 @@ snapshots: vscode-languageserver-textdocument@1.0.12: {} - vscode-languageserver-types@3.17.5: {} + vscode-languageserver-types@3.18.0: {} walk-up-path@4.0.0: {} diff --git a/python/poetry.lock b/python/poetry.lock index 52e9fbea..ac39c072 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -178,13 +178,13 @@ files = [ [[package]] name = "e2b" -version = "2.23.1" +version = "2.25.1" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.23.1-py3-none-any.whl", hash = "sha256:55a7d2d51b091a21a972eb4a284170bf8c0fd1a1564c44eaea8f2cd0b1195e9d"}, - {file = "e2b-2.23.1.tar.gz", hash = "sha256:ce8cfd388c2e4f8a9467cc363000746b68ecf7d48d9e6af5f81ad7e6d4756bce"}, + {file = "e2b-2.25.1-py3-none-any.whl", hash = "sha256:5ea5d1766082c1db504f86ebe17abe8b6a07f33d8addfb1a7778fae4a9549891"}, + {file = "e2b-2.25.1.tar.gz", hash = "sha256:b87f8da3bbcce613e1bef9a90c46ef042a053f3f311b5ab45fcff5bdf1b1b425"}, ] [package.dependencies] From 6f7af58a40a2bfaf397625c907fc53c8e4ed6376 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:29:17 +0200 Subject: [PATCH 717/722] Bump jupyter-server to 2.18.0 and pin root_dir (#286) * Bump jupyter-server in /template in the pip group across 1 directory Bumps the pip group with 1 update in the /template directory: [jupyter-server](https://github.com/jupyter-server/jupyter_server). Updates `jupyter-server` from 2.16.0 to 2.18.0 - [Release notes](https://github.com/jupyter-server/jupyter_server/releases) - [Changelog](https://github.com/jupyter-server/jupyter_server/blob/main/CHANGELOG.md) - [Commits](https://github.com/jupyter-server/jupyter_server/compare/v2.16.0...v2.18.0) --- updated-dependencies: - dependency-name: jupyter-server dependency-version: 2.18.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Pin jupyter-server root_dir for 2.18.0 path-traversal hardening jupyter-server 2.18.0 (CVE-2026-35397) rejects session creation when the contents root resolves to "/", which is the systemd process cwd. Pin root_dir to /home/user so POST /api/sessions succeeds. Co-Authored-By: Claude Opus 4.8 * Add changeset for jupyter-server root_dir pin Co-Authored-By: Claude Opus 4.8 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 --- .changeset/cold-pillows-grow.md | 5 +++++ template/jupyter_server_config.py | 13 +++++++++++++ template/requirements.txt | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/cold-pillows-grow.md diff --git a/.changeset/cold-pillows-grow.md b/.changeset/cold-pillows-grow.md new file mode 100644 index 00000000..a60c8b88 --- /dev/null +++ b/.changeset/cold-pillows-grow.md @@ -0,0 +1,5 @@ +--- +"@e2b/code-interpreter-template": patch +--- + +Pin `jupyter-server` `root_dir` to `/home/user` so session creation keeps working with jupyter-server 2.18.0's path-traversal hardening diff --git a/template/jupyter_server_config.py b/template/jupyter_server_config.py index 5400d8fe..663682cc 100644 --- a/template/jupyter_server_config.py +++ b/template/jupyter_server_config.py @@ -3,6 +3,19 @@ c = get_config() # noqa +# Pin the contents root directory. +# +# Sessions are created with a relative path (a bare uuid, see +# server/contexts.py). Without an explicit root_dir, jupyter-server +# inherits the process working directory as its root — which is "/" +# under systemd (jupyter.service has no WorkingDirectory). Since +# jupyter-server 2.18.0 (CVE-2026-35397 path-traversal hardening), a +# root_dir of "/" makes every POST /api/sessions fail with +# " is outside root contents directory", so the server never +# starts. Pinning it to /home/user matches the execution cwd. +c.ServerApp.root_dir = "/home/user" + + # Set the Access-Control-Allow-Origin header # # Use '*' to allow any origin to access your server. diff --git a/template/requirements.txt b/template/requirements.txt index 6434f468..71e7146b 100644 --- a/template/requirements.txt +++ b/template/requirements.txt @@ -1,5 +1,5 @@ # Jupyter server requirements -jupyter-server==2.16.0 +jupyter-server==2.18.0 ipykernel==6.31.0 ipython==9.14.0 From cf9e09560df1fe78fe3655a7ed52615eadc05761 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 3 Jun 2026 15:43:40 +0000 Subject: [PATCH 718/722] [skip ci] Release new versions --- .changeset/cold-pillows-grow.md | 5 ----- template/package.json | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/cold-pillows-grow.md diff --git a/.changeset/cold-pillows-grow.md b/.changeset/cold-pillows-grow.md deleted file mode 100644 index a60c8b88..00000000 --- a/.changeset/cold-pillows-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2b/code-interpreter-template": patch ---- - -Pin `jupyter-server` `root_dir` to `/home/user` so session creation keeps working with jupyter-server 2.18.0's path-traversal hardening diff --git a/template/package.json b/template/package.json index 627797d6..ae911686 100644 --- a/template/package.json +++ b/template/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-template", "private": true, - "version": "0.4.2", + "version": "0.4.3", "scripts": { "lint": "ruff check .", "format": "ruff format ." From 8115b1dbdf2a76d946a7f5cf8a1ab7aca0bec12f Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Thu, 4 Jun 2026 15:53:33 +0200 Subject: [PATCH 719/722] Add template debugging tooling and surface Jupyter logs (#288) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add template debugging tooling and surface Jupyter logs Send Jupyter's stdout to the systemd journal instead of /dev/null so startup errors (e.g. failed session creation) are visible via `journalctl -u jupyter`. Add a `make debug-template` workflow (build_debug.py + debug_logs.py) that builds the template via the real systemd start path with a timeout ready-gate, then spawns a sandbox and dumps the jupyter and code-interpreter service journals — for diagnosing a server that fails its readiness check. make_template() gains an optional `ready` override to support this. Co-Authored-By: Claude Opus 4.8 * Fix wait_for_timeout units in build_debug (ms, not s) wait_for_timeout takes milliseconds (min 1000ms), so 60 collapsed to a 1s ready-gate. Use 60_000 for the intended 60s. Co-Authored-By: Claude Opus 4.8 * Harden debug_logs against command/sandbox timeouts Address Cursor Bugbot review on PR #288: - Bump sandbox TTL 180s -> 600s so the full diagnostic sequence (sleep + per-command 60s budgets) can't outlive the sandbox. - Wrap each command in try/except so one slow or failing command no longer aborts the loop and skips the remaining journals/probes. Co-Authored-By: Claude Opus 4.8 * Drop redundant sleep in debug_logs The start command runs at build time and the resulting state is snapshotted, so a resumed sandbox already has the services running (and their journals populated). No need to wait after create. Co-Authored-By: Claude Opus 4.8 * Type the make_template ready parameter Annotate `ready` as `ReadyCmd | None` (the type returned by wait_for_url/wait_for_timeout and accepted by set_start_cmd). Co-Authored-By: Claude Opus 4.8 * Add --max-time to debug_logs health probes A port that accepts TCP but never sends an HTTP response (the half-broken state this tool diagnoses) would otherwise hang curl until the 60s command timeout. --max-time 3 makes each probe fail fast. Co-Authored-By: Claude Opus 4.8 * Route Jupyter stdout to journal only in debug builds Keep production at StandardOutput=null. make_template(debug=True) now applies a systemd drop-in (jupyter-debug.conf) that flips Jupyter's stdout to the journal, and build_debug.py opts in. Production template behavior is unchanged. Co-Authored-By: Claude Opus 4.8 * Drop redundant systemctl daemon-reload from template build systemd lazily loads the freshly-copied units (and their drop-ins) on the first `systemctl start` at end of build, so the explicit daemon-reload was a no-op. Verified the prod build still reaches a healthy /health gate without it. Co-Authored-By: Claude Opus 4.8 * Drop changeset; debug tooling needs no template release The published template artifact is unchanged (jupyter.service matches main, daemon-reload removal yields an identical image, the journal drop-in only ships in debug builds). Remaining changes are the build script, dev-only scripts, and docs — no version bump warranted. Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: Claude Opus 4.8 --- Makefile | 3 +++ template/README.md | 32 ++++++++++++++++++++++++++ template/build_debug.py | 23 +++++++++++++++++++ template/debug_logs.py | 35 +++++++++++++++++++++++++++++ template/systemd/jupyter-debug.conf | 5 +++++ template/template.py | 31 ++++++++++++++----------- 6 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 template/build_debug.py create mode 100644 template/debug_logs.py create mode 100644 template/systemd/jupyter-debug.conf diff --git a/Makefile b/Makefile index 99efa3b8..c1b25fea 100644 --- a/Makefile +++ b/Makefile @@ -3,3 +3,6 @@ start-template-server: kill-template-server: docker kill $(shell docker ps --filter expose=49999 --format {{.ID}}) + +debug-template: + cd template && python build_debug.py && python debug_logs.py diff --git a/template/README.md b/template/README.md index 19039fc4..31f89a90 100644 --- a/template/README.md +++ b/template/README.md @@ -55,3 +55,35 @@ sbx = Sandbox.create(template="code-interpreter-custom") execution = sbx.run_code("print('Hello, World!')") print(execution.logs.stdout) ``` + +## Debugging a server that won't start + +The template runs Jupyter and the code-interpreter server as **systemd** +services (`systemd/jupyter.service`, `systemd/code-interpreter.service`). This is +the path CI and production use — note it is *different* from `make +start-template-server`, which runs the Docker `start-up.sh` path. The two can +diverge, so a server that boots fine under Docker may still fail under systemd. + +When a build fails its readiness check (`Waiting for template to be ready ... +timed out`), the real cause is in the service journals. To see them: + +``` +make debug-template +``` + +This builds a debug template (gated on a fixed timeout instead of `/health`, so +it finalizes even while the server is crash-looping), spawns a sandbox, and +prints `systemctl status` + the full `journalctl` for both services. It needs +`template/.env` with your `E2B_API_KEY` and the deps from `requirements-dev.txt`. + +The debug build also applies a systemd drop-in that routes Jupyter's stdout to +the journal (`make_template(debug=True)`). Production builds keep +`StandardOutput=null`, so Jupyter's request/error logs are only captured in the +debug template. + +Inside a running sandbox you can also inspect things directly: + +``` +journalctl -u jupyter -u code-interpreter +systemctl status code-interpreter +``` diff --git a/template/build_debug.py b/template/build_debug.py new file mode 100644 index 00000000..f4dc63b4 --- /dev/null +++ b/template/build_debug.py @@ -0,0 +1,23 @@ +import os + +from dotenv import load_dotenv +from e2b import Template, default_build_logger, wait_for_timeout +from template import make_template + +load_dotenv() + +alias = os.getenv("E2B_DEBUG_TEMPLATE", "code-interpreter-debug") + +Template.build( + make_template( + kernels=["python", "javascript"], + ready=wait_for_timeout(60_000), + debug=True, + ), + alias=alias, + cpu_count=2, + memory_mb=2048, + on_build_logs=default_build_logger(min_level="debug"), +) + +print(f"Built debug template: {alias}") diff --git a/template/debug_logs.py b/template/debug_logs.py new file mode 100644 index 00000000..cdd7b49a --- /dev/null +++ b/template/debug_logs.py @@ -0,0 +1,35 @@ +import os + +from dotenv import load_dotenv +from e2b import Sandbox + +load_dotenv() + +alias = os.getenv("E2B_DEBUG_TEMPLATE", "code-interpreter-debug") + +sbx = Sandbox.create(template=alias, timeout=600) +print(f"sandbox: {sbx.sandbox_id}") + +CMDS = [ + "systemctl --no-pager status jupyter || true", + "systemctl --no-pager status code-interpreter || true", + "journalctl --no-pager -u jupyter || true", + "journalctl --no-pager -u code-interpreter || true", + "curl -s --max-time 3 -o /dev/null -w 'jupyter :8888 -> %{http_code}\\n' http://localhost:8888/api/status || true", + "curl -s --max-time 3 -o /dev/null -w 'server :49999 -> %{http_code}\\n' http://localhost:49999/health || true", +] + +try: + for cmd in CMDS: + print(f"\n===== $ {cmd} =====") + try: + result = sbx.commands.run(f"sudo bash -lc {cmd!r}", timeout=60) + if result.stdout: + print(result.stdout) + if result.stderr: + print("[stderr]", result.stderr) + except Exception as e: + # Keep going so one slow/failed command doesn't skip the rest. + print(f"[command failed] {e}") +finally: + sbx.kill() diff --git a/template/systemd/jupyter-debug.conf b/template/systemd/jupyter-debug.conf new file mode 100644 index 00000000..89377a6f --- /dev/null +++ b/template/systemd/jupyter-debug.conf @@ -0,0 +1,5 @@ +# Debug-only drop-in: route Jupyter's stdout to the journal (the base unit +# sends it to /dev/null) so ServerApp request/error logs are visible via +# `journalctl -u jupyter`. Applied only by `make_template(debug=True)`. +[Service] +StandardOutput=journal diff --git a/template/template.py b/template/template.py index 62fec9e2..fd8dd937 100644 --- a/template/template.py +++ b/template/template.py @@ -1,9 +1,11 @@ -from e2b import Template, wait_for_url +from e2b import ReadyCmd, Template, wait_for_url def make_template( kernels: list[str] = ["python", "r", "javascript", "bash", "java"], is_docker: bool = False, + ready: ReadyCmd | None = None, + debug: bool = False, ): enabled_kernels = set(["python", "javascript"] + kernels) # Start with base template @@ -104,16 +106,18 @@ def make_template( ) if not is_docker: - template = ( - template.copy( - "systemd/jupyter.service", "/etc/systemd/system/jupyter.service" - ) - .copy( - "systemd/code-interpreter.service", - "/etc/systemd/system/code-interpreter.service", - ) - .run_cmd("systemctl daemon-reload") + template = template.copy( + "systemd/jupyter.service", "/etc/systemd/system/jupyter.service" + ).copy( + "systemd/code-interpreter.service", + "/etc/systemd/system/code-interpreter.service", ) + if debug: + # Drop-in that routes Jupyter's stdout to the journal for debugging. + template = template.copy( + "systemd/jupyter-debug.conf", + "/etc/systemd/system/jupyter.service.d/debug.conf", + ) else: template = template.copy("start-up.sh", ".jupyter/start-up.sh").run_cmd( "chmod +x .jupyter/start-up.sh" @@ -136,6 +140,7 @@ def make_template( else: start_cmd = "sudo systemctl start jupyter" - return template.set_start_cmd( - start_cmd, wait_for_url("http://localhost:49999/health") - ) + if ready is None: + ready = wait_for_url("http://localhost:49999/health") + + return template.set_start_cmd(start_cmd, ready) From d587b8c5b42509e101fba56d1be21c9451955538 Mon Sep 17 00:00:00 2001 From: Mish Ushakov <10400064+mishushakov@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:18:25 +0200 Subject: [PATCH 720/722] docs: document building the template with build_prod.py (#289) * docs: document building the template with build_prod.py Rename the customizing section, add an env-vars step, and document building the production template via template/build_prod.py. Co-Authored-By: Claude Opus 4.8 * Update README.md * Update README.md * Update README.md * docs: reference template guide from main README Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: Claude Opus 4.8 --- README.md | 3 +++ template/README.md | 43 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4e6c788a..1b5216f9 100644 --- a/README.md +++ b/README.md @@ -72,3 +72,6 @@ Visit [E2B documentation](https://e2b.dev/docs). ### 5. E2B cookbook Visit our [Cookbook](https://github.com/e2b-dev/e2b-cookbook/tree/main) to get inspired by examples with different LLMs and AI frameworks. + +## Customizing the sandbox template +Need extra packages or a different runtime? You can build your own Code Interpreter sandbox template. See the [template guide](/template/README.md) for a step-by-step walkthrough of creating, building, and using a custom template (as well as building the production `code-interpreter-v1` template). diff --git a/template/README.md b/template/README.md index 31f89a90..4f64fabe 100644 --- a/template/README.md +++ b/template/README.md @@ -1,8 +1,37 @@ -# Using custom sandbox with Code Interpreter SDK +# Code Interpreter + +## Building the production template + +To build the official `code-interpreter-v1` template from this repo, use +`build_prod.py`. This is the script CI and releases run. + +1. Install the build dependencies: + +``` +pip install -r requirements-dev.txt +``` + +2. Provide your credentials in `.env`: + +``` +E2B_API_KEY=e2b_*** +``` + +3. Build the template: + +``` +python build_prod.py +``` + +Set `SKIP_CACHE=true` to force a clean rebuild that ignores the layer cache: + +``` +SKIP_CACHE=true python build_prod.py +``` If you want to customize the Code Interpreter sandbox (e.g.: add a preinstalled package) you can do that by creating a [custom sandbox template](https://e2b.dev/docs/template/quickstart). -## Step-by-step guide +## Creating a custom template 1. Install E2B SDK @@ -40,13 +69,19 @@ Template.build( ) ``` -3. Build the template: +4. Set your environment variables in a `.env` file (loaded by `load_dotenv()`): + +``` +E2B_API_KEY=e2b_*** +``` + +5. Build the template: ``` python build.py ``` -4. Use the custom template: +6. Use the custom template: ```python from e2b import Sandbox From 94bebe856d2d26bc03164a41ffa418d4399cd3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Sat, 6 Jun 2026 08:59:38 +0200 Subject: [PATCH 721/722] chore: bump e2b (#290) * chore: bump e2b with custom header options * FIx changeset Bump E2B package to include API-only custom header options for JavaScript and Python SDKs. --- .changeset/quiet-bears-clap.md | 6 ++++++ js/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- python/poetry.lock | 8 ++++---- python/pyproject.toml | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/quiet-bears-clap.md diff --git a/.changeset/quiet-bears-clap.md b/.changeset/quiet-bears-clap.md new file mode 100644 index 00000000..e8efc189 --- /dev/null +++ b/.changeset/quiet-bears-clap.md @@ -0,0 +1,6 @@ +--- +'@e2b/code-interpreter': minor +'@e2b/code-interpreter-python': minor +--- + +Bump E2B package: add API-only custom header options for the JavaScript and Python SDKs diff --git a/js/package.json b/js/package.json index 9421424a..27025956 100644 --- a/js/package.json +++ b/js/package.json @@ -71,6 +71,6 @@ "defaults" ], "dependencies": { - "e2b": "^2.24.0" + "e2b": "^2.28.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acc389da..164d0200 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: js: dependencies: e2b: - specifier: ^2.24.0 - version: 2.27.1 + specifier: ^2.28.0 + version: 2.28.0 devDependencies: '@types/node': specifier: ^20.19.19 @@ -1201,8 +1201,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@2.27.1: - resolution: {integrity: sha512-xZ1vXSl4dpWxbvan5vihE2embXzHdlpK1N0CmFUIcj5kdGLpiQXGoQYsz1Dhy8wr9VO724DyRC7Y3iblMElLPQ==} + e2b@2.28.0: + resolution: {integrity: sha512-ptvySeKFFwz+bJbGIT6WGRkLr+Xwo1/oicf82cFuMepPXdRd3CrJoZ8FGnu+XWHRSJlOKBfCWENrDZmg4oKTtQ==} engines: {node: '>=20.18.1'} es-module-lexer@2.1.0: @@ -2986,7 +2986,7 @@ snapshots: dotenv@16.6.1: {} - e2b@2.27.1: + e2b@2.28.0: dependencies: '@bufbuild/protobuf': 2.12.0 '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.12.0) diff --git a/python/poetry.lock b/python/poetry.lock index ac39c072..8cfb8d1e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -178,13 +178,13 @@ files = [ [[package]] name = "e2b" -version = "2.25.1" +version = "2.26.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "e2b-2.25.1-py3-none-any.whl", hash = "sha256:5ea5d1766082c1db504f86ebe17abe8b6a07f33d8addfb1a7778fae4a9549891"}, - {file = "e2b-2.25.1.tar.gz", hash = "sha256:b87f8da3bbcce613e1bef9a90c46ef042a053f3f311b5ab45fcff5bdf1b1b425"}, + {file = "e2b-2.26.0-py3-none-any.whl", hash = "sha256:55cdb88b30d3026084fff862275815d88ffd37665814f73f09beea9c057de5bc"}, + {file = "e2b-2.26.0.tar.gz", hash = "sha256:e140aec56c29a34706cdaf1bbe4dc1858ac38c7bed87145795019cf321866a2f"}, ] [package.dependencies] @@ -1148,4 +1148,4 @@ bracex = ">=2.1.1" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "eaf5b7c74ed5b658d308d5ca93601080221ae823e6881c04b06b287b964f2d5f" +content-hash = "4b9fdae45121bdfe70eafce86abac886c8379200b6689d0d99a24aef87b152d7" diff --git a/python/pyproject.toml b/python/pyproject.toml index 46cdb32e..b618c964 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ python = "^3.10" httpx = ">=0.20.0, <1.0.0" attrs = ">=21.3.0" -e2b = "^2.23.1" +e2b = "^2.26.0" [tool.poetry.group.dev.dependencies] pytest = "^9.0.3" From efadb49cc87e06766bdb1cc6f33d3c54cd3e2607 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 6 Jun 2026 07:01:20 +0000 Subject: [PATCH 722/722] [skip ci] Release new versions --- .changeset/quiet-bears-clap.md | 6 ------ js/package.json | 2 +- python/package.json | 2 +- python/pyproject.toml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 .changeset/quiet-bears-clap.md diff --git a/.changeset/quiet-bears-clap.md b/.changeset/quiet-bears-clap.md deleted file mode 100644 index e8efc189..00000000 --- a/.changeset/quiet-bears-clap.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2b/code-interpreter': minor -'@e2b/code-interpreter-python': minor ---- - -Bump E2B package: add API-only custom header options for the JavaScript and Python SDKs diff --git a/js/package.json b/js/package.json index 27025956..797763cf 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@e2b/code-interpreter", - "version": "2.5.0", + "version": "2.6.0", "packageManager": "pnpm@9.15.9", "description": "E2B Code Interpreter - Stateful code execution", "homepage": "https://e2b.dev", diff --git a/python/package.json b/python/package.json index 5530a546..b533e8f3 100644 --- a/python/package.json +++ b/python/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/code-interpreter-python", "private": true, - "version": "2.7.0", + "version": "2.8.0", "packageManager": "pnpm@9.15.9", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", diff --git a/python/pyproject.toml b/python/pyproject.toml index b618c964..33381043 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "e2b-code-interpreter" -version = "2.7.0" +version = "2.8.0" description = "E2B Code Interpreter - Stateful code execution" authors = ["e2b "] license = "MIT"