kernel-checkpoint 0.1.2__tar.gz → 0.1.3__tar.gz
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.
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/PKG-INFO +1 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/jupyter-notebook-image/Dockerfile +1 -1
- kernel_checkpoint-0.1.3/kernel_checkpoint/__init__.py +94 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/_version.py +1 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/handlers.py +3 -3
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/build_log.json +1 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/package.json +2 -2
- kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/lib_index_js.2c713e3ab2e5b31ee0e1.js → kernel_checkpoint-0.1.3/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js +12 -6
- kernel_checkpoint-0.1.3/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js.map +1 -0
- kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/remoteEntry.0ec66dead21656df694e.js → kernel_checkpoint-0.1.3/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js +3 -3
- kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/remoteEntry.0ec66dead21656df694e.js.map → kernel_checkpoint-0.1.3/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js.map +1 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/package.json +1 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/src/checkpoint-panel.tsx +6 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/src/index.ts +3 -2
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/src/types.ts +1 -1
- kernel_checkpoint-0.1.2/kernel_checkpoint/__init__.py +0 -23
- kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/lib_index_js.2c713e3ab2e5b31ee0e1.js.map +0 -1
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/.copier-answers.yml +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/.gitignore +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/.prettierignore +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/.yarnrc.yml +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/4 +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/=4 +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/CHANGELOG.md +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/LICENSE +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/README.md +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/RELEASE.md +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/babel.config.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/cursor_jupyterlab_extension_for_checkpo.md +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/install.json +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/jest.config.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/jupyter-config/jupyter_server_config.d/kernel_checkpoint.json +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/Untitled.ipynb +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/static/style.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js.map +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/pyproject.toml +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/setup.py +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/src/__tests__/kernel_checkpoint.spec.ts +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/src/api.ts +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/style/base.css +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/style/index.css +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/style/index.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/tsconfig.json +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/tsconfig.test.json +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/README.md +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/jupyter_server_test_config.py +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/package.json +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/playwright.config.js +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/tests/kernel_checkpoint.spec.ts +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/yarn.lock +0 -0
- {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/yarn.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kernel_checkpoint
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: An extension for saving and restoring kernel pod state with jupyter enterprise gateway
|
|
5
5
|
Project-URL: Homepage, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git/issues
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
try:
|
|
2
|
+
from ._version import __version__
|
|
3
|
+
except ImportError:
|
|
4
|
+
import warnings
|
|
5
|
+
warnings.warn("Importing 'kernel_checkpoint' outside a proper installation.")
|
|
6
|
+
__version__ = "dev"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _jupyter_labextension_paths():
|
|
10
|
+
return [{
|
|
11
|
+
"src": "labextension",
|
|
12
|
+
"dest": "kernel-checkpoint"
|
|
13
|
+
}]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _jupyter_server_extension_points():
|
|
17
|
+
return [{"module": "kernel_checkpoint"}]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _load_jupyter_server_extension(server_app):
|
|
21
|
+
from .handlers import setup_handlers
|
|
22
|
+
setup_handlers(server_app.web_app)
|
|
23
|
+
_patch_kernel_handler_for_env_passthrough(server_app)
|
|
24
|
+
server_app.log.info("kernel_checkpoint server extension loaded")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _patch_kernel_handler_for_env_passthrough(server_app):
|
|
28
|
+
"""
|
|
29
|
+
Monkey-patch ``MainKernelHandler.post`` so that an ``env`` dict in the
|
|
30
|
+
request body is forwarded to ``KernelManager.start_kernel``.
|
|
31
|
+
|
|
32
|
+
The stock Jupyter Server handler silently drops ``env`` from the POST
|
|
33
|
+
payload. Enterprise Gateway (and other provisioners) need it to receive
|
|
34
|
+
``KERNEL_CHECKPOINT_NAME`` during a checkpoint-restore flow.
|
|
35
|
+
|
|
36
|
+
Requests that do **not** carry ``env`` are delegated to the original,
|
|
37
|
+
unmodified handler so every other kernel-start path stays untouched.
|
|
38
|
+
"""
|
|
39
|
+
from jupyter_server.services.kernels.handlers import MainKernelHandler
|
|
40
|
+
from jupyter_server.utils import url_path_join
|
|
41
|
+
from jupyter_core.utils import ensure_async
|
|
42
|
+
from tornado import web
|
|
43
|
+
|
|
44
|
+
original_post = MainKernelHandler.post
|
|
45
|
+
|
|
46
|
+
async def _patched_post(self):
|
|
47
|
+
model = self.get_json_body()
|
|
48
|
+
|
|
49
|
+
if not model or "env" not in model:
|
|
50
|
+
return await original_post(self)
|
|
51
|
+
|
|
52
|
+
km = self.kernel_manager
|
|
53
|
+
model.setdefault("name", km.default_kernel_name)
|
|
54
|
+
|
|
55
|
+
env = model["env"]
|
|
56
|
+
self.log.info(
|
|
57
|
+
"kernel_checkpoint: starting kernel with env keys: %s",
|
|
58
|
+
list(env.keys()),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
kernel_id = await ensure_async(
|
|
63
|
+
km.start_kernel(
|
|
64
|
+
path=model.get("path"),
|
|
65
|
+
kernel_name=model["name"],
|
|
66
|
+
env=env,
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
result = await ensure_async(km.kernel_model(kernel_id))
|
|
70
|
+
location = url_path_join(
|
|
71
|
+
self.base_url, "api", "kernels", str(kernel_id)
|
|
72
|
+
)
|
|
73
|
+
self.set_header("Location", location)
|
|
74
|
+
self.set_status(201)
|
|
75
|
+
self.finish(result)
|
|
76
|
+
except Exception as e:
|
|
77
|
+
self.log.error(
|
|
78
|
+
"kernel_checkpoint: env-passthrough kernel start failed: %s", e
|
|
79
|
+
)
|
|
80
|
+
raise web.HTTPError(500, str(e))
|
|
81
|
+
|
|
82
|
+
MainKernelHandler.post = _patched_post
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
server_app.config.GatewayClient.client_envs = [
|
|
86
|
+
"KERNEL_CHECKPOINT_NAME",
|
|
87
|
+
"KERNEL_CHECKPOINT_FILE_PATH",
|
|
88
|
+
]
|
|
89
|
+
except Exception:
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
server_app.log.info(
|
|
93
|
+
"kernel_checkpoint: patched MainKernelHandler.post for env passthrough"
|
|
94
|
+
)
|
|
@@ -75,7 +75,7 @@ class CheckpointListCreateHandler(APIHandler):
|
|
|
75
75
|
|
|
76
76
|
|
|
77
77
|
class CheckpointDetailHandler(APIHandler):
|
|
78
|
-
"""Handles get / delete /
|
|
78
|
+
"""Handles get / delete / put for a single checkpoint."""
|
|
79
79
|
|
|
80
80
|
@web.authenticated
|
|
81
81
|
async def get(self, namespace, name):
|
|
@@ -113,7 +113,7 @@ class CheckpointDetailHandler(APIHandler):
|
|
|
113
113
|
raise web.HTTPError(502, f"Failed to reach checkpoint API: {e}")
|
|
114
114
|
|
|
115
115
|
@web.authenticated
|
|
116
|
-
async def
|
|
116
|
+
async def put(self, namespace, name):
|
|
117
117
|
api_url = _get_api_url()
|
|
118
118
|
if not api_url:
|
|
119
119
|
raise web.HTTPError(500, "CHECKPOINT_API_URL not configured")
|
|
@@ -123,7 +123,7 @@ class CheckpointDetailHandler(APIHandler):
|
|
|
123
123
|
url = f"{api_url}/api/v1/checkpoints/{namespace}/{name}"
|
|
124
124
|
req = httpclient.HTTPRequest(
|
|
125
125
|
url=url,
|
|
126
|
-
method="
|
|
126
|
+
method="PUT",
|
|
127
127
|
headers={"Content-Type": "application/json"},
|
|
128
128
|
body=json.dumps(body),
|
|
129
129
|
)
|
{kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/package.json
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kernel-checkpoint",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "An extension for saving and restoring kernel pod state with jupyter enterprise gateway",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyter",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
},
|
|
115
115
|
"outputDir": "kernel_checkpoint/labextension",
|
|
116
116
|
"_build": {
|
|
117
|
-
"load": "static/remoteEntry.
|
|
117
|
+
"load": "static/remoteEntry.ff55aa1cac6b05f762e9.js",
|
|
118
118
|
"extension": "./extension",
|
|
119
119
|
"style": "./style"
|
|
120
120
|
}
|
|
@@ -231,12 +231,17 @@ function CheckpointPanel(props) {
|
|
|
231
231
|
}
|
|
232
232
|
};
|
|
233
233
|
const handleRestore = async (checkpointName) => {
|
|
234
|
-
var _a;
|
|
234
|
+
var _a, _b, _c, _d;
|
|
235
235
|
setConfirmRestore(null);
|
|
236
236
|
setRestoring(checkpointName);
|
|
237
237
|
setFlash(null);
|
|
238
238
|
try {
|
|
239
|
-
await
|
|
239
|
+
const detail = await _api__WEBPACK_IMPORTED_MODULE_1__.CheckpointAPI.getCheckpoint(namespace, checkpointName);
|
|
240
|
+
const filePath = (_c = (_b = (_a = detail.checkpointFiles) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.filePath) !== null && _c !== void 0 ? _c : '';
|
|
241
|
+
if (!filePath) {
|
|
242
|
+
throw new Error('No checkpoint file path available for this checkpoint');
|
|
243
|
+
}
|
|
244
|
+
await onRestore(checkpointName, filePath);
|
|
240
245
|
setFlash({
|
|
241
246
|
type: 'success',
|
|
242
247
|
text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
|
|
@@ -245,7 +250,7 @@ function CheckpointPanel(props) {
|
|
|
245
250
|
catch (err) {
|
|
246
251
|
setFlash({
|
|
247
252
|
type: 'error',
|
|
248
|
-
text: (
|
|
253
|
+
text: (_d = err.message) !== null && _d !== void 0 ? _d : 'Failed to restore checkpoint'
|
|
249
254
|
});
|
|
250
255
|
}
|
|
251
256
|
finally {
|
|
@@ -446,7 +451,7 @@ const plugin = {
|
|
|
446
451
|
}
|
|
447
452
|
const kernelId = kernel.id;
|
|
448
453
|
const kernelSpecName = kernel.name || 'python_kubernetes';
|
|
449
|
-
const onRestore = async (checkpointName) => {
|
|
454
|
+
const onRestore = async (checkpointName, checkpointFilePath) => {
|
|
450
455
|
const settings = _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeSettings();
|
|
451
456
|
const kernelUrl = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.URLExt.join(settings.baseUrl, 'api', 'kernels');
|
|
452
457
|
const response = await _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeRequest(kernelUrl, {
|
|
@@ -455,7 +460,8 @@ const plugin = {
|
|
|
455
460
|
body: JSON.stringify({
|
|
456
461
|
name: kernelSpecName,
|
|
457
462
|
env: {
|
|
458
|
-
KERNEL_CHECKPOINT_NAME: checkpointName
|
|
463
|
+
KERNEL_CHECKPOINT_NAME: checkpointName,
|
|
464
|
+
KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath
|
|
459
465
|
}
|
|
460
466
|
})
|
|
461
467
|
}, settings);
|
|
@@ -499,4 +505,4 @@ const plugin = {
|
|
|
499
505
|
/***/ }
|
|
500
506
|
|
|
501
507
|
}]);
|
|
502
|
-
//# sourceMappingURL=lib_index_js.
|
|
508
|
+
//# sourceMappingURL=lib_index_js.bcb2d92b281a36765a67.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib_index_js.bcb2d92b281a36765a67.js","mappings":"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","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);\n const filePath = detail.checkpointFiles?.[0]?.filePath ?? '';\n if (!filePath) {\n throw new Error('No checkpoint file path available for this checkpoint');\n }\n await onRestore(checkpointName, filePath);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n ×\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click “Save Kernel State” to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n\n const onRestore = async (checkpointName: string, checkpointFilePath: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName,\n KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
|
|
@@ -130,7 +130,7 @@ __webpack_require__.d(exports, {
|
|
|
130
130
|
/******/ // This function allow to reference async chunks
|
|
131
131
|
/******/ __webpack_require__.u = (chunkId) => {
|
|
132
132
|
/******/ // return url for filenames based on template
|
|
133
|
-
/******/ return "" + chunkId + "." + {"lib_index_js":"
|
|
133
|
+
/******/ return "" + chunkId + "." + {"lib_index_js":"bcb2d92b281a36765a67","style_index_js":"c3e72438ed03e9dee0fc"}[chunkId] + ".js";
|
|
134
134
|
/******/ };
|
|
135
135
|
/******/ })();
|
|
136
136
|
/******/
|
|
@@ -248,7 +248,7 @@ __webpack_require__.d(exports, {
|
|
|
248
248
|
/******/ var promises = [];
|
|
249
249
|
/******/ switch(name) {
|
|
250
250
|
/******/ case "default": {
|
|
251
|
-
/******/ register("kernel-checkpoint", "0.1.
|
|
251
|
+
/******/ register("kernel-checkpoint", "0.1.2", () => (__webpack_require__.e("lib_index_js").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ "./lib/index.js"))))));
|
|
252
252
|
/******/ }
|
|
253
253
|
/******/ break;
|
|
254
254
|
/******/ }
|
|
@@ -559,4 +559,4 @@ __webpack_require__.d(exports, {
|
|
|
559
559
|
/******/
|
|
560
560
|
/******/ })()
|
|
561
561
|
;
|
|
562
|
-
//# sourceMappingURL=remoteEntry.
|
|
562
|
+
//# sourceMappingURL=remoteEntry.ff55aa1cac6b05f762e9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteEntry.0ec66dead21656df694e.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"2c713e3ab2e5b31ee0e1\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.1\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"remoteEntry.ff55aa1cac6b05f762e9.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"bcb2d92b281a36765a67\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.2\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
|
|
@@ -143,7 +143,12 @@ export function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {
|
|
|
143
143
|
setRestoring(checkpointName);
|
|
144
144
|
setFlash(null);
|
|
145
145
|
try {
|
|
146
|
-
await
|
|
146
|
+
const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);
|
|
147
|
+
const filePath = detail.checkpointFiles?.[0]?.filePath ?? '';
|
|
148
|
+
if (!filePath) {
|
|
149
|
+
throw new Error('No checkpoint file path available for this checkpoint');
|
|
150
|
+
}
|
|
151
|
+
await onRestore(checkpointName, filePath);
|
|
147
152
|
setFlash({
|
|
148
153
|
type: 'success',
|
|
149
154
|
text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
|
|
@@ -92,7 +92,7 @@ const plugin: JupyterFrontEndPlugin<void> = {
|
|
|
92
92
|
const kernelId = kernel.id;
|
|
93
93
|
const kernelSpecName = kernel.name || 'python_kubernetes';
|
|
94
94
|
|
|
95
|
-
const onRestore = async (checkpointName: string): Promise<void> => {
|
|
95
|
+
const onRestore = async (checkpointName: string, checkpointFilePath: string): Promise<void> => {
|
|
96
96
|
const settings = ServerConnection.makeSettings();
|
|
97
97
|
const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');
|
|
98
98
|
|
|
@@ -104,7 +104,8 @@ const plugin: JupyterFrontEndPlugin<void> = {
|
|
|
104
104
|
body: JSON.stringify({
|
|
105
105
|
name: kernelSpecName,
|
|
106
106
|
env: {
|
|
107
|
-
KERNEL_CHECKPOINT_NAME: checkpointName
|
|
107
|
+
KERNEL_CHECKPOINT_NAME: checkpointName,
|
|
108
|
+
KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath
|
|
108
109
|
}
|
|
109
110
|
})
|
|
110
111
|
},
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
try:
|
|
2
|
-
from ._version import __version__
|
|
3
|
-
except ImportError:
|
|
4
|
-
import warnings
|
|
5
|
-
warnings.warn("Importing 'kernel_checkpoint' outside a proper installation.")
|
|
6
|
-
__version__ = "dev"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def _jupyter_labextension_paths():
|
|
10
|
-
return [{
|
|
11
|
-
"src": "labextension",
|
|
12
|
-
"dest": "kernel-checkpoint"
|
|
13
|
-
}]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _jupyter_server_extension_points():
|
|
17
|
-
return [{"module": "kernel_checkpoint"}]
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _load_jupyter_server_extension(server_app):
|
|
21
|
-
from .handlers import setup_handlers
|
|
22
|
-
setup_handlers(server_app.web_app)
|
|
23
|
-
server_app.log.info("kernel_checkpoint server extension loaded")
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lib_index_js.2c713e3ab2e5b31ee0e1.js","mappings":"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","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n await onRestore(checkpointName);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n ×\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click “Save Kernel State” to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n\n const onRestore = async (checkpointName: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/cursor_jupyterlab_extension_for_checkpo.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/kernel_checkpoint/labextension/static/style.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.3}/ui-tests/tests/kernel_checkpoint.spec.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|