better-dsh 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -178
- package/cordis.patch.yml +4 -35
- package/docs/adr/0015-independent-bundles-agent-remote.md +40 -0
- package/docs/remote-tools.md +56 -0
- package/docs/specs/omp-python-repl-port/runtime-guide.md +33 -0
- package/docs/specs/omp-python-repl-port/spec.md +61 -0
- package/docs/specs/remote-tool-enhancement/spec.md +203 -0
- package/dsh-docs/baseline.md +13 -0
- package/dsh-docs/subsystems/invariants.md +3 -0
- package/dsh-docs/subsystems/invariants.zh.md +3 -0
- package/eval-description.md +7 -3
- package/lib/{LaunchOptions-kGXcZOe0.js → LaunchOptions-5eg7E0ye.js} +1 -1
- package/lib/LaunchOptions-DxQQ0s-A.js +4 -0
- package/lib/{bidi-BalpKaJc.js → bidi-CwabFH07.js} +1 -1
- package/lib/client/index.js +30 -6
- package/lib/failover/index.js +1 -1
- package/lib/fs-aware/sandbox-plugin.js +3 -3
- package/lib/{index-browser-CysrjMyM.js → index-browser-B-9jm12n.js} +4 -4
- package/lib/index.d.ts +17 -41
- package/lib/index.js +473 -1678
- package/lib/kernel-env-BOF0fNHn.js +91 -0
- package/lib/kernel-env.d.ts +4 -58
- package/lib/kernel-env.js +2 -2
- package/lib/{lsp-server-registry-BXvUTBY7.js → lsp-server-registry-BcdkHROD.js} +1 -1
- package/lib/{lsp-server-registry-CH9WNFFt.js → lsp-server-registry-D4VLs1Sm.js} +1 -1
- package/lib/{main-CupOhMp5.js → main-BeCgUd20.js} +8 -6
- package/lib/{main-BQeFrBM1.js → main-Dv_UQqG2.js} +1 -1
- package/lib/mobile/plugin.d.ts +1 -1
- package/lib/omp-python/DILL-LICENSE +35 -0
- package/lib/omp-python/OMP-LICENSE +23 -0
- package/lib/omp-python/better_snapshot.py +391 -0
- package/lib/omp-python/better_support.py +425 -0
- package/lib/omp-python/dill-provenance.json +55 -0
- package/lib/omp-python/provenance.json +13 -0
- package/lib/omp-python/runner.py +2499 -0
- package/lib/omp-python/vendor/dill/__diff.py +234 -0
- package/lib/omp-python/vendor/dill/__info__.py +291 -0
- package/lib/omp-python/vendor/dill/__init__.py +119 -0
- package/lib/omp-python/vendor/dill/_dill.py +2265 -0
- package/lib/omp-python/vendor/dill/_objects.py +545 -0
- package/lib/omp-python/vendor/dill/_shims.py +193 -0
- package/lib/omp-python/vendor/dill/detect.py +287 -0
- package/lib/omp-python/vendor/dill/logger.py +285 -0
- package/lib/omp-python/vendor/dill/objtypes.py +24 -0
- package/lib/omp-python/vendor/dill/pointers.py +122 -0
- package/lib/omp-python/vendor/dill/session.py +612 -0
- package/lib/omp-python/vendor/dill/settings.py +25 -0
- package/lib/omp-python/vendor/dill/source.py +1025 -0
- package/lib/omp-python/vendor/dill/temp.py +252 -0
- package/lib/{puppeteer-core-CSk2PtSm.js → puppeteer-core-Dnd7eqel.js} +9 -9
- package/lib/remote/plugin.d.ts +459 -5
- package/lib/remote/plugin.js +2389 -210
- package/lib/url-schemes/index.d.ts +11 -11
- package/lib/url-schemes/index.js +12 -12
- package/lib/web-password.d.ts +8 -8
- package/lib/web-password.js +5 -1
- package/lib/{web-trust-Dej_RI2B.d.ts → web-trust-CwZrTBcl.d.ts} +11 -11
- package/lib/web-trust.d.ts +1 -2
- package/lib/welcome-notice.d.ts +5 -7
- package/lib/welcome-notice.js +9 -48
- package/lib/{wrap-T4I0nfPM.js → wrap-0VA0uFx8.js} +1 -1
- package/package.json +6 -23
- package/scripts/kernel-provision.mjs +4 -34
- package/lib/LaunchOptions-B874eBu2.js +0 -4
- package/lib/bundle-delivery.d.ts +0 -20
- package/lib/bundle-delivery.js +0 -209
- package/lib/hmr.d.ts +0 -32
- package/lib/hmr.js +0 -49
- package/lib/kernel-bridge.py +0 -172
- package/lib/kernel-env-D8UOWeji.js +0 -195
- package/lib/webserver.d.ts +0 -10
- package/lib/webserver.js +0 -19
- package/scripts/register-bundle.mjs +0 -80
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
|
|
7
|
+
//#region src/kernel-env.ts
|
|
8
|
+
const exec = promisify(execFile);
|
|
9
|
+
const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
|
+
const AUTO_PYTHON_SENTINEL = "python3";
|
|
11
|
+
const DEFAULT_KERNEL_PYTHON_VERSION = "3.11";
|
|
12
|
+
const DILL_VERSION = "0.4.1";
|
|
13
|
+
function uvToolEnv(venvDir) {
|
|
14
|
+
const cache = join(dirname(venvDir), ".uv-cache");
|
|
15
|
+
return {
|
|
16
|
+
...process.env,
|
|
17
|
+
UV_CACHE_DIR: cache,
|
|
18
|
+
UV_PYTHON_INSTALL_DIR: join(cache, "python"),
|
|
19
|
+
UV_LINK_MODE: "copy"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function uvVenvArgs(dir, version) {
|
|
23
|
+
return [
|
|
24
|
+
"venv",
|
|
25
|
+
dir,
|
|
26
|
+
"--python",
|
|
27
|
+
version
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
function venvFallbackArgs(dir) {
|
|
31
|
+
return [
|
|
32
|
+
"-m",
|
|
33
|
+
"venv",
|
|
34
|
+
"--without-pip",
|
|
35
|
+
dir
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
function venvPython(dir) {
|
|
39
|
+
return join(dir, process.platform === "win32" ? "Scripts/python.exe" : "bin/python");
|
|
40
|
+
}
|
|
41
|
+
async function probe(python) {
|
|
42
|
+
try {
|
|
43
|
+
const { stdout } = await exec(python, ["-c", "import ast, asyncio, json, sys; assert sys.version_info >= (3, 9), \"Python >=3.9 required\"; print(json.dumps(sys.version.split()[0]))"], {
|
|
44
|
+
timeout: 15e3,
|
|
45
|
+
env: {
|
|
46
|
+
...process.env,
|
|
47
|
+
PYTHONDONTWRITEBYTECODE: "1"
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return JSON.parse(stdout.trim());
|
|
51
|
+
} catch (error) {
|
|
52
|
+
throw new Error(`Better Python REPL requires Python >=3.9. Could not use ${JSON.stringify(python)}: ${error instanceof Error ? error.message : String(error)}. Configure python with a working interpreter path.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function resolveKernelEnv(options = {}) {
|
|
56
|
+
if (options.python && options.python !== AUTO_PYTHON_SENTINEL) return {
|
|
57
|
+
python: options.python,
|
|
58
|
+
managed: false,
|
|
59
|
+
venvDir: void 0,
|
|
60
|
+
dill: true,
|
|
61
|
+
version: await probe(options.python)
|
|
62
|
+
};
|
|
63
|
+
const venvDir = options.venvDir ?? join(PACKAGE_ROOT, ".venv-kernel");
|
|
64
|
+
const python = venvPython(venvDir);
|
|
65
|
+
if (!existsSync(python)) {
|
|
66
|
+
if (options.autoInstall === false) throw new Error(`Better Python REPL managed interpreter is missing at ${python}; configure python or run npm run kernel:venv`);
|
|
67
|
+
options.log?.("info", `Creating stdlib-only Python environment at ${venvDir} (no pip packages)`);
|
|
68
|
+
let uv = false;
|
|
69
|
+
try {
|
|
70
|
+
await exec("uv", ["--version"], { timeout: 1e4 });
|
|
71
|
+
uv = true;
|
|
72
|
+
} catch {}
|
|
73
|
+
if (uv) {
|
|
74
|
+
mkdirSync(join(dirname(venvDir), ".uv-cache"), { recursive: true });
|
|
75
|
+
await exec("uv", uvVenvArgs(venvDir, options.pythonVersion ?? DEFAULT_KERNEL_PYTHON_VERSION), {
|
|
76
|
+
timeout: 12e4,
|
|
77
|
+
env: uvToolEnv(venvDir)
|
|
78
|
+
});
|
|
79
|
+
} else await exec("python3", venvFallbackArgs(venvDir), { timeout: 12e4 });
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
python,
|
|
83
|
+
managed: true,
|
|
84
|
+
venvDir,
|
|
85
|
+
dill: true,
|
|
86
|
+
version: await probe(python)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { resolveKernelEnv as a, venvFallbackArgs as c, PACKAGE_ROOT as i, DEFAULT_KERNEL_PYTHON_VERSION as n, uvToolEnv as o, DILL_VERSION as r, uvVenvArgs as s, AUTO_PYTHON_SENTINEL as t };
|
package/lib/kernel-env.d.ts
CHANGED
|
@@ -1,80 +1,26 @@
|
|
|
1
1
|
//#region src/kernel-env.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* Kernel environment resolution and provisioning.
|
|
4
|
-
*
|
|
5
|
-
* The runtime OWNS the interpreter it spawns: it never trusts a bare
|
|
6
|
-
* `python3` on the PATH, because that interpreter may lack `ipykernel`
|
|
7
|
-
* (hard failure — the kernel cannot start) or `dill` (snapshot capability —
|
|
8
|
-
* silently degrading to no snapshots). Instead it resolves one of two
|
|
9
|
-
* environments:
|
|
10
|
-
*
|
|
11
|
-
* - **Explicit** — `config.python` names a real interpreter (a path, or any
|
|
12
|
-
* name other than the bare-`python3` sentinel the default/patch produce).
|
|
13
|
-
* It is probed, and a missing `ipykernel` is a loud error while a missing
|
|
14
|
-
* `dill` is a loud warning (snapshots disabled).
|
|
15
|
-
* - **Managed** — no explicit interpreter: the runtime provisions a venv
|
|
16
|
-
* UNDER THE PACKAGE (`<packageRoot>/.venv-kernel`, or `config.kernelEnvDir`)
|
|
17
|
-
* with `ipykernel` + `dill`, installing it on first use when
|
|
18
|
-
* `config.kernelAutoInstall` is on. The venv lives beside the package, NOT
|
|
19
|
-
* in `/tmp` (the pre-v0.1.9 dangling-symlink failure mode), so it survives
|
|
20
|
-
* the host's tmp reaper and the process restart.
|
|
21
|
-
*
|
|
22
|
-
* Provisioning uses `uv` when available (fast, can fetch the pinned CPython
|
|
23
|
-
* version), falling back to `python3 -m venv` + `ensurepip`. It is idempotent:
|
|
24
|
-
* a complete venv is reused untouched; a partial one is repaired.
|
|
25
|
-
* @module dashr/kernel-env
|
|
26
|
-
*/
|
|
27
|
-
/** The installed package root (where `lib/` and `src/` live): the default home of the managed venv. */
|
|
28
2
|
declare const PACKAGE_ROOT: string;
|
|
29
|
-
/** The config value meaning "no explicit interpreter — auto-manage a venv". */
|
|
30
3
|
declare const AUTO_PYTHON_SENTINEL = "python3";
|
|
31
|
-
/** Preferred CPython version for a managed venv. */
|
|
32
4
|
declare const DEFAULT_KERNEL_PYTHON_VERSION = "3.11";
|
|
33
|
-
/** Pinned, tested `ipykernel` version (2026-09-02 tested value; upgrade = explicit change + regression). */
|
|
34
|
-
declare const IPYKERNEL_VERSION = "7.3.0";
|
|
35
|
-
/** Pinned, tested `dill` version. */
|
|
36
5
|
declare const DILL_VERSION = "0.4.1";
|
|
37
6
|
interface KernelEnv {
|
|
38
|
-
/** Absolute path to the interpreter to spawn (`-m ipykernel_launcher`). */
|
|
39
7
|
python: string;
|
|
40
|
-
/** True when this runtime provisioned a venv (vs an explicit interpreter). */
|
|
41
8
|
managed: boolean;
|
|
42
|
-
/** The managed venv root, when {@link managed}. */
|
|
43
9
|
venvDir: string | undefined;
|
|
44
|
-
/**
|
|
10
|
+
/** Snapshot implementation is packaged rather than installed into Python. */
|
|
45
11
|
dill: boolean;
|
|
46
|
-
/** True when `ipykernel` is importable (a hard requirement). */
|
|
47
|
-
ipykernel: boolean;
|
|
48
|
-
/** The interpreter's reported version, e.g. `3.11.15`. */
|
|
49
12
|
version: string;
|
|
50
13
|
}
|
|
51
14
|
interface ResolveKernelEnvOptions {
|
|
52
|
-
/** `config.python`; the bare sentinel (or absent) selects a managed venv. */
|
|
53
15
|
python?: string;
|
|
54
|
-
/** Managed venv directory; defaults to `<packageRoot>/.venv-kernel`. */
|
|
55
16
|
venvDir?: string;
|
|
56
|
-
/** Preferred CPython version for the managed venv. */
|
|
57
17
|
pythonVersion?: string;
|
|
58
|
-
/** Provision the managed venv when missing/incomplete (default true). */
|
|
59
18
|
autoInstall?: boolean;
|
|
60
|
-
/** Logger callback (info on provisioning, warn on degraded snapshot). */
|
|
61
19
|
log?: (level: 'info' | 'warn', message: string) => void;
|
|
62
20
|
}
|
|
63
|
-
/** Tool-cache env for uv: caches live NEXT TO the venv (plugin territory), so a read-only home can never block provisioning. */
|
|
64
21
|
declare function uvToolEnv(venvDir: string): NodeJS.ProcessEnv;
|
|
65
|
-
|
|
66
|
-
declare function
|
|
67
|
-
/** python3 -m venv fallback arguments (pure; cache-free by construction). */
|
|
68
|
-
declare function venvFallbackArgs(venvDir: string): string[];
|
|
69
|
-
/** uv pip install arguments with pinned versions (pure; unit-tested). */
|
|
70
|
-
declare function uvInstallArgs(python: string): string[];
|
|
71
|
-
/** pip install arguments with pinned versions for the venv interpreter (pure). */
|
|
72
|
-
declare function pipInstallArgs(): string[];
|
|
73
|
-
/**
|
|
74
|
-
* Resolve the kernel interpreter, provisioning a managed venv when no
|
|
75
|
-
* explicit interpreter is configured. Throws when the resolved interpreter
|
|
76
|
-
* cannot run `ipykernel`; a missing `dill` only disables snapshots (warned).
|
|
77
|
-
*/
|
|
22
|
+
declare function uvVenvArgs(dir: string, version: string): string[];
|
|
23
|
+
declare function venvFallbackArgs(dir: string): string[];
|
|
78
24
|
declare function resolveKernelEnv(options?: ResolveKernelEnvOptions): Promise<KernelEnv>;
|
|
79
25
|
//#endregion
|
|
80
|
-
export { AUTO_PYTHON_SENTINEL, DEFAULT_KERNEL_PYTHON_VERSION, DILL_VERSION,
|
|
26
|
+
export { AUTO_PYTHON_SENTINEL, DEFAULT_KERNEL_PYTHON_VERSION, DILL_VERSION, KernelEnv, PACKAGE_ROOT, ResolveKernelEnvOptions, resolveKernelEnv, uvToolEnv, uvVenvArgs, venvFallbackArgs };
|
package/lib/kernel-env.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as resolveKernelEnv, c as venvFallbackArgs, i as PACKAGE_ROOT, n as DEFAULT_KERNEL_PYTHON_VERSION, o as uvToolEnv, r as DILL_VERSION, s as uvVenvArgs, t as AUTO_PYTHON_SENTINEL } from "./kernel-env-BOF0fNHn.js";
|
|
2
2
|
|
|
3
|
-
export { AUTO_PYTHON_SENTINEL, DEFAULT_KERNEL_PYTHON_VERSION, DILL_VERSION,
|
|
3
|
+
export { AUTO_PYTHON_SENTINEL, DEFAULT_KERNEL_PYTHON_VERSION, DILL_VERSION, PACKAGE_ROOT, resolveKernelEnv, uvToolEnv, uvVenvArgs, venvFallbackArgs };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as primaryServerForFile, c as serversForFile, i as installServer, n as findWorkspaceRoot, o as resolveCommandPath, r as installHintFor, s as serverByName, t as clearCommandProbeCache } from "./lsp-server-registry-
|
|
1
|
+
import { a as primaryServerForFile, c as serversForFile, i as installServer, n as findWorkspaceRoot, o as resolveCommandPath, r as installHintFor, s as serverByName, t as clearCommandProbeCache } from "./lsp-server-registry-D4VLs1Sm.js";
|
|
2
2
|
|
|
3
3
|
export { clearCommandProbeCache, findWorkspaceRoot, installHintFor, installServer, primaryServerForFile, resolveCommandPath, serverByName, serversForFile };
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import
|
|
3
|
-
import { mkdir, readdir, unlink } from "node:fs/promises";
|
|
2
|
+
import fs, { accessSync, constants, createReadStream, createWriteStream, existsSync, readFileSync } from "node:fs";
|
|
4
3
|
import path from "node:path";
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import os from "node:os";
|
|
4
|
+
import childProcess, { execFile, execSync, spawn, spawnSync } from "node:child_process";
|
|
5
|
+
import * as http from "node:http";
|
|
8
6
|
import readline from "node:readline";
|
|
7
|
+
import { URL as URL$1, urlToHttpOptions } from "node:url";
|
|
9
8
|
import { debuglog, promisify } from "node:util";
|
|
9
|
+
import { mkdir, readdir, symlink, unlink } from "node:fs/promises";
|
|
10
|
+
import { pipeline } from "node:stream/promises";
|
|
11
|
+
import { Writable } from "node:stream";
|
|
12
|
+
import os from "node:os";
|
|
10
13
|
import { EventEmitter } from "node:events";
|
|
11
|
-
import * as http from "node:http";
|
|
12
14
|
import * as https from "node:https";
|
|
13
15
|
|
|
14
16
|
//#region node_modules/@puppeteer/browsers/lib/browser-data/types.js
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as Browser, a as TimeoutError, b as ChromeReleaseChannel, c as computeSystemExecutablePath, d as InstalledBrowser, f as detectBrowserPlatform, g as resolveDefaultUserDataDir, h as resolveBuildId, i as Process, l as launch, m as getVersionComparator, n as uninstall, o as WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX, p as createProfile, r as CDP_WEBSOCKET_ENDPOINT_REGEX, s as computeExecutablePath, t as getInstalledBrowsers, u as Cache, v as BrowserPlatform, y as BrowserTag } from "./main-
|
|
1
|
+
import { _ as Browser, a as TimeoutError, b as ChromeReleaseChannel, c as computeSystemExecutablePath, d as InstalledBrowser, f as detectBrowserPlatform, g as resolveDefaultUserDataDir, h as resolveBuildId, i as Process, l as launch, m as getVersionComparator, n as uninstall, o as WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX, p as createProfile, r as CDP_WEBSOCKET_ENDPOINT_REGEX, s as computeExecutablePath, t as getInstalledBrowsers, u as Cache, v as BrowserPlatform, y as BrowserTag } from "./main-BeCgUd20.js";
|
|
2
2
|
|
|
3
3
|
export { Browser, BrowserPlatform, BrowserTag, CDP_WEBSOCKET_ENDPOINT_REGEX, Cache, ChromeReleaseChannel, InstalledBrowser, Process, TimeoutError, WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX, computeExecutablePath, computeSystemExecutablePath, createProfile, detectBrowserPlatform, getInstalledBrowsers, getVersionComparator, launch, resolveBuildId, resolveDefaultUserDataDir, uninstall };
|
package/lib/mobile/plugin.d.ts
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Copyright (c) 2004-2016 California Institute of Technology.
|
|
2
|
+
Copyright (c) 2016-2026 The Uncertainty Quantification Foundation.
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
This software is available subject to the conditions and terms laid
|
|
6
|
+
out below. By downloading and using this software you are agreeing
|
|
7
|
+
to the following conditions.
|
|
8
|
+
|
|
9
|
+
Redistribution and use in source and binary forms, with or without
|
|
10
|
+
modification, are permitted provided that the following conditions
|
|
11
|
+
are met:
|
|
12
|
+
|
|
13
|
+
- Redistributions of source code must retain the above copyright
|
|
14
|
+
notice, this list of conditions and the following disclaimer.
|
|
15
|
+
|
|
16
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
17
|
+
notice, this list of conditions and the following disclaimer in the
|
|
18
|
+
documentation and/or other materials provided with the distribution.
|
|
19
|
+
|
|
20
|
+
- Neither the names of the copyright holders nor the names of any of
|
|
21
|
+
the contributors may be used to endorse or promote products derived
|
|
22
|
+
from this software without specific prior written permission.
|
|
23
|
+
|
|
24
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
26
|
+
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
27
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
28
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
29
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
30
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
31
|
+
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
33
|
+
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
34
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Mario Zechner
|
|
4
|
+
Copyright (c) 2025-2026 Can Bölük
|
|
5
|
+
Copyright (c) 2026 Stencil Labs, Inc.
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
SOFTWARE.
|