@eclipse-docks/extension-notebook 0.7.118 → 0.7.124

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from './notebook-types';
2
2
  export * from './notebook-kernel-api';
3
+ export { buildDefaultNotebook } from './notebook-default-content';
4
+ export { applyKernelToNotebookMetadata, resolveKernelIdFromNotebookMetadata, } from './notebook-metadata';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EACH,6BAA6B,EAC7B,mCAAmC,GACtC,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as isNotebookEditorLike } from "./notebook-types-6XV6fOSV.js";
2
- import { t as TARGET_NOTEBOOK_KERNELS } from "./notebook-kernel-api-c9l3_84P.js";
1
+ import { n as isNotebookEditorLike, t as buildDefaultNotebook } from "./notebook-default-content-DJ5hLVkJ.js";
2
+ import { n as resolveKernelIdFromNotebookMetadata, r as TARGET_NOTEBOOK_KERNELS, t as applyKernelToNotebookMetadata } from "./notebook-metadata-Bh2hG7NA.js";
3
3
  import { extensionRegistry, i18n } from "@eclipse-docks/core";
4
4
  import pkg from "../package.json";
5
5
  //#region src/index.ts
@@ -11,11 +11,11 @@ extensionRegistry.registerExtension({
11
11
  id: pkg.name,
12
12
  name: t.EXT_NOTEBOOK_NAME,
13
13
  description: t.EXT_NOTEBOOK_DESC,
14
- loader: () => import("./notebook-extension-x1uUUi5p.js"),
14
+ loader: () => import("./notebook-extension-DwUfyYs-.js"),
15
15
  icon: "docks jupyter",
16
16
  dependencies: []
17
17
  });
18
18
  //#endregion
19
- export { TARGET_NOTEBOOK_KERNELS, isNotebookEditorLike };
19
+ export { TARGET_NOTEBOOK_KERNELS, applyKernelToNotebookMetadata, buildDefaultNotebook, isNotebookEditorLike, resolveKernelIdFromNotebookMetadata };
20
20
 
21
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './notebook-types';\nexport * from './notebook-kernel-api';\nimport { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_NOTEBOOK_NAME,\n description: t.EXT_NOTEBOOK_DESC,\n loader: () => import(\"./notebook-extension\"),\n icon: \"docks jupyter\",\n dependencies: [],\n});\n"],"mappings":";;;;;AAKA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CACN,cAAc,EAAA;CACf,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './notebook-types';\nexport * from './notebook-kernel-api';\nexport { buildDefaultNotebook } from './notebook-default-content';\nexport {\n applyKernelToNotebookMetadata,\n resolveKernelIdFromNotebookMetadata,\n} from './notebook-metadata';\nimport { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_NOTEBOOK_NAME,\n description: t.EXT_NOTEBOOK_DESC,\n loader: () => import(\"./notebook-extension\"),\n icon: \"docks jupyter\",\n dependencies: [],\n});\n"],"mappings":";;;;;AAUA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CACN,cAAc,EAAA;CACf,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { t as applyKernelToNotebookMetadata } from "./notebook-metadata-Bh2hG7NA.js";
2
+ //#region src/notebook-types.ts
3
+ function isNotebookEditorLike(value) {
4
+ return Boolean(value && typeof value.executeCell === "function" && typeof value.focusedCellIndex === "number");
5
+ }
6
+ //#endregion
7
+ //#region src/notebook-default-content.ts
8
+ function starterCodeForKernel(kernel) {
9
+ switch (kernel.language) {
10
+ case "python": return ["print(\"Hello, World!\")\n"];
11
+ case "javascript": return ["return \"Hello, World!\""];
12
+ case "sql": return [`SELECT '${kernel.label}' AS engine;\n`];
13
+ default: return [`# ${kernel.label}\n`];
14
+ }
15
+ }
16
+ function buildDefaultNotebook(kernel) {
17
+ return {
18
+ cells: [{
19
+ cell_type: "markdown",
20
+ source: [
21
+ "# Notebook\n",
22
+ "\n",
23
+ "Press **Run** in the code cell below to execute it.\n"
24
+ ],
25
+ metadata: {}
26
+ }, {
27
+ cell_type: "code",
28
+ source: starterCodeForKernel(kernel),
29
+ execution_count: null,
30
+ outputs: [],
31
+ metadata: {}
32
+ }],
33
+ metadata: applyKernelToNotebookMetadata(void 0, kernel),
34
+ nbformat: 4,
35
+ nbformat_minor: 4
36
+ };
37
+ }
38
+ //#endregion
39
+ export { isNotebookEditorLike as n, buildDefaultNotebook as t };
40
+
41
+ //# sourceMappingURL=notebook-default-content-DJ5hLVkJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-default-content-DJ5hLVkJ.js","names":[],"sources":["../src/notebook-types.ts","../src/notebook-default-content.ts"],"sourcesContent":["export interface NotebookCell {\n cell_type: 'code' | 'markdown' | 'raw';\n source: string | string[];\n outputs?: any[];\n execution_count?: number | null;\n metadata?: any;\n}\n\nexport interface NotebookData {\n cells: NotebookCell[];\n metadata?: {\n language_info?: {\n name?: string;\n [key: string]: unknown;\n };\n kernelspec?: {\n name?: string;\n language?: string;\n display_name?: string;\n [key: string]: unknown;\n };\n /** @deprecated Legacy field; use language_info.name instead */\n kernel?: string;\n required_packages?: string[];\n [key: string]: unknown;\n };\n nbformat?: number;\n nbformat_minor?: number;\n}\n\nexport interface NotebookEditorLike {\n notebook?: NotebookData;\n focusedCellIndex: number;\n executeCell(index: number): Promise<void>;\n}\n\nexport function isNotebookEditorLike(value: unknown): value is NotebookEditorLike {\n return Boolean(\n value &&\n typeof (value as NotebookEditorLike).executeCell === 'function' &&\n typeof (value as NotebookEditorLike).focusedCellIndex === 'number'\n );\n}\n\n\n","import { applyKernelToNotebookMetadata } from './notebook-metadata';\nimport type { NotebookKernelDescriptor } from './notebook-kernel-api';\nimport type { NotebookData } from './notebook-types';\n\nfunction starterCodeForKernel(kernel: NotebookKernelDescriptor): string[] {\n switch (kernel.language) {\n case 'python':\n return ['print(\"Hello, World!\")\\n'];\n case 'javascript':\n return ['return \"Hello, World!\"'];\n case 'sql':\n return [`SELECT '${kernel.label}' AS engine;\\n`];\n default:\n return [`# ${kernel.label}\\n`];\n }\n}\n\nexport function buildDefaultNotebook(kernel: NotebookKernelDescriptor): NotebookData {\n return {\n cells: [\n {\n cell_type: 'markdown',\n source: [\n '# Notebook\\n',\n '\\n',\n 'Press **Run** in the code cell below to execute it.\\n',\n ],\n metadata: {},\n },\n {\n cell_type: 'code',\n source: starterCodeForKernel(kernel),\n execution_count: null,\n outputs: [],\n metadata: {},\n },\n ],\n metadata: applyKernelToNotebookMetadata(undefined, kernel),\n nbformat: 4,\n nbformat_minor: 4,\n };\n}\n"],"mappings":";;AAoCA,SAAgB,qBAAqB,OAA6C;AAC9E,QAAO,QACH,SACA,OAAQ,MAA6B,gBAAgB,cACrD,OAAQ,MAA6B,qBAAqB,SAC7D;;;;ACrCL,SAAS,qBAAqB,QAA4C;AACtE,SAAQ,OAAO,UAAf;EACI,KAAK,SACD,QAAO,CAAC,6BAA2B;EACvC,KAAK,aACD,QAAO,CAAC,2BAAyB;EACrC,KAAK,MACD,QAAO,CAAC,WAAW,OAAO,MAAM,gBAAgB;EACpD,QACI,QAAO,CAAC,KAAK,OAAO,MAAM,IAAI;;;AAI1C,SAAgB,qBAAqB,QAAgD;AACjF,QAAO;EACH,OAAO,CACH;GACI,WAAW;GACX,QAAQ;IACJ;IACA;IACA;IACH;GACD,UAAU,EAAE;GACf,EACD;GACI,WAAW;GACX,QAAQ,qBAAqB,OAAO;GACpC,iBAAiB;GACjB,SAAS,EAAE;GACX,UAAU,EAAE;GACf,CACJ;EACD,UAAU,8BAA8B,KAAA,GAAW,OAAO;EAC1D,UAAU;EACV,gBAAgB;EACnB"}
@@ -0,0 +1,4 @@
1
+ import { NotebookKernelDescriptor } from './notebook-kernel-api';
2
+ import { NotebookData } from './notebook-types';
3
+ export declare function buildDefaultNotebook(kernel: NotebookKernelDescriptor): NotebookData;
4
+ //# sourceMappingURL=notebook-default-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-default-content.d.ts","sourceRoot":"","sources":["../src/notebook-default-content.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAerD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,GAAG,YAAY,CAwBnF"}
@@ -1,6 +1,6 @@
1
- import { t as isNotebookEditorLike } from "./notebook-types-6XV6fOSV.js";
2
- import { t as TARGET_NOTEBOOK_KERNELS } from "./notebook-kernel-api-c9l3_84P.js";
3
- import { File, activeEditorSignal, createJsRuntime } from "@eclipse-docks/core";
1
+ import { n as isNotebookEditorLike, t as buildDefaultNotebook } from "./notebook-default-content-DJ5hLVkJ.js";
2
+ import { r as TARGET_NOTEBOOK_KERNELS } from "./notebook-metadata-Bh2hG7NA.js";
3
+ import { File, activeEditorSignal, commandRegistry, contributionRegistry, createJsRuntime, registerAll } from "@eclipse-docks/core";
4
4
  import { html } from "lit";
5
5
  import { registerCatalog } from "@eclipse-docks/extension-catalog/api";
6
6
  //#region src/notebook-catalog.ts
@@ -17,7 +17,7 @@ var NOTEBOOK_CATALOG = {
17
17
  label: "JavaScript basics",
18
18
  icon: "docks jupyter",
19
19
  state: {
20
- url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJtZXRhZGF0YSI6IHt9LAogICAgICAic291cmNlIjogWwogICAgICAgICIjIEphdmFTY3JpcHQga2VybmVsXG4iLAogICAgICAgICJcbiIsCiAgICAgICAgIlJ1biBjb2RlIGNlbGxzIHdpdGggdGhlICoqSmF2YVNjcmlwdCoqIGtlcm5lbC4gRWFjaCBjZWxsIHJ1bnMgaW4gYSBzaGFyZWQgcnVudGltZS4iCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAgICAibWV0YWRhdGEiOiB7fSwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgInNvdXJjZSI6IFsKICAgICAgICAiY29uc3QgeCA9IDEgKyAyO1xuIiwKICAgICAgICAicmV0dXJuIHg7IgogICAgICBdCiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm1ldGFkYXRhIjoge30sCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJzb3VyY2UiOiBbCiAgICAgICAgImNvbnN0IGl0ZW1zID0gWydEdWNrREInLCAnUEdsaXRlJywgJ05vdGVib29rcyddO1xuIiwKICAgICAgICAicmV0dXJuIGl0ZW1zLmpvaW4oJywgJyk7IgogICAgICBdCiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm1ldGFkYXRhIjoge30sCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJzb3VyY2UiOiBbCiAgICAgICAgImNvbnN0IGZpYiA9IChuKSA9PiBuIDw9IDEgPyBuIDogZmliKG4gLSAxKSArIGZpYihuIC0gMik7XG4iLAogICAgICAgICJyZXR1cm4gZmliKDEwKTsiCiAgICAgIF0KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsKICAgICJrZXJuZWwiOiAiamF2YXNjcmlwdCIsCiAgICAibGFuZ3VhZ2VfaW5mbyI6IHsKICAgICAgIm5hbWUiOiAicHl0aG9uIgogICAgfQogIH0sCiAgIm5iZm9ybWF0IjogNCwKICAibmJmb3JtYXRfbWlub3IiOiA0Cn0K", "" + import.meta.url).href,
20
+ url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJtZXRhZGF0YSI6IHt9LAogICAgICAic291cmNlIjogWwogICAgICAgICIjIEphdmFTY3JpcHQga2VybmVsXG4iLAogICAgICAgICJcbiIsCiAgICAgICAgIlJ1biBjb2RlIGNlbGxzIHdpdGggdGhlICoqSmF2YVNjcmlwdCoqIGtlcm5lbC4gRWFjaCBjZWxsIHJ1bnMgaW4gYSBzaGFyZWQgcnVudGltZS4iCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAgICAibWV0YWRhdGEiOiB7fSwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgInNvdXJjZSI6IFsKICAgICAgICAiY29uc3QgeCA9IDEgKyAyO1xuIiwKICAgICAgICAicmV0dXJuIHg7IgogICAgICBdCiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm1ldGFkYXRhIjoge30sCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJzb3VyY2UiOiBbCiAgICAgICAgImNvbnN0IGl0ZW1zID0gWydEdWNrREInLCAnUEdsaXRlJywgJ05vdGVib29rcyddO1xuIiwKICAgICAgICAicmV0dXJuIGl0ZW1zLmpvaW4oJywgJyk7IgogICAgICBdCiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm1ldGFkYXRhIjoge30sCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJzb3VyY2UiOiBbCiAgICAgICAgImNvbnN0IGZpYiA9IChuKSA9PiBuIDw9IDEgPyBuIDogZmliKG4gLSAxKSArIGZpYihuIC0gMik7XG4iLAogICAgICAgICJyZXR1cm4gZmliKDEwKTsiCiAgICAgIF0KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsKICAgICJsYW5ndWFnZV9pbmZvIjogewogICAgICAibmFtZSI6ICJqYXZhc2NyaXB0IgogICAgfSwKICAgICJrZXJuZWxzcGVjIjogewogICAgICAibmFtZSI6ICJqYXZhc2NyaXB0IiwKICAgICAgImxhbmd1YWdlIjogImphdmFzY3JpcHQiLAogICAgICAiZGlzcGxheV9uYW1lIjogIkphdmFTY3JpcHQiCiAgICB9CiAgfSwKICAibmJmb3JtYXQiOiA0LAogICJuYmZvcm1hdF9taW5vciI6IDQKfQ==", "" + import.meta.url).href,
21
21
  filename: "javascript-basics.ipynb"
22
22
  }
23
23
  }]
@@ -30,7 +30,7 @@ var NOTEBOOK_CATALOG = {
30
30
  label: "DuckDB in notebooks",
31
31
  icon: "docks jupyter",
32
32
  state: {
33
- url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJzb3VyY2UiOiBbIiMgRHVja0RCIGluIG5vdGVib29rc1xuXG5Vc2UgdGhlICoqRHVja0RCKioga2VybmVsIHRvIHJ1biBTUUwgaW4gY2VsbHMuIFJlc3VsdHMgYXJlIHNob3duIGFzIHRleHQuIl0sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgJ0R1Y2tEQicgQVMgZW5naW5lLCB2ZXJzaW9uKCkgQVMgdjsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJDUkVBVEUgT1IgUkVQTEFDRSBURU1QIFRBQkxFIHQgKGlkIElOVCwgbmFtZSBWQVJDSEFSKTtcbklOU0VSVCBJTlRPIHQgVkFMVUVTICgxLCAnYScpLCAoMiwgJ2InKSwgKDMsICdjJyk7XG5TRUxFQ1QgKiBGUk9NIHQ7Il0sCiAgICAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAgICAib3V0cHV0cyI6IFtdLAogICAgICAibWV0YWRhdGEiOiB7fQogICAgfSwKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgICAgInNvdXJjZSI6IFsiU0VMRUNUIG5hbWUsIGlkICogMTAgQVMgc2NhbGVkIEZST00gdCBPUkRFUiBCWSBpZCBERVNDOyJdLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgIm1ldGFkYXRhIjoge30KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsgImtlcm5lbCI6ICJkdWNrZGIiIH0sCiAgIm5iZm9ybWF0IjogNCwKICAibmJmb3JtYXRfbWlub3IiOiA0Cn0K", "" + import.meta.url).href,
33
+ url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJzb3VyY2UiOiBbIiMgRHVja0RCIGluIG5vdGVib29rc1xuXG5Vc2UgdGhlICoqRHVja0RCKioga2VybmVsIHRvIHJ1biBTUUwgaW4gY2VsbHMuIFJlc3VsdHMgYXJlIHNob3duIGFzIHRleHQuIl0sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgJ0R1Y2tEQicgQVMgZW5naW5lLCB2ZXJzaW9uKCkgQVMgdjsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJDUkVBVEUgT1IgUkVQTEFDRSBURU1QIFRBQkxFIHQgKGlkIElOVCwgbmFtZSBWQVJDSEFSKTtcbklOU0VSVCBJTlRPIHQgVkFMVUVTICgxLCAnYScpLCAoMiwgJ2InKSwgKDMsICdjJyk7XG5TRUxFQ1QgKiBGUk9NIHQ7Il0sCiAgICAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAgICAib3V0cHV0cyI6IFtdLAogICAgICAibWV0YWRhdGEiOiB7fQogICAgfSwKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgICAgInNvdXJjZSI6IFsiU0VMRUNUIG5hbWUsIGlkICogMTAgQVMgc2NhbGVkIEZST00gdCBPUkRFUiBCWSBpZCBERVNDOyJdLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgIm1ldGFkYXRhIjoge30KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsKICAgICJsYW5ndWFnZV9pbmZvIjogeyAibmFtZSI6ICJzcWwiIH0sCiAgICAia2VybmVsc3BlYyI6IHsgIm5hbWUiOiAiZHVja2RiIiwgImxhbmd1YWdlIjogInNxbCIsICJkaXNwbGF5X25hbWUiOiAiRHVja0RCIiB9CiAgfSwKICAibmJmb3JtYXQiOiA0LAogICJuYmZvcm1hdF9taW5vciI6IDQKfQo=", "" + import.meta.url).href,
34
34
  filename: "duckdb-sample.ipynb"
35
35
  }
36
36
  }]
@@ -43,7 +43,7 @@ var NOTEBOOK_CATALOG = {
43
43
  label: "PostgreSQL in notebooks",
44
44
  icon: "docks jupyter",
45
45
  state: {
46
- url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJzb3VyY2UiOiBbIiMgUG9zdGdyZVNRTCAoUEdsaXRlKSBpbiBub3RlYm9va3NcblxuVXNlIHRoZSAqKlBHbGl0ZSoqIGtlcm5lbCB0byBydW4gUG9zdGdyZVNRTCBTUUwgaW4gdGhlIGJyb3dzZXIuIl0sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgJ1BHbGl0ZScgQVMgZW5naW5lLCB2ZXJzaW9uKCkgQVMgdjsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkZW1vIChpZCBTRVJJQUwgUFJJTUFSWSBLRVksIGxhYmVsIFRFWFQpO1xuSU5TRVJUIElOVE8gZGVtbyAobGFiZWwpIFZBTFVFUyAoJ2ZpcnN0JyksICgnc2Vjb25kJyksICgndGhpcmQnKTtcblNFTEVDVCAqIEZST00gZGVtbzsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgbGFiZWwsIGlkICogMiBBUyBkb3VibGVfaWQgRlJPTSBkZW1vIE9SREVSIEJZIGlkOyJdLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgIm1ldGFkYXRhIjoge30KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsgImtlcm5lbCI6ICJwZ2xpdGUiIH0sCiAgIm5iZm9ybWF0IjogNCwKICAibmJmb3JtYXRfbWlub3IiOiA0Cn0K", "" + import.meta.url).href,
46
+ url: new URL("data:application/octet-stream;base64,ewogICJjZWxscyI6IFsKICAgIHsKICAgICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICAgICJzb3VyY2UiOiBbIiMgUG9zdGdyZVNRTCAoUEdsaXRlKSBpbiBub3RlYm9va3NcblxuVXNlIHRoZSAqKlBHbGl0ZSoqIGtlcm5lbCB0byBydW4gUG9zdGdyZVNRTCBTUUwgaW4gdGhlIGJyb3dzZXIuIl0sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgJ1BHbGl0ZScgQVMgZW5naW5lLCB2ZXJzaW9uKCkgQVMgdjsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkZW1vIChpZCBTRVJJQUwgUFJJTUFSWSBLRVksIGxhYmVsIFRFWFQpO1xuSU5TRVJUIElOVE8gZGVtbyAobGFiZWwpIFZBTFVFUyAoJ2ZpcnN0JyksICgnc2Vjb25kJyksICgndGhpcmQnKTtcblNFTEVDVCAqIEZST00gZGVtbzsiXSwKICAgICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICAgICJvdXRwdXRzIjogW10sCiAgICAgICJtZXRhZGF0YSI6IHt9CiAgICB9LAogICAgewogICAgICAiY2VsbF90eXBlIjogImNvZGUiLAogICAgICAic291cmNlIjogWyJTRUxFQ1QgbGFiZWwsIGlkICogMiBBUyBkb3VibGVfaWQgRlJPTSBkZW1vIE9SREVSIEJZIGlkOyJdLAogICAgICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgICAgIm91dHB1dHMiOiBbXSwKICAgICAgIm1ldGFkYXRhIjoge30KICAgIH0KICBdLAogICJtZXRhZGF0YSI6IHsKICAgICJsYW5ndWFnZV9pbmZvIjogeyAibmFtZSI6ICJzcWwiIH0sCiAgICAia2VybmVsc3BlYyI6IHsgIm5hbWUiOiAicGdsaXRlIiwgImxhbmd1YWdlIjogInNxbCIsICJkaXNwbGF5X25hbWUiOiAiUEdsaXRlIiB9CiAgfSwKICAibmJmb3JtYXQiOiA0LAogICJuYmZvcm1hdF9taW5vciI6IDQKfQo=", "" + import.meta.url).href,
47
47
  filename: "pglite-sample.ipynb"
48
48
  }
49
49
  }]
@@ -93,41 +93,90 @@ var javascriptKernelContribution = {
93
93
  };
94
94
  //#endregion
95
95
  //#region src/notebook-extension.ts
96
- var notebook_extension_default = ({ editorRegistry, commandRegistry, contributionRegistry }) => {
96
+ function resolveKernel(kernelId) {
97
+ const contributions = contributionRegistry.getContributions(TARGET_NOTEBOOK_KERNELS);
98
+ if (kernelId) return contributions.find((c) => c.id === kernelId) ?? javascriptKernelContribution;
99
+ return javascriptKernelContribution;
100
+ }
101
+ var notebook_extension_default = ({ editorRegistry }) => {
97
102
  registerNotebookCatalog();
98
103
  contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, javascriptKernelContribution);
99
- const INITIAL_NOTEBOOK_CONTENT = {
100
- cells: [{
101
- cell_type: "markdown",
102
- source: ["Press the **Run** button in the code cell below to execute it."],
103
- metadata: {}
104
- }, {
105
- cell_type: "code",
106
- source: ["return \"Hello, World!\""],
107
- execution_count: null,
108
- outputs: [],
109
- metadata: {}
110
- }],
111
- metadata: { kernel: "javascript" },
112
- nbformat: 4,
113
- nbformat_minor: 4
114
- };
115
- commandRegistry.registerHandler("notebook.runCell", {
116
- ranking: 10,
117
- canExecute: (context) => {
118
- const activeEditor = activeEditorSignal.get();
119
- if (isNotebookEditorLike(activeEditor)) {
120
- const cellIndex = context.params?.cellIndex;
121
- if (cellIndex !== void 0) return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);
122
- return activeEditor.focusedCellIndex >= 0;
104
+ registerAll({
105
+ command: {
106
+ id: "notebook.runCell",
107
+ name: "Run notebook cell",
108
+ description: "Executes the focused or specified code cell in the active notebook editor",
109
+ parameters: [{
110
+ name: "cellIndex",
111
+ description: "Zero-based index of the cell to run",
112
+ required: false
113
+ }]
114
+ },
115
+ handler: {
116
+ ranking: 10,
117
+ canExecute: (context) => {
118
+ const activeEditor = activeEditorSignal.get();
119
+ if (isNotebookEditorLike(activeEditor)) {
120
+ const cellIndex = context.params?.cellIndex;
121
+ if (cellIndex !== void 0) return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);
122
+ return activeEditor.focusedCellIndex >= 0;
123
+ }
124
+ return false;
125
+ },
126
+ execute: async (context) => {
127
+ const activeEditor = activeEditorSignal.get();
128
+ if (isNotebookEditorLike(activeEditor)) {
129
+ const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;
130
+ if (cellIndex >= 0) await activeEditor.executeCell(cellIndex);
131
+ }
123
132
  }
124
- return false;
133
+ }
134
+ });
135
+ registerAll({
136
+ command: {
137
+ id: "notebook.create",
138
+ name: "Create Jupyter Notebook",
139
+ description: "Creates a new .ipynb notebook with starter cells for the selected kernel",
140
+ parameters: [
141
+ {
142
+ name: "path",
143
+ description: "File path relative to the workspace",
144
+ required: false
145
+ },
146
+ {
147
+ name: "ask",
148
+ description: "Whether to prompt the user for the file path",
149
+ required: false
150
+ },
151
+ {
152
+ name: "kernel",
153
+ description: "Notebook kernel id (e.g. javascript, python)",
154
+ required: false
155
+ }
156
+ ],
157
+ output: [{
158
+ name: "path",
159
+ description: "Path of the created notebook"
160
+ }]
125
161
  },
126
- execute: async (context) => {
127
- const activeEditor = activeEditorSignal.get();
128
- if (isNotebookEditorLike(activeEditor)) {
129
- const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;
130
- if (cellIndex >= 0) await activeEditor.executeCell(cellIndex);
162
+ handler: { execute: async (context) => {
163
+ const kernel = resolveKernel(context.params?.kernel);
164
+ const contents = JSON.stringify(buildDefaultNotebook(kernel), null, 2);
165
+ return commandRegistry.execute("touch", commandRegistry.createExecutionContext({
166
+ path: context.params?.path ?? "notebook.ipynb",
167
+ extension: ".ipynb",
168
+ ask: context.params?.ask ?? true,
169
+ contents
170
+ }));
171
+ } },
172
+ contribution: {
173
+ target: "filebrowser.create",
174
+ name: "filebrowser.create.notebook",
175
+ label: "Jupyter Notebook",
176
+ icon: "docks jupyter",
177
+ params: {
178
+ path: "notebook.ipynb",
179
+ ask: true
131
180
  }
132
181
  }
133
182
  });
@@ -135,7 +184,7 @@ var notebook_extension_default = ({ editorRegistry, commandRegistry, contributio
135
184
  editorId: "system.notebooeditor",
136
185
  label: "Jupyter Notebook",
137
186
  icon: "docks jupyter",
138
- lazyInit: () => import("./notebook-runtime-CgQiGqsb.js"),
187
+ lazyInit: () => import("./notebook-runtime-DztsNceA.js"),
139
188
  canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".ipynb"),
140
189
  handle: async (input) => {
141
190
  const editorInput = {
@@ -151,19 +200,8 @@ var notebook_extension_default = ({ editorRegistry, commandRegistry, contributio
151
200
  },
152
201
  ranking: 100
153
202
  });
154
- contributionRegistry.registerContribution("filebrowser.create", {
155
- label: "Jupyter Notebook",
156
- icon: "docks jupyter",
157
- command: "touch",
158
- params: {
159
- path: "notebook.ipynb",
160
- extension: ".ipynb",
161
- ask: true,
162
- contents: JSON.stringify(INITIAL_NOTEBOOK_CONTENT, null, 2)
163
- }
164
- });
165
203
  };
166
204
  //#endregion
167
205
  export { notebook_extension_default as default };
168
206
 
169
- //# sourceMappingURL=notebook-extension-x1uUUi5p.js.map
207
+ //# sourceMappingURL=notebook-extension-DwUfyYs-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-extension-DwUfyYs-.js","names":[],"sources":["../src/notebook-catalog.ts","../src/javascript-kernel.ts","../src/notebook-extension.ts"],"sourcesContent":["import type { CatalogContribution } from \"@eclipse-docks/extension-catalog/api\";\nimport { registerCatalog } from \"@eclipse-docks/extension-catalog/api\";\n\nconst NOTEBOOK_CATALOG: CatalogContribution = {\n label: \"Notebooks\",\n icon: \"docks jupyter\",\n contributionId: \"catalog.notebooks\",\n items: [\n {\n label: \"JavaScript\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.javascript\",\n items: [\n { label: \"JavaScript basics\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/javascript-basics.ipynb\", import.meta.url).href, filename: \"javascript-basics.ipynb\" } },\n ],\n },\n {\n label: \"DuckDB\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.duckdb\",\n items: [\n { label: \"DuckDB in notebooks\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/duckdb-sample.ipynb\", import.meta.url).href, filename: \"duckdb-sample.ipynb\" } },\n ],\n },\n {\n label: \"PGlite\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.pglite\",\n items: [\n { label: \"PostgreSQL in notebooks\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/pglite-sample.ipynb\", import.meta.url).href, filename: \"pglite-sample.ipynb\" } },\n ],\n },\n ],\n};\n\nexport function registerNotebookCatalog(): void {\n registerCatalog(NOTEBOOK_CATALOG);\n}\n","import { createJsRuntime, type JsRuntime } from '@eclipse-docks/core';\nimport type { NotebookExecutionResult, NotebookKernel, NotebookKernelContribution } from './notebook-kernel-api';\n\nclass JavaScriptNotebookKernel implements NotebookKernel {\n readonly id = 'javascript';\n readonly label = 'JavaScript';\n readonly language = 'javascript';\n\n private runtime: JsRuntime | null = null;\n\n private getRuntime(): JsRuntime {\n if (!this.runtime) {\n this.runtime = createJsRuntime();\n }\n return this.runtime;\n }\n\n async getVersion(): Promise<string> {\n return 'JavaScript';\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const result = await this.getRuntime().execute(code);\n if (result === undefined || result === null) {\n return {};\n }\n return { data: String(result) };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n close(): void {\n if (this.runtime) {\n this.runtime.close();\n this.runtime = null;\n }\n }\n}\n\nexport const javascriptKernelContribution: NotebookKernelContribution = {\n id: 'javascript',\n label: 'JavaScript',\n language: 'javascript',\n loadKernel: async (): Promise<NotebookKernel> => new JavaScriptNotebookKernel(),\n};\n","import { html } from \"lit\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { File } from \"@eclipse-docks/core\";\nimport { activeEditorSignal } from \"@eclipse-docks/core\";\nimport type { ExecutionContext } from \"@eclipse-docks/core\";\nimport { registerAll, commandRegistry, contributionRegistry } from \"@eclipse-docks/core\";\nimport { registerNotebookCatalog } from \"./notebook-catalog\";\nimport { isNotebookEditorLike } from \"./notebook-types\";\nimport { TARGET_NOTEBOOK_KERNELS, type NotebookKernelContribution } from \"./notebook-kernel-api\";\nimport { javascriptKernelContribution } from \"./javascript-kernel\";\nimport { buildDefaultNotebook } from \"./notebook-default-content\";\n\nfunction resolveKernel(kernelId?: string) {\n const contributions = contributionRegistry.getContributions<NotebookKernelContribution>(TARGET_NOTEBOOK_KERNELS);\n if (kernelId) {\n return contributions.find((c) => c.id === kernelId) ?? javascriptKernelContribution;\n }\n return javascriptKernelContribution;\n}\n\nexport default ({ editorRegistry }: any) => {\n registerNotebookCatalog();\n contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, javascriptKernelContribution);\n\n registerAll({\n command: {\n id: \"notebook.runCell\",\n name: \"Run notebook cell\",\n description: \"Executes the focused or specified code cell in the active notebook editor\",\n parameters: [\n {\n name: \"cellIndex\",\n description: \"Zero-based index of the cell to run\",\n required: false,\n },\n ],\n },\n handler: {\n ranking: 10,\n canExecute: (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex;\n if (cellIndex !== undefined) {\n return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);\n }\n return activeEditor.focusedCellIndex >= 0;\n }\n return false;\n },\n execute: async (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;\n if (cellIndex >= 0) {\n await activeEditor.executeCell(cellIndex);\n }\n }\n },\n },\n });\n\n registerAll({\n command: {\n id: \"notebook.create\",\n name: \"Create Jupyter Notebook\",\n description: \"Creates a new .ipynb notebook with starter cells for the selected kernel\",\n parameters: [\n {\n name: \"path\",\n description: \"File path relative to the workspace\",\n required: false,\n },\n {\n name: \"ask\",\n description: \"Whether to prompt the user for the file path\",\n required: false,\n },\n {\n name: \"kernel\",\n description: \"Notebook kernel id (e.g. javascript, python)\",\n required: false,\n },\n ],\n output: [\n {\n name: \"path\",\n description: \"Path of the created notebook\",\n },\n ],\n },\n handler: {\n execute: async (context: ExecutionContext) => {\n const kernel = resolveKernel(context.params?.kernel);\n const contents = JSON.stringify(buildDefaultNotebook(kernel), null, 2);\n return commandRegistry.execute(\n \"touch\",\n commandRegistry.createExecutionContext({\n path: context.params?.path ?? \"notebook.ipynb\",\n extension: \".ipynb\",\n ask: context.params?.ask ?? true,\n contents,\n }),\n );\n },\n },\n contribution: {\n target: \"filebrowser.create\",\n name: \"filebrowser.create.notebook\",\n label: \"Jupyter Notebook\",\n icon: \"docks jupyter\",\n params: {\n path: \"notebook.ipynb\",\n ask: true,\n },\n },\n });\n\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.notebooeditor\",\n label: \"Jupyter Notebook\",\n icon: \"docks jupyter\",\n lazyInit: () => import('./notebook-runtime'),\n canHandle: (input: any) => input instanceof File && input.getName().toLowerCase().endsWith(\".ipynb\"),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n } as EditorInput;\n editorInput.component = (id: string) => html`\n <docks-notebook-editor id=\"${id}\" .input=${editorInput}></docks-notebook-editor>`;\n return editorInput;\n },\n ranking: 100,\n });\n};\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- declare const _default: ({ editorRegistry, commandRegistry, contributionRegistry }: any) => void;
1
+ declare const _default: ({ editorRegistry }: any) => void;
2
2
  export default _default;
3
3
  //# sourceMappingURL=notebook-extension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-extension.d.ts","sourceRoot":"","sources":["../src/notebook-extension.ts"],"names":[],"mappings":"yBAUgB,2DAA2D,GAAG;AAA9E,wBA+EE"}
1
+ {"version":3,"file":"notebook-extension.d.ts","sourceRoot":"","sources":["../src/notebook-extension.ts"],"names":[],"mappings":"yBAoBgB,oBAAoB,GAAG;AAAvC,wBAsHE"}
@@ -24,11 +24,13 @@ export interface NotebookKernel {
24
24
  }): void;
25
25
  close?(): void | Promise<void>;
26
26
  }
27
- export interface NotebookKernelContribution {
27
+ export interface NotebookKernelDescriptor {
28
28
  id: string;
29
29
  label: string;
30
- icon?: string;
31
30
  language: string;
31
+ }
32
+ export interface NotebookKernelContribution extends NotebookKernelDescriptor {
33
+ icon?: string;
32
34
  loadKernel(): Promise<NotebookKernel>;
33
35
  }
34
36
  //# sourceMappingURL=notebook-kernel-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-kernel-api.d.ts","sourceRoot":"","sources":["../src/notebook-kernel-api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,IAAI,IAAI,CAAC;IACnB,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,kBAAkB,CAAC,CACjB,OAAO,CAAC,EAAE;QACR,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC1C,GACA,IAAI,CAAC;IACR,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CACvC"}
1
+ {"version":3,"file":"notebook-kernel-api.d.ts","sourceRoot":"","sources":["../src/notebook-kernel-api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,IAAI,IAAI,CAAC;IACnB,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,kBAAkB,CAAC,CACjB,OAAO,CAAC,EAAE;QACR,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC1C,GACA,IAAI,CAAC;IACR,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CACvC"}
@@ -0,0 +1,46 @@
1
+ //#region src/notebook-kernel-api.ts
2
+ var TARGET_NOTEBOOK_KERNELS = "system.notebookkernels";
3
+ //#endregion
4
+ //#region src/notebook-metadata.ts
5
+ function resolveKernelIdFromNotebookMetadata(metadata, contributions) {
6
+ if (!contributions.length) return null;
7
+ const languageName = metadata?.language_info?.name;
8
+ if (typeof languageName === "string" && languageName.length > 0) {
9
+ const byId = contributions.find((c) => c.id === languageName);
10
+ if (byId) return byId.id;
11
+ }
12
+ const kernelspecName = metadata?.kernelspec?.name;
13
+ if (typeof kernelspecName === "string" && kernelspecName.length > 0) {
14
+ const byKernelspec = contributions.find((c) => c.id === kernelspecName);
15
+ if (byKernelspec) return byKernelspec.id;
16
+ }
17
+ if (typeof languageName === "string" && languageName.length > 0) {
18
+ const byLanguage = contributions.find((c) => c.language === languageName);
19
+ if (byLanguage) return byLanguage.id;
20
+ }
21
+ const legacyKernel = metadata?.kernel;
22
+ if (typeof legacyKernel === "string" && legacyKernel.length > 0) {
23
+ if (contributions.some((c) => c.id === legacyKernel)) return legacyKernel;
24
+ }
25
+ return null;
26
+ }
27
+ function applyKernelToNotebookMetadata(metadata, contribution) {
28
+ const next = { ...metadata };
29
+ delete next.kernel;
30
+ if (!contribution) return next;
31
+ next.language_info = {
32
+ ...next.language_info,
33
+ name: contribution.language
34
+ };
35
+ next.kernelspec = {
36
+ ...next.kernelspec,
37
+ name: contribution.id,
38
+ language: contribution.language,
39
+ display_name: contribution.label
40
+ };
41
+ return next;
42
+ }
43
+ //#endregion
44
+ export { resolveKernelIdFromNotebookMetadata as n, TARGET_NOTEBOOK_KERNELS as r, applyKernelToNotebookMetadata as t };
45
+
46
+ //# sourceMappingURL=notebook-metadata-Bh2hG7NA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-metadata-Bh2hG7NA.js","names":[],"sources":["../src/notebook-kernel-api.ts","../src/notebook-metadata.ts"],"sourcesContent":["export const TARGET_NOTEBOOK_KERNELS = 'system.notebookkernels';\n\nexport interface NotebookExecutionResult {\n data?: string;\n imageData?: string;\n error?: string;\n}\n\nexport interface NotebookKernel {\n readonly id: string;\n readonly label: string;\n readonly icon?: string;\n readonly language: string;\n execute(code: string): Promise<NotebookExecutionResult>;\n connect?(options?: { requiredPackages?: string[] }): Promise<void>;\n disconnect?(): Promise<void>;\n restart?(): Promise<void>;\n interrupt?(): void;\n getVersion?(): Promise<string | undefined>;\n openPackageManager?(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void;\n close?(): void | Promise<void>;\n}\n\nexport interface NotebookKernelDescriptor {\n id: string;\n label: string;\n language: string;\n}\n\nexport interface NotebookKernelContribution extends NotebookKernelDescriptor {\n icon?: string;\n loadKernel(): Promise<NotebookKernel>;\n}\n","import type { NotebookData } from './notebook-types';\nimport type { NotebookKernelContribution, NotebookKernelDescriptor } from './notebook-kernel-api';\n\nexport function resolveKernelIdFromNotebookMetadata(\n metadata: NotebookData['metadata'] | undefined,\n contributions: NotebookKernelContribution[],\n): string | null {\n if (!contributions.length) return null;\n\n const languageName = metadata?.language_info?.name;\n if (typeof languageName === 'string' && languageName.length > 0) {\n const byId = contributions.find((c) => c.id === languageName);\n if (byId) return byId.id;\n }\n\n const kernelspecName = metadata?.kernelspec?.name;\n if (typeof kernelspecName === 'string' && kernelspecName.length > 0) {\n const byKernelspec = contributions.find((c) => c.id === kernelspecName);\n if (byKernelspec) return byKernelspec.id;\n }\n\n if (typeof languageName === 'string' && languageName.length > 0) {\n const byLanguage = contributions.find((c) => c.language === languageName);\n if (byLanguage) return byLanguage.id;\n }\n\n const legacyKernel = metadata?.kernel;\n if (typeof legacyKernel === 'string' && legacyKernel.length > 0) {\n if (contributions.some((c) => c.id === legacyKernel)) {\n return legacyKernel;\n }\n }\n\n return null;\n}\n\nexport function applyKernelToNotebookMetadata(\n metadata: NotebookData['metadata'] | undefined,\n contribution: NotebookKernelDescriptor | undefined,\n): NotebookData['metadata'] {\n const next: NotebookData['metadata'] = { ...metadata };\n delete next.kernel;\n\n if (!contribution) {\n return next;\n }\n\n next.language_info = {\n ...next.language_info,\n name: contribution.language,\n };\n next.kernelspec = {\n ...next.kernelspec,\n name: contribution.id,\n language: contribution.language,\n display_name: contribution.label,\n };\n\n return next;\n}\n"],"mappings":";AAAA,IAAa,0BAA0B;;;ACGvC,SAAgB,oCACZ,UACA,eACa;AACb,KAAI,CAAC,cAAc,OAAQ,QAAO;CAElC,MAAM,eAAe,UAAU,eAAe;AAC9C,KAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;EAC7D,MAAM,OAAO,cAAc,MAAM,MAAM,EAAE,OAAO,aAAa;AAC7D,MAAI,KAAM,QAAO,KAAK;;CAG1B,MAAM,iBAAiB,UAAU,YAAY;AAC7C,KAAI,OAAO,mBAAmB,YAAY,eAAe,SAAS,GAAG;EACjE,MAAM,eAAe,cAAc,MAAM,MAAM,EAAE,OAAO,eAAe;AACvE,MAAI,aAAc,QAAO,aAAa;;AAG1C,KAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;EAC7D,MAAM,aAAa,cAAc,MAAM,MAAM,EAAE,aAAa,aAAa;AACzE,MAAI,WAAY,QAAO,WAAW;;CAGtC,MAAM,eAAe,UAAU;AAC/B,KAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS;MACtD,cAAc,MAAM,MAAM,EAAE,OAAO,aAAa,CAChD,QAAO;;AAIf,QAAO;;AAGX,SAAgB,8BACZ,UACA,cACwB;CACxB,MAAM,OAAiC,EAAE,GAAG,UAAU;AACtD,QAAO,KAAK;AAEZ,KAAI,CAAC,aACD,QAAO;AAGX,MAAK,gBAAgB;EACjB,GAAG,KAAK;EACR,MAAM,aAAa;EACtB;AACD,MAAK,aAAa;EACd,GAAG,KAAK;EACR,MAAM,aAAa;EACnB,UAAU,aAAa;EACvB,cAAc,aAAa;EAC9B;AAED,QAAO"}
@@ -0,0 +1,5 @@
1
+ import { NotebookData } from './notebook-types';
2
+ import { NotebookKernelContribution, NotebookKernelDescriptor } from './notebook-kernel-api';
3
+ export declare function resolveKernelIdFromNotebookMetadata(metadata: NotebookData['metadata'] | undefined, contributions: NotebookKernelContribution[]): string | null;
4
+ export declare function applyKernelToNotebookMetadata(metadata: NotebookData['metadata'] | undefined, contribution: NotebookKernelDescriptor | undefined): NotebookData['metadata'];
5
+ //# sourceMappingURL=notebook-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-metadata.d.ts","sourceRoot":"","sources":["../src/notebook-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAElG,wBAAgB,mCAAmC,CAC/C,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,SAAS,EAC9C,aAAa,EAAE,0BAA0B,EAAE,GAC5C,MAAM,GAAG,IAAI,CA4Bf;AAED,wBAAgB,6BAA6B,CACzC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,SAAS,EAC9C,YAAY,EAAE,wBAAwB,GAAG,SAAS,GACnD,YAAY,CAAC,UAAU,CAAC,CAoB1B"}
@@ -1,4 +1,4 @@
1
- import { t as TARGET_NOTEBOOK_KERNELS } from "./notebook-kernel-api-c9l3_84P.js";
1
+ import { n as resolveKernelIdFromNotebookMetadata, r as TARGET_NOTEBOOK_KERNELS, t as applyKernelToNotebookMetadata } from "./notebook-metadata-Bh2hG7NA.js";
2
2
  import { DocksPart, TOPIC_CONTRIBUTEIONS_CHANGED, contributionRegistry, createLogger, subscribe, unsubscribe } from "@eclipse-docks/core";
3
3
  import { css, html } from "lit";
4
4
  import { customElement, property, state } from "lit/decorators.js";
@@ -77,8 +77,8 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
77
77
  this.kernelVersion = void 0;
78
78
  this.selectedKernelId = nextId;
79
79
  if (this.notebook) {
80
- if (!this.notebook.metadata) this.notebook.metadata = {};
81
- this.notebook.metadata.kernel = nextId ?? void 0;
80
+ const contribution = this.availableKernels.find((c) => c.id === nextId);
81
+ this.notebook.metadata = applyKernelToNotebookMetadata(this.notebook.metadata, contribution);
82
82
  }
83
83
  this.cellOutputs.clear();
84
84
  this.executionCounter = 0;
@@ -100,12 +100,12 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
100
100
  const connectionText = this.kernelConnecting ? "Connecting..." : this.kernelConnected ? this.kernelVersion ?? "Connected" : "Not connected";
101
101
  const iconColor = this.kernelConnected ? "var(--wa-color-green-40)" : this.kernelConnecting ? "var(--wa-color-warning-500)" : "var(--wa-color-red-40)";
102
102
  const runAllButton = this.isRunningAll ? html`
103
- <wa-button size="small" appearance="plain" @click=${() => this.cancelAllCells()} title="Cancel running all cells">
103
+ <wa-button size="s" appearance="plain" @click=${() => this.cancelAllCells()} title="Cancel running all cells">
104
104
  <wa-icon name="stop" label="Stop"></wa-icon>
105
105
  Cancel All
106
106
  </wa-button>
107
107
  ` : html`
108
- <wa-button size="small" appearance="plain" @click=${() => this.runAllCells()} title="Run all code cells sequentially">
108
+ <wa-button size="s" appearance="plain" @click=${() => this.runAllCells()} title="Run all code cells sequentially">
109
109
  <wa-icon name="play" label="Run"></wa-icon>
110
110
  Run All
111
111
  </wa-button>
@@ -115,13 +115,13 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
115
115
  class="kernel-select"
116
116
  placement="bottom-start"
117
117
  distance="4"
118
- size="small"
118
+ size="s"
119
119
  @wa-select=${(e) => void this.onKernelDropdownSelect(e)}
120
120
  >
121
121
  <wa-button
122
122
  slot="trigger"
123
123
  appearance="plain"
124
- size="small"
124
+ size="s"
125
125
  with-caret
126
126
  title="Notebook kernel"
127
127
  >
@@ -139,7 +139,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
139
139
  </wa-dropdown>
140
140
  ${runAllButton}
141
141
  <wa-button
142
- size="small"
142
+ size="s"
143
143
  appearance="plain"
144
144
  @click=${() => this.clearAllOutputs()}
145
145
  title="Clear all outputs and reset execution counter"
@@ -149,7 +149,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
149
149
  </wa-button>
150
150
  ${this.kernel?.restart ? html`
151
151
  <wa-button
152
- size="small"
152
+ size="s"
153
153
  appearance="plain"
154
154
  @click=${() => void this.restartKernel()}
155
155
  title="Restart kernel"
@@ -161,7 +161,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
161
161
  ` : ""}
162
162
  ${this.kernel?.openPackageManager ? html`
163
163
  <wa-button
164
- size="small"
164
+ size="s"
165
165
  appearance="plain"
166
166
  @click=${() => this.openPackageManager()}
167
167
  title="Manage packages"
@@ -173,7 +173,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
173
173
  ${this.kernel ? this.kernel.connect ? html`
174
174
  <wa-button
175
175
  appearance="plain"
176
- size="small"
176
+ size="s"
177
177
  style="display: flex; align-items: center; gap: 0.5rem;"
178
178
  ?disabled=${this.kernelConnecting}
179
179
  @click=${() => void this.connectKernel()}
@@ -213,8 +213,8 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
213
213
  }
214
214
  resolveDefaultKernelId(contributions) {
215
215
  if (!contributions.length) return null;
216
- const fromMeta = this.notebook?.metadata?.kernel;
217
- if (fromMeta && contributions.some((c) => c.id === fromMeta)) return fromMeta;
216
+ const fromMeta = resolveKernelIdFromNotebookMetadata(this.notebook?.metadata, contributions);
217
+ if (fromMeta) return fromMeta;
218
218
  const python = contributions.find((c) => c.id === "python");
219
219
  if (python) return python.id;
220
220
  const js = contributions.find((c) => c.id === "javascript");
@@ -227,8 +227,8 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
227
227
  if (!this.selectedKernelId && contributions.length) {
228
228
  this.selectedKernelId = this.resolveDefaultKernelId(contributions);
229
229
  if (this.notebook && this.selectedKernelId) {
230
- if (!this.notebook.metadata) this.notebook.metadata = {};
231
- this.notebook.metadata.kernel = this.selectedKernelId;
230
+ const contribution = contributions.find((c) => c.id === this.selectedKernelId);
231
+ this.notebook.metadata = applyKernelToNotebookMetadata(this.notebook.metadata, contribution);
232
232
  }
233
233
  }
234
234
  if (this.selectedKernelId && !contributions.some((c) => c.id === this.selectedKernelId)) this.selectedKernelId = contributions.length ? contributions[0].id : null;
@@ -287,7 +287,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
287
287
  source: ["# Error\nFailed to parse notebook file."]
288
288
  }] };
289
289
  }
290
- if (this.notebook?.metadata?.kernel) this.selectedKernelId = this.notebook.metadata.kernel;
290
+ this.selectedKernelId = null;
291
291
  if (this.notebook?.cells) {
292
292
  this.executionCounter = this.notebook.cells.filter((cell) => cell.cell_type === "code").map((cell) => cell.execution_count ?? 0).reduce((max, count) => Math.max(max, count), 0);
293
293
  this.notebook.cells.forEach((cell, index) => {
@@ -338,16 +338,16 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
338
338
  <div class="cell-header-actions">
339
339
  ${additionalButton || ""}
340
340
  ${additionalButton ? html`<span class="divider"></span>` : ""}
341
- <wa-button size="small" appearance="plain" @click=${() => this.addCell(index, "code")} title="Add code cell before">
341
+ <wa-button size="s" appearance="plain" @click=${() => this.addCell(index, "code")} title="Add code cell before">
342
342
  <wa-icon name="plus"></wa-icon>
343
343
  <wa-icon name="code" label="Code"></wa-icon>
344
344
  </wa-button>
345
- <wa-button size="small" appearance="plain" @click=${() => this.addCell(index, "markdown")} title="Add markdown cell before">
345
+ <wa-button size="s" appearance="plain" @click=${() => this.addCell(index, "markdown")} title="Add markdown cell before">
346
346
  <wa-icon name="plus"></wa-icon>
347
347
  <wa-icon name="font" label="Markdown"></wa-icon>
348
348
  </wa-button>
349
349
  <span class="divider"></span>
350
- <wa-button size="small" appearance="plain" @click=${() => this.deleteCell(index)} title="Delete cell" ?disabled=${this.notebook.cells.length <= 1}>
350
+ <wa-button size="s" appearance="plain" @click=${() => this.deleteCell(index)} title="Delete cell" ?disabled=${this.notebook.cells.length <= 1}>
351
351
  <wa-icon name="trash" label="Delete cell"></wa-icon>
352
352
  </wa-button>
353
353
  </div>
@@ -356,11 +356,11 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
356
356
  renderFooterActions(index) {
357
357
  return html`
358
358
  <div class="cell-footer">
359
- <wa-button size="small" appearance="plain" @click=${() => this.addCell(index + 1, "code")} title="Add code cell after">
359
+ <wa-button size="s" appearance="plain" @click=${() => this.addCell(index + 1, "code")} title="Add code cell after">
360
360
  <wa-icon name="code" label="Code"></wa-icon>
361
361
  <wa-icon name="plus"></wa-icon>
362
362
  </wa-button>
363
- <wa-button size="small" appearance="plain" @click=${() => this.addCell(index + 1, "markdown")} title="Add markdown cell after">
363
+ <wa-button size="s" appearance="plain" @click=${() => this.addCell(index + 1, "markdown")} title="Add markdown cell after">
364
364
  <wa-icon name="font" label="Markdown"></wa-icon>
365
365
  <wa-icon name="plus"></wa-icon>
366
366
  </wa-button>
@@ -506,7 +506,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
506
506
  if (this.editingMarkdownCells.has(index)) {
507
507
  const editButtons = html`
508
508
  <wa-button
509
- size="small"
509
+ size="s"
510
510
  appearance="plain"
511
511
  @click=${(e) => {
512
512
  const textarea = e.target.closest(".markdown-cell")?.querySelector("textarea");
@@ -516,7 +516,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
516
516
  <wa-icon name="check" label="Save"></wa-icon>
517
517
  </wa-button>
518
518
  <wa-button
519
- size="small"
519
+ size="s"
520
520
  appearance="plain"
521
521
  @click=${() => this.toggleMarkdownEdit(index)}
522
522
  title="Cancel editing">
@@ -550,7 +550,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
550
550
  const rendered = marked.parse(source);
551
551
  const editButton = html`
552
552
  <wa-button
553
- size="small"
553
+ size="s"
554
554
  appearance="plain"
555
555
  @click=${() => this.toggleMarkdownEdit(index)}
556
556
  title="Edit markdown">
@@ -593,7 +593,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
593
593
  const cellHeight = this.cellHeights.get(index) ?? Math.max(100, source.split("\n").length * 19 + 10);
594
594
  const runButton = isExecuting ? html`
595
595
  <wa-button
596
- size="small"
596
+ size="s"
597
597
  appearance="plain"
598
598
  @click=${() => this.cancelExecution(index)}
599
599
  title="Stop execution">
@@ -604,7 +604,7 @@ var DocksNotebookEditor = class DocksNotebookEditor extends DocksPart {
604
604
  cmd="notebook.runCell"
605
605
  icon="play"
606
606
  title="Run cell"
607
- size="small"
607
+ size="s"
608
608
  appearance="plain"
609
609
  .params=${{ cellIndex: index }}>
610
610
  </docks-command>
@@ -1071,4 +1071,4 @@ DocksNotebookEditor = _decorate([customElement("docks-notebook-editor")], DocksN
1071
1071
  //#endregion
1072
1072
  export { DocksNotebookEditor };
1073
1073
 
1074
- //# sourceMappingURL=notebook-runtime-CgQiGqsb.js.map
1074
+ //# sourceMappingURL=notebook-runtime-DztsNceA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-runtime-DztsNceA.js","names":[],"sources":["../src/notebook-runtime.ts"],"sourcesContent":["import { css, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { Ref, createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { DocksMonacoWidget } from \"@eclipse-docks/extension-monaco-editor/widget\";\nimport { createLogger, File, DocksPart, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED } from \"@eclipse-docks/core\";\nimport type { NotebookCell, NotebookData, NotebookEditorLike } from \"./notebook-types\";\nimport type { NotebookKernel, NotebookKernelContribution } from \"./notebook-kernel-api\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\nimport {\n applyKernelToNotebookMetadata,\n resolveKernelIdFromNotebookMetadata,\n} from \"./notebook-metadata\";\n\nconst logger = createLogger('NotebookRuntime');\n\n@customElement('docks-notebook-editor')\nexport class DocksNotebookEditor extends DocksPart implements NotebookEditorLike {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n public notebook?: NotebookData;\n\n @state()\n private cellOutputs: Map<number, any> = new Map();\n\n @state()\n private executingCells: Set<number> = new Set();\n\n @state()\n private availableKernels: NotebookKernelContribution[] = [];\n\n @state()\n private selectedKernelId: string | null = null;\n\n @state()\n private kernel: NotebookKernel | null = null;\n\n @state()\n private kernelConnected: boolean = false;\n\n @state()\n private kernelConnecting: boolean = false;\n\n @state()\n private kernelVersion: string | undefined = undefined;\n\n private unsubscribeContributionsToken?: string;\n\n @state()\n private editingMarkdownCells: Set<number> = new Set();\n\n @state()\n private executionCounter: number = 0;\n\n @state()\n private isRunningAll: boolean = false;\n\n @state()\n private highlightedCellIndex: number = -1;\n\n public focusedCellIndex: number = -1;\n private cancelRunAll: boolean = false;\n\n private cellWidgetRefs: Map<number, Ref<DocksMonacoWidget>> = new Map();\n @state() private cellHeights: Map<number, number> = new Map();\n\n protected doClose() {\n this.input = undefined;\n this.notebook = undefined;\n this.cellOutputs.clear();\n this.executingCells.clear();\n this.cellWidgetRefs.clear();\n this.cellHeights.clear();\n this.focusedCellIndex = -1;\n\n if (this.unsubscribeContributionsToken) {\n unsubscribe(this.unsubscribeContributionsToken);\n this.unsubscribeContributionsToken = undefined;\n }\n\n if (this.kernel?.close) {\n void Promise.resolve(this.kernel.close());\n }\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n }\n\n async save() {\n if (!this.notebook || !this.input) return;\n\n try {\n // Update cell contents from Monaco editors before saving\n this.saveEditorContents();\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code') {\n const output = this.cellOutputs.get(index);\n cell.outputs = output ? this.convertOutputToJupyter(output, cell.execution_count) : [];\n }\n });\n\n // Serialize notebook to JSON\n const notebookJson = JSON.stringify(this.notebook, null, 2);\n\n // Save to file\n const file: File = this.input.data;\n await file.saveContents(notebookJson);\n\n // Mark as not dirty\n this.markDirty(false);\n } catch (error) {\n console.error(\"Failed to save notebook:\", error);\n throw error;\n }\n }\n\n protected doBeforeUI() {\n // Start loading notebook asynchronously\n this.loadNotebook();\n }\n\n private async onKernelDropdownSelect(e: CustomEvent<{ item?: { value?: string } }>): Promise<void> {\n const value = e.detail?.item?.value ?? '';\n const nextId = value || null;\n if (this.selectedKernelId === nextId) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n this.selectedKernelId = nextId;\n if (this.notebook) {\n const contribution = this.availableKernels.find((c) => c.id === nextId);\n this.notebook.metadata = applyKernelToNotebookMetadata(this.notebook.metadata, contribution);\n }\n this.cellOutputs.clear();\n this.executionCounter = 0;\n this.notebook?.cells?.forEach((cell) => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n this.resetCellState();\n await this.ensureKernelLoaded();\n this.requestUpdate();\n }\n\n protected renderToolbar() {\n const kernels = this.availableKernels;\n const hasKernels = kernels.length > 0;\n const currentLabel = this.selectedKernelId\n ? kernels.find((c) => c.id === this.selectedKernelId)?.label ?? this.selectedKernelId\n : 'Select kernel';\n\n const connectionTitle = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? 'Kernel connected'\n : 'Kernel disconnected';\n const connectionText = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? (this.kernelVersion ?? 'Connected')\n : 'Not connected';\n const iconColor = this.kernelConnected\n ? 'var(--wa-color-green-40)'\n : this.kernelConnecting\n ? 'var(--wa-color-warning-500)'\n : 'var(--wa-color-red-40)';\n\n const runAllButton = this.isRunningAll ? html`\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.cancelAllCells()} title=\"Cancel running all cells\">\n <wa-icon name=\"stop\" label=\"Stop\"></wa-icon>\n Cancel All\n </wa-button>\n ` : html`\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.runAllCells()} title=\"Run all code cells sequentially\">\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run All\n </wa-button>\n `;\n\n return html`\n <wa-dropdown\n class=\"kernel-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"s\"\n @wa-select=${(e: CustomEvent<{ item?: { value?: string } }>) => void this.onKernelDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"s\"\n with-caret\n title=\"Notebook kernel\"\n >\n ${currentLabel}\n </wa-button>\n ${kernels.map(\n (c) => html`\n <wa-dropdown-item\n value=${c.id}\n type=\"checkbox\"\n ?checked=${c.id === this.selectedKernelId}\n >\n ${c.label}\n </wa-dropdown-item>\n `\n )}\n </wa-dropdown>\n ${runAllButton}\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n @click=${() => this.clearAllOutputs()}\n title=\"Clear all outputs and reset execution counter\"\n >\n <wa-icon name=\"eraser\" label=\"Clear\"></wa-icon>\n Clear Outputs\n </wa-button>\n ${this.kernel?.restart ? html`\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n @click=${() => void this.restartKernel()}\n title=\"Restart kernel\"\n ?disabled=${!this.kernelConnected || this.kernelConnecting}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Restart\"></wa-icon>\n Restart Kernel\n </wa-button>\n ` : ''}\n ${this.kernel?.openPackageManager ? html`\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n ` : ''}\n ${this.kernel ? (this.kernel.connect ? html`\n <wa-button\n appearance=\"plain\"\n size=\"s\"\n style=\"display: flex; align-items: center; gap: 0.5rem;\"\n ?disabled=${this.kernelConnecting}\n @click=${() => void this.connectKernel()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n ` : html`\n <span style=\"display: flex; align-items: center; gap: 0.5rem;\" title=${connectionTitle}>\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </span>\n `) : ''}\n `;\n }\n\n private async connectKernel(): Promise<void> {\n if (this.kernelConnecting || !this.kernel?.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.connectKernelWithRequiredPackages(this.kernel);\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (err) {\n logger.error('Failed to connect kernel', err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n protected async doInitUI() {\n this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target === TARGET_NOTEBOOK_KERNELS) {\n void this.refreshKernels();\n }\n });\n await this.refreshKernels();\n }\n\n private resolveDefaultKernelId(contributions: NotebookKernelContribution[]): string | null {\n if (!contributions.length) return null;\n const fromMeta = resolveKernelIdFromNotebookMetadata(this.notebook?.metadata, contributions);\n if (fromMeta) return fromMeta;\n const python = contributions.find((c) => c.id === 'python');\n if (python) return python.id;\n const js = contributions.find((c) => c.id === 'javascript');\n if (js) return js.id;\n return contributions[0].id;\n }\n\n private async refreshKernels(): Promise<void> {\n const contributions = contributionRegistry.getContributions<NotebookKernelContribution>(TARGET_NOTEBOOK_KERNELS);\n this.availableKernels = contributions;\n if (!this.selectedKernelId && contributions.length) {\n this.selectedKernelId = this.resolveDefaultKernelId(contributions);\n if (this.notebook && this.selectedKernelId) {\n const contribution = contributions.find((c) => c.id === this.selectedKernelId);\n this.notebook.metadata = applyKernelToNotebookMetadata(this.notebook.metadata, contribution);\n }\n }\n if (this.selectedKernelId && !contributions.some((c) => c.id === this.selectedKernelId)) {\n this.selectedKernelId = contributions.length ? contributions[0].id : null;\n }\n this.requestUpdate();\n await this.ensureKernelLoaded();\n }\n\n private async ensureKernelLoaded(): Promise<void> {\n const id = this.selectedKernelId;\n if (!id) return;\n if (this.kernel?.id === id) {\n if (!this.kernel.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.connectKernelWithRequiredPackages(this.kernel);\n this.kernelConnected = true;\n if (this.kernel.getVersion) {\n this.kernelVersion = await this.kernel.getVersion();\n }\n } catch (err) {\n logger.error('Failed to reconnect kernel with required packages', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n return;\n }\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n const contribution = this.availableKernels.find((c) => c.id === id);\n if (!contribution) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n const k = await contribution.loadKernel();\n if (this.selectedKernelId !== id) return;\n this.kernel = k;\n if (k.connect) {\n await this.connectKernelWithRequiredPackages(k);\n }\n this.kernelConnected = true;\n if (k.getVersion) {\n this.kernelVersion = await k.getVersion();\n }\n } catch (err) {\n logger.error('Failed to load kernel', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n private async loadNotebook() {\n const file: File = this.input!.data;\n const contents = await file.getContents();\n\n try {\n this.notebook = JSON.parse(contents as string);\n } catch (e) {\n console.error(\"Failed to parse notebook:\", e);\n this.notebook = {\n cells: [{\n cell_type: 'markdown',\n source: ['# Error\\nFailed to parse notebook file.']\n }]\n };\n }\n\n this.selectedKernelId = null;\n\n if (this.notebook?.cells) {\n const maxCount = this.notebook.cells\n .filter(cell => cell.cell_type === 'code')\n .map(cell => cell.execution_count ?? 0)\n .reduce((max, count) => Math.max(max, count), 0);\n this.executionCounter = maxCount;\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code' && cell.outputs && cell.outputs.length > 0) {\n const output = this.convertOutputFromJupyter(cell.outputs[0]);\n if (output) {\n this.cellOutputs.set(index, output);\n }\n }\n });\n }\n\n void this.refreshKernels();\n }\n\n private getCellSource(cell: NotebookCell): string {\n return Array.isArray(cell.source) ? cell.source.join('') : cell.source;\n }\n\n private convertOutputToJupyter(output: any, executionCount: number | null | undefined): any[] {\n if (output.type === 'execute_result') {\n const data: any = {};\n if (output.imageData) data['image/png'] = output.imageData;\n if (output.data) data['text/plain'] = output.data;\n return [{\n output_type: 'execute_result',\n data,\n execution_count: executionCount,\n metadata: {}\n }];\n } else if (output.type === 'error') {\n return [{\n output_type: 'error',\n ename: 'Error',\n evalue: output.data,\n traceback: [output.data]\n }];\n }\n return [];\n }\n\n private convertOutputFromJupyter(jupyterOutput: any): any | null {\n if (jupyterOutput.output_type === 'execute_result' && jupyterOutput.data) {\n return {\n type: 'execute_result',\n data: jupyterOutput.data['text/plain'] || '',\n imageData: jupyterOutput.data['image/png'] || undefined\n };\n } else if (jupyterOutput.output_type === 'error') {\n return {\n type: 'error',\n data: jupyterOutput.evalue || jupyterOutput.traceback?.join('\\n') || 'Unknown error'\n };\n }\n return null;\n }\n\n private renderHeaderActions(index: number, additionalButton?: any) {\n return html`\n <div class=\"cell-header-actions\">\n ${additionalButton || ''}\n ${additionalButton ? html`<span class=\"divider\"></span>` : ''}\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.addCell(index, 'code')} title=\"Add code cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n </wa-button>\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.addCell(index, 'markdown')} title=\"Add markdown cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n </wa-button>\n <span class=\"divider\"></span>\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.deleteCell(index)} title=\"Delete cell\" ?disabled=${this.notebook!.cells.length <= 1}>\n <wa-icon name=\"trash\" label=\"Delete cell\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n private renderFooterActions(index: number) {\n return html`\n <div class=\"cell-footer\">\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'code')} title=\"Add code cell after\">\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n <wa-button size=\"s\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'markdown')} title=\"Add markdown cell after\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n // Helper to convert string to Jupyter source format\n private stringToSourceArray(content: string): string[] {\n if (!content) return [''];\n const lines = content.split('\\n').map(line => line + '\\n');\n // Remove trailing newline from last line\n if (lines.length > 0) {\n lines[lines.length - 1] = lines[lines.length - 1].replace(/\\n$/, '');\n }\n return lines;\n }\n\n // Helper to create a new cell\n private createCell(cellType: 'code' | 'markdown'): NotebookCell {\n const newCell: NotebookCell = {\n cell_type: cellType,\n source: [''],\n metadata: {}\n };\n\n if (cellType === 'code') {\n newCell.execution_count = null;\n newCell.outputs = [];\n }\n\n return newCell;\n }\n\n public async executeCell(cellIndex: number) {\n const cell = this.notebook!.cells[cellIndex];\n if (cell.cell_type !== 'code') return;\n\n this.executingCells.add(cellIndex);\n this.requestUpdate();\n\n try {\n await this.ensureKernelLoaded();\n const k = this.kernel;\n if (!k) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: 'No kernel selected' });\n }\n return;\n }\n\n const widget = this.getCellWidgetRef(cellIndex).value;\n const code =\n widget && typeof (widget as { getContent?: unknown }).getContent === 'function'\n ? (widget as DocksMonacoWidget).getContent()\n : this.getCellSource(cell);\n if (code === null || code === undefined) return;\n\n const result = await k.execute(code);\n\n if (result.error) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: result.error });\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'execute_result',\n data: result.data,\n imageData: result.imageData,\n });\n }\n\n this.executionCounter++;\n cell.execution_count = this.executionCounter;\n this.markDirty(true);\n } catch (error) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: error instanceof Error ? error.message : String(error),\n });\n }\n } finally {\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private cancelExecution(cellIndex: number) {\n if (this.kernel?.interrupt) {\n this.kernel.interrupt();\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: 'Cancellation not supported for this kernel',\n });\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private clearAllOutputs() {\n // Clear all outputs\n this.cellOutputs.clear();\n\n // Reset execution counter\n this.executionCounter = 0;\n\n // Reset execution counts on all code cells\n if (this.notebook?.cells) {\n this.notebook.cells.forEach(cell => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n }\n\n // Mark as dirty since we've modified the notebook\n this.markDirty(true);\n\n // Force re-render\n this.requestUpdate();\n }\n\n private async restartKernel() {\n if (!this.kernel?.restart || this.kernelConnecting) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.kernel.restart();\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (error) {\n logger.error('Failed to restart kernel', error);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n private async runAllCells() {\n if (!this.notebook?.cells) return;\n\n this.isRunningAll = true;\n this.cancelRunAll = false;\n this.requestUpdate();\n\n try {\n // Execute all code cells sequentially\n for (let i = 0; i < this.notebook.cells.length; i++) {\n // Check if cancellation was requested\n if (this.cancelRunAll) {\n break;\n }\n\n const cell = this.notebook.cells[i];\n if (cell.cell_type === 'code') {\n await this.executeCell(i);\n }\n }\n } finally {\n this.isRunningAll = false;\n this.cancelRunAll = false;\n this.requestUpdate();\n }\n }\n\n private cancelAllCells() {\n this.cancelRunAll = true;\n this.kernel?.interrupt?.();\n }\n\n private toggleMarkdownEdit(index: number) {\n if (this.editingMarkdownCells.has(index)) {\n this.editingMarkdownCells.delete(index);\n } else {\n this.editingMarkdownCells.add(index);\n }\n this.requestUpdate();\n }\n\n private saveMarkdownEdit(index: number, event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n const newContent = textarea.value;\n\n // Update the cell source\n if (this.notebook && this.notebook.cells[index]) {\n const cell = this.notebook.cells[index];\n const oldContent = this.getCellSource(cell);\n\n cell.source = this.stringToSourceArray(newContent);\n\n // Mark dirty if content changed\n if (oldContent !== newContent) {\n this.markDirty(true);\n }\n }\n\n this.editingMarkdownCells.delete(index);\n this.requestUpdate();\n }\n\n private renderMarkdownCell(cell: NotebookCell, index: number) {\n const source = this.getCellSource(cell);\n const isEmpty = !source || source.trim() === '';\n const isEditing = this.editingMarkdownCells.has(index);\n\n if (isEditing) {\n const editButtons = html`\n <wa-button \n size=\"s\" \n appearance=\"plain\"\n @click=${(e: Event) => {\n const textarea = (e.target as HTMLElement).closest('.markdown-cell')?.querySelector('textarea');\n if (textarea) {\n this.saveMarkdownEdit(index, { target: textarea } as any);\n }\n }}\n title=\"Save changes\">\n <wa-icon name=\"check\" label=\"Save\"></wa-icon>\n </wa-button>\n <wa-button \n size=\"s\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Cancel editing\">\n <wa-icon name=\"xmark\" label=\"Cancel\"></wa-icon>\n </wa-button>\n `;\n \n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell editing\">\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButtons)}\n <span class=\"cell-label\">Markdown</span>\n </div>\n <textarea \n class=\"markdown-editor\"\n .value=${source}\n @blur=${(e: Event) => this.saveMarkdownEdit(index, e)}\n placeholder=\"Enter markdown content here... (# for headings, ** for bold, etc.)\"></textarea>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n const rendered = marked.parse(source) as string;\n\n const editButton = html`\n <wa-button \n size=\"s\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Edit markdown\">\n <wa-icon name=\"pencil\" label=\"Edit\"></wa-icon>\n </wa-button>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell ${isEmpty ? 'empty' : ''}\" @dblclick=${() => this.toggleMarkdownEdit(index)}>\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButton)}\n <span class=\"cell-label\"></span>\n </div>\n <div class=\"cell-content\">\n ${isEmpty ? html`\n <div class=\"markdown-placeholder\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <span>Double-click or click the pencil icon to edit markdown</span>\n </div>\n ` : unsafeHTML(rendered)}\n </div>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCodeCell(cell: NotebookCell, index: number) {\n const output = this.cellOutputs.get(index);\n const isExecuting = this.executingCells.has(index);\n const source = this.getCellSource(cell);\n const language = this.kernel?.language ?? 'javascript';\n const notebookPath = (this.input?.data as File)?.getWorkspacePath?.() ?? 'notebook';\n const cellUri = `${notebookPath}-cell-${index}`;\n const cellHeight = this.cellHeights.get(index) ?? Math.max(100, source.split('\\n').length * 19 + 10);\n\n const runButton = isExecuting ? html`\n <wa-button \n size=\"s\" \n appearance=\"plain\"\n @click=${() => this.cancelExecution(index)}\n title=\"Stop execution\">\n <wa-icon name=\"stop\" label=\"Stop\" style=\"color: var(--wa-color-danger-500);\"></wa-icon>\n </wa-button>\n ` : html`\n <docks-command \n cmd=\"notebook.runCell\"\n icon=\"play\"\n title=\"Run cell\"\n size=\"s\"\n appearance=\"plain\"\n .params=${{ cellIndex: index }}>\n </docks-command>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell code-cell ${isExecuting ? 'executing' : ''}\">\n <div class=\"cell-header\">\n <span class=\"cell-label\">\n ${isExecuting ? html`\n In [<wa-animation name=\"pulse\" duration=\"1000\" iterations=\"Infinity\" ?play=${isExecuting}>\n <span class=\"executing-indicator\">*</span>\n </wa-animation>]\n ` : html`\n In [${cell.execution_count ?? ' '}]\n `}\n </span>\n ${this.renderHeaderActions(index, runButton)}\n </div>\n <div\n class=\"cell-input monaco-container\"\n style=${styleMap({ height: `${cellHeight}px` })}\n @wheel=${(e: WheelEvent) => this.onCellWheel(index, e)}\n >\n <docks-monaco-widget\n .value=${source}\n .language=${language}\n .uri=${cellUri}\n ?autoLayout=${true}\n @content-change=${() => this.markDirty(true)}\n @editor-focus=${() => { this.focusedCellIndex = index; }}\n @editor-blur=${() => { if (this.focusedCellIndex === index) this.focusedCellIndex = -1; }}\n @content-height-changed=${(e: CustomEvent<{ height: number }>) => this.onCellHeightChange(index, e.detail.height)}\n ${ref(this.getCellWidgetRef(index))}\n ></docks-monaco-widget>\n </div>\n ${output ? html`\n <div class=\"cell-output ${output.type === 'error' ? 'output-error' : ''}\">\n <div class=\"output-label\">Out [${index + 1}]:</div>\n ${output.imageData ? html`\n <img src=\"data:image/png;base64,${output.imageData}\" alt=\"Output image\" class=\"output-image\" />\n ` : ''}\n ${output.data ? html`<pre><code>${output.data}</code></pre>` : ''}\n </div>\n ` : ''}\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCell(cell: NotebookCell, index: number) {\n if (cell.cell_type === 'markdown') {\n return this.renderMarkdownCell(cell, index);\n } else if (cell.cell_type === 'code') {\n return this.renderCodeCell(cell, index);\n } else {\n // raw cell\n const source = this.getCellSource(cell);\n return html`\n <div class=\"cell raw-cell\">\n <pre><code>${source}</code></pre>\n </div>\n `;\n }\n }\n\n private addCell(index: number, cellType: 'code' | 'markdown' = 'code') {\n if (!this.notebook) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n this.shiftIndices(index, 'up');\n \n this.notebook.cells.splice(index, 0, this.createCell(cellType));\n \n // Automatically enter edit mode for new markdown cells\n if (cellType === 'markdown') {\n this.editingMarkdownCells.add(index);\n }\n \n this.resetCellState();\n \n // Trigger animation and scroll to the new cell\n this.highlightedCellIndex = index;\n this.updateComplete.then(() => {\n this.scrollToCell(index);\n });\n }\n\n private scrollToCell(index: number) {\n // Find the cell wrapper element\n const cellWrapper = this.shadowRoot?.querySelectorAll('.cell-wrapper')[index];\n if (!cellWrapper) return;\n\n // Find the wa-scroller container (parent of this component)\n const scroller = this.closest('wa-scroller');\n if (!scroller) {\n // Fallback to default scrollIntoView if no scroller found\n cellWrapper.scrollIntoView({ \n behavior: 'smooth', \n block: 'center',\n inline: 'nearest'\n });\n return;\n }\n\n // Manually scroll the wa-scroller to the cell position\n const scrollerRect = scroller.getBoundingClientRect();\n const cellRect = cellWrapper.getBoundingClientRect();\n const scrollTop = scroller.scrollTop;\n \n // Calculate target scroll position (center the cell)\n const targetScroll = scrollTop + (cellRect.top - scrollerRect.top) - (scrollerRect.height / 2) + (cellRect.height / 2);\n \n scroller.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n }\n\n private saveEditorContents() {\n this.notebook?.cells.forEach((cell, index) => {\n if (cell.cell_type !== 'code') return;\n const widget = this.getCellWidgetRef(index).value;\n const value =\n widget && typeof (widget as { getContent?: unknown }).getContent === 'function'\n ? (widget as DocksMonacoWidget).getContent()\n : undefined;\n if (value !== undefined && value !== null) {\n cell.source = this.stringToSourceArray(value);\n }\n });\n }\n\n private resetCellState() {\n this.markDirty(true);\n }\n\n private deleteCell(index: number) {\n if (!this.notebook || this.notebook.cells.length <= 1) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n // Remove state for the deleted cell\n this.cellOutputs.delete(index);\n this.executingCells.delete(index);\n this.editingMarkdownCells.delete(index);\n \n this.notebook.cells.splice(index, 1);\n \n this.shiftIndices(index, 'down');\n \n this.resetCellState();\n }\n\n private shiftIndices(startIndex: number, direction: 'up' | 'down') {\n const shift = direction === 'up' ? 1 : -1;\n const filterFn = direction === 'up' \n ? (idx: number) => idx >= startIndex\n : (idx: number) => idx > startIndex;\n const sortFn = direction === 'up'\n ? (a: number, b: number) => b - a\n : (a: number, b: number) => a - b;\n\n const shiftMap = <T>(map: Map<number, T>) => {\n const indices = Array.from(map.keys()).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n const value = map.get(oldIndex);\n map.delete(oldIndex);\n map.set(oldIndex + shift, value!);\n });\n };\n\n const shiftSet = (set: Set<number>) => {\n const indices = Array.from(set).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n set.delete(oldIndex);\n set.add(oldIndex + shift);\n });\n };\n\n shiftMap(this.cellOutputs);\n shiftSet(this.executingCells);\n shiftSet(this.editingMarkdownCells);\n shiftMap(this.cellWidgetRefs);\n shiftMap(this.cellHeights);\n }\n\n private getCellWidgetRef(index: number): Ref<DocksMonacoWidget> {\n if (!this.cellWidgetRefs.has(index)) {\n this.cellWidgetRefs.set(index, createRef());\n }\n return this.cellWidgetRefs.get(index)!;\n }\n\n private onCellHeightChange(index: number, height: number): void {\n const padding = 10;\n const minHeight = 100;\n const newHeight = Math.max(minHeight, height + padding);\n const current = this.cellHeights.get(index);\n if (current === newHeight) return;\n this.cellHeights = new Map(this.cellHeights);\n this.cellHeights.set(index, newHeight);\n this.requestUpdate();\n this.updateComplete.then(() => (this.getCellWidgetRef(index).value as { layout?: () => void })?.layout?.());\n }\n\n private onCellWheel(index: number, e: WheelEvent): void {\n const widget = this.getCellWidgetRef(index).value;\n const editor = widget?.getEditor();\n if (!editor) return;\n const scrollTop = editor.getScrollTop();\n const scrollHeight = editor.getScrollHeight();\n const contentHeight = editor.getContentHeight();\n const canScroll = scrollHeight > contentHeight;\n const atBoundary = (e.deltaY < 0 && scrollTop <= 0) ||\n (e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight);\n if (!canScroll || atBoundary) {\n e.stopImmediatePropagation();\n }\n }\n\n private openPackageManager() {\n if (!this.kernel?.openPackageManager) return;\n const packages = this.notebook?.metadata?.required_packages ?? [];\n this.kernel.openPackageManager({\n requiredPackages: packages,\n onPackageAdded: (packageName: string) => {\n if (!this.notebook) return;\n if (!this.notebook.metadata) this.notebook.metadata = {};\n if (!this.notebook.metadata.required_packages) this.notebook.metadata.required_packages = [];\n if (!this.notebook.metadata.required_packages.includes(packageName)) {\n this.notebook.metadata.required_packages.push(packageName);\n this.markDirty(true);\n void this.syncKernelPackages();\n }\n },\n onPackageRemoved: (packageName: string) => {\n if (!this.notebook?.metadata?.required_packages) return;\n const index = this.notebook.metadata.required_packages.indexOf(packageName);\n if (index > -1) {\n this.notebook.metadata.required_packages.splice(index, 1);\n this.markDirty(true);\n void this.syncKernelPackages();\n }\n },\n });\n }\n\n private async connectKernelWithRequiredPackages(kernel: NotebookKernel): Promise<void> {\n if (!kernel.connect) return;\n await kernel.connect({\n requiredPackages: this.notebook?.metadata?.required_packages ?? [],\n });\n }\n\n private async syncKernelPackages(): Promise<void> {\n if (!this.kernel?.connect) return;\n try {\n await this.connectKernelWithRequiredPackages(this.kernel);\n } catch (err) {\n logger.error('Failed to sync kernel packages', err);\n }\n }\n\n protected updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('kernelConnected') ||\n changedProperties.has('kernelConnecting') ||\n changedProperties.has('kernelVersion') ||\n changedProperties.has('isRunningAll') ||\n changedProperties.has('availableKernels') ||\n changedProperties.has('selectedKernelId')\n ) {\n }\n }\n\n protected renderContent() {\n if (!this.notebook) {\n return html`<div class=\"loading\">Loading notebook...</div>`;\n }\n\n return html`\n <div class=\"noteboocells\">\n ${repeat(\n this.notebook.cells,\n (_cell, index) => index,\n (cell, index) => this.renderCell(cell, index)\n )}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .kernel-select {\n max-width: 10rem;\n }\n\n .noteboocells {\n display: flex;\n flex-direction: column;\n gap: 3rem;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem 1rem;\n width: 100%;\n box-sizing: border-box;\n }\n\n .cell-wrapper {\n position: relative;\n }\n\n .cell {\n border-radius: 4px;\n overflow: hidden;\n opacity: 0.9;\n position: relative;\n }\n\n .cell-header-actions {\n display: flex;\n gap: 0.25rem;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-header-actions .divider {\n width: 1px;\n height: 1rem;\n background: var(--wa-color-outline);\n margin: 0 0.25rem;\n opacity: 0.5;\n }\n\n .cell-header:hover .cell-header-actions {\n opacity: 1;\n }\n\n .cell-footer {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n justify-content: flex-start;\n padding: 0.5rem;\n border-top: 1px solid var(--wa-color-outline);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-footer:hover {\n opacity: 1;\n }\n\n .markdown-cell {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .markdown-cell:hover:not(.editing) {\n opacity: 0.9;\n }\n \n .markdown-cell .cell-content {\n padding: 1rem;\n }\n\n .markdown-cell.editing {\n cursor: default;\n padding: 0;\n }\n \n .markdown-cell.editing .cell-actions {\n display: none;\n }\n\n .markdown-editor {\n width: 100%;\n min-height: 200px;\n padding: 1rem;\n font-family: monospace;\n font-size: 0.95rem;\n line-height: 1.6;\n border: none;\n outline: none;\n resize: vertical;\n background: transparent;\n color: inherit;\n }\n\n .code-cell {\n border-left: 3px solid var(--wa-color-primary-500);\n transition: all 0.3s ease;\n }\n \n .code-cell.executing {\n border-left: 4px solid var(--wa-color-primary-500);\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n animation: pulse-cell 2s ease-in-out infinite;\n }\n \n @keyframes pulse-cell {\n 0%, 100% {\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n opacity: 1;\n }\n 50% {\n box-shadow: 0 0 0 4px var(--wa-color-primary-500, rgba(59, 130, 246, 0.5));\n opacity: 0.95;\n }\n }\n\n .cell-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n flex-wrap: nowrap;\n }\n\n .cell-label {\n font-family: monospace;\n font-weight: bold;\n flex-shrink: 0;\n }\n \n .executing-indicator {\n display: inline-block;\n color: var(--wa-color-primary-500);\n font-weight: bold;\n font-size: 1.2em;\n }\n\n .cell-input {\n margin: 0;\n }\n\n .monaco-container {\n min-height: 100px;\n height: auto;\n width: 100%;\n }\n\n .cell-output {\n padding: 1rem;\n }\n\n .output-label {\n font-family: monospace;\n font-weight: bold;\n margin-bottom: 0.5rem;\n opacity: 0.7;\n }\n\n .cell-output pre {\n margin: 0;\n overflow-x: auto;\n }\n\n .cell-output code {\n font-family: 'Courier New', monospace;\n font-size: 0.9rem;\n line-height: 1.5;\n }\n\n .output-image {\n max-width: 100%;\n height: auto;\n display: block;\n margin: 0.5rem 0;\n border-radius: 4px;\n }\n\n .output-error {\n border-left: 3px solid var(--wa-color-danger-500);\n }\n\n .raw-cell {\n padding: 1rem;\n }\n\n .raw-cell pre {\n margin: 0;\n }\n\n .loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 1.2rem;\n }\n\n .markdown-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n opacity: 0.5;\n font-style: italic;\n transition: opacity 0.2s;\n }\n\n .markdown-cell.empty:hover .markdown-placeholder {\n opacity: 0.8;\n }\n\n .markdown-placeholder wa-icon {\n font-size: 1.5rem;\n }\n `;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-runtime.d.ts","sourceRoot":"","sources":["../src/notebook-runtime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAsB,SAAS,EAA8E,MAAM,qBAAqB,CAAC;AAChJ,OAAO,KAAK,EAAgB,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMvF,qBACa,mBAAoB,SAAQ,SAAU,YAAW,kBAAkB;IAErE,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAG/B,OAAO,CAAC,WAAW,CAA+B;IAGlD,OAAO,CAAC,cAAc,CAA0B;IAGhD,OAAO,CAAC,gBAAgB,CAAoC;IAG5D,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,MAAM,CAA+B;IAG7C,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,6BAA6B,CAAC,CAAS;IAG/C,OAAO,CAAC,oBAAoB,CAA0B;IAGtD,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,oBAAoB,CAAc;IAEnC,gBAAgB,EAAE,MAAM,CAAM;IACrC,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,cAAc,CAAkD;IAC/D,OAAO,CAAC,WAAW,CAAkC;IAE9D,SAAS,CAAC,OAAO;IAsBX,IAAI;IA6BV,SAAS,CAAC,UAAU;YAKN,sBAAsB;IA0BpC,SAAS,CAAC,aAAa;YAsHT,aAAa;cAgBX,QAAQ;IASxB,OAAO,CAAC,sBAAsB;YAWhB,cAAc;YAiBd,kBAAkB;YAgDlB,YAAY;IAwC1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,UAAU;IAeL,WAAW,CAAC,SAAS,EAAE,MAAM;IAoD1C,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;YAwBT,aAAa;YAgBb,WAAW;IA2BzB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IA6F1B,OAAO,CAAC,cAAc;IAkFtB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,kBAAkB;YA2BZ,iCAAiC;YAOjC,kBAAkB;IAShC,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAcrD,SAAS,CAAC,aAAa;IAgBvB,MAAM,CAAC,MAAM,0BAiOX;CACL"}
1
+ {"version":3,"file":"notebook-runtime.d.ts","sourceRoot":"","sources":["../src/notebook-runtime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAsB,SAAS,EAA8E,MAAM,qBAAqB,CAAC;AAChJ,OAAO,KAAK,EAAgB,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUvF,qBACa,mBAAoB,SAAQ,SAAU,YAAW,kBAAkB;IAErE,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAG/B,OAAO,CAAC,WAAW,CAA+B;IAGlD,OAAO,CAAC,cAAc,CAA0B;IAGhD,OAAO,CAAC,gBAAgB,CAAoC;IAG5D,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,MAAM,CAA+B;IAG7C,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,6BAA6B,CAAC,CAAS;IAG/C,OAAO,CAAC,oBAAoB,CAA0B;IAGtD,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,oBAAoB,CAAc;IAEnC,gBAAgB,EAAE,MAAM,CAAM;IACrC,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,cAAc,CAAkD;IAC/D,OAAO,CAAC,WAAW,CAAkC;IAE9D,SAAS,CAAC,OAAO;IAsBX,IAAI;IA6BV,SAAS,CAAC,UAAU;YAKN,sBAAsB;IA0BpC,SAAS,CAAC,aAAa;YAsHT,aAAa;cAgBX,QAAQ;IASxB,OAAO,CAAC,sBAAsB;YAWhB,cAAc;YAiBd,kBAAkB;YAgDlB,YAAY;IAsC1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,UAAU;IAeL,WAAW,CAAC,SAAS,EAAE,MAAM;IAoD1C,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;YAwBT,aAAa;YAgBb,WAAW;IA2BzB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IA6F1B,OAAO,CAAC,cAAc;IAkFtB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,kBAAkB;YA2BZ,iCAAiC;YAOjC,kBAAkB;IAShC,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAcrD,SAAS,CAAC,aAAa;IAgBvB,MAAM,CAAC,MAAM,0BAiOX;CACL"}
@@ -8,9 +8,20 @@ export interface NotebookCell {
8
8
  export interface NotebookData {
9
9
  cells: NotebookCell[];
10
10
  metadata?: {
11
+ language_info?: {
12
+ name?: string;
13
+ [key: string]: unknown;
14
+ };
15
+ kernelspec?: {
16
+ name?: string;
17
+ language?: string;
18
+ display_name?: string;
19
+ [key: string]: unknown;
20
+ };
21
+ /** @deprecated Legacy field; use language_info.name instead */
11
22
  kernel?: string;
12
23
  required_packages?: string[];
13
- [key: string]: any;
24
+ [key: string]: unknown;
14
25
  };
15
26
  nbformat?: number;
16
27
  nbformat_minor?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-types.d.ts","sourceRoot":"","sources":["../src/notebook-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IACvC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAMhF"}
1
+ {"version":3,"file":"notebook-types.d.ts","sourceRoot":"","sources":["../src/notebook-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IACvC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE;QACP,aAAa,CAAC,EAAE;YACZ,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SAC1B,CAAC;QACF,UAAU,CAAC,EAAE;YACT,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SAC1B,CAAC;QACF,+DAA+D;QAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAMhF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-notebook",
3
- "version": "0.7.118",
3
+ "version": "0.7.124",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-extension-x1uUUi5p.js","names":[],"sources":["../src/notebook-catalog.ts","../src/javascript-kernel.ts","../src/notebook-extension.ts"],"sourcesContent":["import type { CatalogContribution } from \"@eclipse-docks/extension-catalog/api\";\nimport { registerCatalog } from \"@eclipse-docks/extension-catalog/api\";\n\nconst NOTEBOOK_CATALOG: CatalogContribution = {\n label: \"Notebooks\",\n icon: \"docks jupyter\",\n contributionId: \"catalog.notebooks\",\n items: [\n {\n label: \"JavaScript\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.javascript\",\n items: [\n { label: \"JavaScript basics\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/javascript-basics.ipynb\", import.meta.url).href, filename: \"javascript-basics.ipynb\" } },\n ],\n },\n {\n label: \"DuckDB\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.duckdb\",\n items: [\n { label: \"DuckDB in notebooks\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/duckdb-sample.ipynb\", import.meta.url).href, filename: \"duckdb-sample.ipynb\" } },\n ],\n },\n {\n label: \"PGlite\",\n icon: \"file-code\",\n contributionId: \"catalog.notebooks.pglite\",\n items: [\n { label: \"PostgreSQL in notebooks\", icon: \"docks jupyter\", state: { url: new URL(\"./catalog/pglite-sample.ipynb\", import.meta.url).href, filename: \"pglite-sample.ipynb\" } },\n ],\n },\n ],\n};\n\nexport function registerNotebookCatalog(): void {\n registerCatalog(NOTEBOOK_CATALOG);\n}\n","import { createJsRuntime, type JsRuntime } from '@eclipse-docks/core';\nimport type { NotebookExecutionResult, NotebookKernel, NotebookKernelContribution } from './notebook-kernel-api';\n\nclass JavaScriptNotebookKernel implements NotebookKernel {\n readonly id = 'javascript';\n readonly label = 'JavaScript';\n readonly language = 'javascript';\n\n private runtime: JsRuntime | null = null;\n\n private getRuntime(): JsRuntime {\n if (!this.runtime) {\n this.runtime = createJsRuntime();\n }\n return this.runtime;\n }\n\n async getVersion(): Promise<string> {\n return 'JavaScript';\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const result = await this.getRuntime().execute(code);\n if (result === undefined || result === null) {\n return {};\n }\n return { data: String(result) };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n close(): void {\n if (this.runtime) {\n this.runtime.close();\n this.runtime = null;\n }\n }\n}\n\nexport const javascriptKernelContribution: NotebookKernelContribution = {\n id: 'javascript',\n label: 'JavaScript',\n language: 'javascript',\n loadKernel: async (): Promise<NotebookKernel> => new JavaScriptNotebookKernel(),\n};\n","import { html } from \"lit\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { File } from \"@eclipse-docks/core\";\nimport { activeEditorSignal } from \"@eclipse-docks/core\";\nimport type { ExecutionContext } from \"@eclipse-docks/core\";\nimport { registerNotebookCatalog } from \"./notebook-catalog\";\nimport { NotebookData, isNotebookEditorLike } from \"./notebook-types\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\nimport { javascriptKernelContribution } from \"./javascript-kernel\";\n\nexport default ({ editorRegistry, commandRegistry, contributionRegistry }: any) => {\n registerNotebookCatalog();\n contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, javascriptKernelContribution);\n\n const INITIAL_NOTEBOOK_CONTENT: NotebookData = {\n cells: [\n {\n cell_type: 'markdown',\n source: ['Press the **Run** button in the code cell below to execute it.'],\n metadata: {}\n },\n {\n cell_type: 'code',\n source: ['return \"Hello, World!\"'],\n execution_count: null,\n outputs: [],\n metadata: {}\n }\n ],\n metadata: { kernel: 'javascript' },\n nbformat: 4,\n nbformat_minor: 4\n };\n commandRegistry.registerHandler('notebook.runCell', {\n ranking: 10,\n canExecute: (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex;\n if (cellIndex !== undefined) {\n return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);\n }\n return activeEditor.focusedCellIndex >= 0;\n }\n return false;\n },\n execute: async (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;\n if (cellIndex >= 0) {\n await activeEditor.executeCell(cellIndex);\n }\n }\n }\n });\n\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.notebooeditor\",\n label: \"Jupyter Notebook\",\n icon: \"docks jupyter\",\n lazyInit: () => import('./notebook-runtime'),\n canHandle: (input: any) => input instanceof File && input.getName().toLowerCase().endsWith(\".ipynb\"),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n } as EditorInput;\n editorInput.component = (id: string) => html`\n <docks-notebook-editor id=\"${id}\" .input=${editorInput}></docks-notebook-editor>`;\n return editorInput;\n },\n ranking: 100,\n });\n\n contributionRegistry.registerContribution('filebrowser.create', {\n label: 'Jupyter Notebook',\n icon: 'docks jupyter',\n command: 'touch',\n params: {\n path: \"notebook.ipynb\",\n extension: '.ipynb',\n ask: true,\n contents: JSON.stringify(INITIAL_NOTEBOOK_CONTENT, null, 2)\n }\n });\n};\n\n\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- //#region src/notebook-kernel-api.ts
2
- var TARGET_NOTEBOOK_KERNELS = "system.notebookkernels";
3
- //#endregion
4
- export { TARGET_NOTEBOOK_KERNELS as t };
5
-
6
- //# sourceMappingURL=notebook-kernel-api-c9l3_84P.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-kernel-api-c9l3_84P.js","names":[],"sources":["../src/notebook-kernel-api.ts"],"sourcesContent":["export const TARGET_NOTEBOOK_KERNELS = 'system.notebookkernels';\n\nexport interface NotebookExecutionResult {\n data?: string;\n imageData?: string;\n error?: string;\n}\n\nexport interface NotebookKernel {\n readonly id: string;\n readonly label: string;\n readonly icon?: string;\n readonly language: string;\n execute(code: string): Promise<NotebookExecutionResult>;\n connect?(options?: { requiredPackages?: string[] }): Promise<void>;\n disconnect?(): Promise<void>;\n restart?(): Promise<void>;\n interrupt?(): void;\n getVersion?(): Promise<string | undefined>;\n openPackageManager?(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void;\n close?(): void | Promise<void>;\n}\n\nexport interface NotebookKernelContribution {\n id: string;\n label: string;\n icon?: string;\n language: string;\n loadKernel(): Promise<NotebookKernel>;\n}\n"],"mappings":";AAAA,IAAa,0BAA0B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-runtime-CgQiGqsb.js","names":[],"sources":["../src/notebook-runtime.ts"],"sourcesContent":["import { css, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { Ref, createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { DocksMonacoWidget } from \"@eclipse-docks/extension-monaco-editor/widget\";\nimport { createLogger, File, DocksPart, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED } from \"@eclipse-docks/core\";\nimport type { NotebookCell, NotebookData, NotebookEditorLike } from \"./notebook-types\";\nimport type { NotebookKernel, NotebookKernelContribution } from \"./notebook-kernel-api\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\n\nconst logger = createLogger('NotebookRuntime');\n\n@customElement('docks-notebook-editor')\nexport class DocksNotebookEditor extends DocksPart implements NotebookEditorLike {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n public notebook?: NotebookData;\n\n @state()\n private cellOutputs: Map<number, any> = new Map();\n\n @state()\n private executingCells: Set<number> = new Set();\n\n @state()\n private availableKernels: NotebookKernelContribution[] = [];\n\n @state()\n private selectedKernelId: string | null = null;\n\n @state()\n private kernel: NotebookKernel | null = null;\n\n @state()\n private kernelConnected: boolean = false;\n\n @state()\n private kernelConnecting: boolean = false;\n\n @state()\n private kernelVersion: string | undefined = undefined;\n\n private unsubscribeContributionsToken?: string;\n\n @state()\n private editingMarkdownCells: Set<number> = new Set();\n\n @state()\n private executionCounter: number = 0;\n\n @state()\n private isRunningAll: boolean = false;\n\n @state()\n private highlightedCellIndex: number = -1;\n\n public focusedCellIndex: number = -1;\n private cancelRunAll: boolean = false;\n\n private cellWidgetRefs: Map<number, Ref<DocksMonacoWidget>> = new Map();\n @state() private cellHeights: Map<number, number> = new Map();\n\n protected doClose() {\n this.input = undefined;\n this.notebook = undefined;\n this.cellOutputs.clear();\n this.executingCells.clear();\n this.cellWidgetRefs.clear();\n this.cellHeights.clear();\n this.focusedCellIndex = -1;\n\n if (this.unsubscribeContributionsToken) {\n unsubscribe(this.unsubscribeContributionsToken);\n this.unsubscribeContributionsToken = undefined;\n }\n\n if (this.kernel?.close) {\n void Promise.resolve(this.kernel.close());\n }\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n }\n\n async save() {\n if (!this.notebook || !this.input) return;\n\n try {\n // Update cell contents from Monaco editors before saving\n this.saveEditorContents();\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code') {\n const output = this.cellOutputs.get(index);\n cell.outputs = output ? this.convertOutputToJupyter(output, cell.execution_count) : [];\n }\n });\n\n // Serialize notebook to JSON\n const notebookJson = JSON.stringify(this.notebook, null, 2);\n\n // Save to file\n const file: File = this.input.data;\n await file.saveContents(notebookJson);\n\n // Mark as not dirty\n this.markDirty(false);\n } catch (error) {\n console.error(\"Failed to save notebook:\", error);\n throw error;\n }\n }\n\n protected doBeforeUI() {\n // Start loading notebook asynchronously\n this.loadNotebook();\n }\n\n private async onKernelDropdownSelect(e: CustomEvent<{ item?: { value?: string } }>): Promise<void> {\n const value = e.detail?.item?.value ?? '';\n const nextId = value || null;\n if (this.selectedKernelId === nextId) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n this.selectedKernelId = nextId;\n if (this.notebook) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = nextId ?? undefined;\n }\n this.cellOutputs.clear();\n this.executionCounter = 0;\n this.notebook?.cells?.forEach((cell) => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n this.resetCellState();\n await this.ensureKernelLoaded();\n this.requestUpdate();\n }\n\n protected renderToolbar() {\n const kernels = this.availableKernels;\n const hasKernels = kernels.length > 0;\n const currentLabel = this.selectedKernelId\n ? kernels.find((c) => c.id === this.selectedKernelId)?.label ?? this.selectedKernelId\n : 'Select kernel';\n\n const connectionTitle = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? 'Kernel connected'\n : 'Kernel disconnected';\n const connectionText = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? (this.kernelVersion ?? 'Connected')\n : 'Not connected';\n const iconColor = this.kernelConnected\n ? 'var(--wa-color-green-40)'\n : this.kernelConnecting\n ? 'var(--wa-color-warning-500)'\n : 'var(--wa-color-red-40)';\n\n const runAllButton = this.isRunningAll ? html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.cancelAllCells()} title=\"Cancel running all cells\">\n <wa-icon name=\"stop\" label=\"Stop\"></wa-icon>\n Cancel All\n </wa-button>\n ` : html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.runAllCells()} title=\"Run all code cells sequentially\">\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run All\n </wa-button>\n `;\n\n return html`\n <wa-dropdown\n class=\"kernel-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent<{ item?: { value?: string } }>) => void this.onKernelDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"Notebook kernel\"\n >\n ${currentLabel}\n </wa-button>\n ${kernels.map(\n (c) => html`\n <wa-dropdown-item\n value=${c.id}\n type=\"checkbox\"\n ?checked=${c.id === this.selectedKernelId}\n >\n ${c.label}\n </wa-dropdown-item>\n `\n )}\n </wa-dropdown>\n ${runAllButton}\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.clearAllOutputs()}\n title=\"Clear all outputs and reset execution counter\"\n >\n <wa-icon name=\"eraser\" label=\"Clear\"></wa-icon>\n Clear Outputs\n </wa-button>\n ${this.kernel?.restart ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => void this.restartKernel()}\n title=\"Restart kernel\"\n ?disabled=${!this.kernelConnected || this.kernelConnecting}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Restart\"></wa-icon>\n Restart Kernel\n </wa-button>\n ` : ''}\n ${this.kernel?.openPackageManager ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n ` : ''}\n ${this.kernel ? (this.kernel.connect ? html`\n <wa-button\n appearance=\"plain\"\n size=\"small\"\n style=\"display: flex; align-items: center; gap: 0.5rem;\"\n ?disabled=${this.kernelConnecting}\n @click=${() => void this.connectKernel()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n ` : html`\n <span style=\"display: flex; align-items: center; gap: 0.5rem;\" title=${connectionTitle}>\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </span>\n `) : ''}\n `;\n }\n\n private async connectKernel(): Promise<void> {\n if (this.kernelConnecting || !this.kernel?.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.connectKernelWithRequiredPackages(this.kernel);\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (err) {\n logger.error('Failed to connect kernel', err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n protected async doInitUI() {\n this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target === TARGET_NOTEBOOK_KERNELS) {\n void this.refreshKernels();\n }\n });\n await this.refreshKernels();\n }\n\n private resolveDefaultKernelId(contributions: NotebookKernelContribution[]): string | null {\n if (!contributions.length) return null;\n const fromMeta = this.notebook?.metadata?.kernel;\n if (fromMeta && contributions.some((c) => c.id === fromMeta)) return fromMeta;\n const python = contributions.find((c) => c.id === 'python');\n if (python) return python.id;\n const js = contributions.find((c) => c.id === 'javascript');\n if (js) return js.id;\n return contributions[0].id;\n }\n\n private async refreshKernels(): Promise<void> {\n const contributions = contributionRegistry.getContributions<NotebookKernelContribution>(TARGET_NOTEBOOK_KERNELS);\n this.availableKernels = contributions;\n if (!this.selectedKernelId && contributions.length) {\n this.selectedKernelId = this.resolveDefaultKernelId(contributions);\n if (this.notebook && this.selectedKernelId) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = this.selectedKernelId;\n }\n }\n if (this.selectedKernelId && !contributions.some((c) => c.id === this.selectedKernelId)) {\n this.selectedKernelId = contributions.length ? contributions[0].id : null;\n }\n this.requestUpdate();\n await this.ensureKernelLoaded();\n }\n\n private async ensureKernelLoaded(): Promise<void> {\n const id = this.selectedKernelId;\n if (!id) return;\n if (this.kernel?.id === id) {\n if (!this.kernel.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.connectKernelWithRequiredPackages(this.kernel);\n this.kernelConnected = true;\n if (this.kernel.getVersion) {\n this.kernelVersion = await this.kernel.getVersion();\n }\n } catch (err) {\n logger.error('Failed to reconnect kernel with required packages', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n return;\n }\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n const contribution = this.availableKernels.find((c) => c.id === id);\n if (!contribution) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n const k = await contribution.loadKernel();\n if (this.selectedKernelId !== id) return;\n this.kernel = k;\n if (k.connect) {\n await this.connectKernelWithRequiredPackages(k);\n }\n this.kernelConnected = true;\n if (k.getVersion) {\n this.kernelVersion = await k.getVersion();\n }\n } catch (err) {\n logger.error('Failed to load kernel', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n private async loadNotebook() {\n const file: File = this.input!.data;\n const contents = await file.getContents();\n\n try {\n this.notebook = JSON.parse(contents as string);\n } catch (e) {\n console.error(\"Failed to parse notebook:\", e);\n this.notebook = {\n cells: [{\n cell_type: 'markdown',\n source: ['# Error\\nFailed to parse notebook file.']\n }]\n };\n }\n\n if (this.notebook?.metadata?.kernel) {\n this.selectedKernelId = this.notebook.metadata.kernel;\n }\n\n if (this.notebook?.cells) {\n const maxCount = this.notebook.cells\n .filter(cell => cell.cell_type === 'code')\n .map(cell => cell.execution_count ?? 0)\n .reduce((max, count) => Math.max(max, count), 0);\n this.executionCounter = maxCount;\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code' && cell.outputs && cell.outputs.length > 0) {\n const output = this.convertOutputFromJupyter(cell.outputs[0]);\n if (output) {\n this.cellOutputs.set(index, output);\n }\n }\n });\n }\n\n void this.refreshKernels();\n }\n\n private getCellSource(cell: NotebookCell): string {\n return Array.isArray(cell.source) ? cell.source.join('') : cell.source;\n }\n\n private convertOutputToJupyter(output: any, executionCount: number | null | undefined): any[] {\n if (output.type === 'execute_result') {\n const data: any = {};\n if (output.imageData) data['image/png'] = output.imageData;\n if (output.data) data['text/plain'] = output.data;\n return [{\n output_type: 'execute_result',\n data,\n execution_count: executionCount,\n metadata: {}\n }];\n } else if (output.type === 'error') {\n return [{\n output_type: 'error',\n ename: 'Error',\n evalue: output.data,\n traceback: [output.data]\n }];\n }\n return [];\n }\n\n private convertOutputFromJupyter(jupyterOutput: any): any | null {\n if (jupyterOutput.output_type === 'execute_result' && jupyterOutput.data) {\n return {\n type: 'execute_result',\n data: jupyterOutput.data['text/plain'] || '',\n imageData: jupyterOutput.data['image/png'] || undefined\n };\n } else if (jupyterOutput.output_type === 'error') {\n return {\n type: 'error',\n data: jupyterOutput.evalue || jupyterOutput.traceback?.join('\\n') || 'Unknown error'\n };\n }\n return null;\n }\n\n private renderHeaderActions(index: number, additionalButton?: any) {\n return html`\n <div class=\"cell-header-actions\">\n ${additionalButton || ''}\n ${additionalButton ? html`<span class=\"divider\"></span>` : ''}\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'code')} title=\"Add code cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'markdown')} title=\"Add markdown cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n </wa-button>\n <span class=\"divider\"></span>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.deleteCell(index)} title=\"Delete cell\" ?disabled=${this.notebook!.cells.length <= 1}>\n <wa-icon name=\"trash\" label=\"Delete cell\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n private renderFooterActions(index: number) {\n return html`\n <div class=\"cell-footer\">\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'code')} title=\"Add code cell after\">\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'markdown')} title=\"Add markdown cell after\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n // Helper to convert string to Jupyter source format\n private stringToSourceArray(content: string): string[] {\n if (!content) return [''];\n const lines = content.split('\\n').map(line => line + '\\n');\n // Remove trailing newline from last line\n if (lines.length > 0) {\n lines[lines.length - 1] = lines[lines.length - 1].replace(/\\n$/, '');\n }\n return lines;\n }\n\n // Helper to create a new cell\n private createCell(cellType: 'code' | 'markdown'): NotebookCell {\n const newCell: NotebookCell = {\n cell_type: cellType,\n source: [''],\n metadata: {}\n };\n\n if (cellType === 'code') {\n newCell.execution_count = null;\n newCell.outputs = [];\n }\n\n return newCell;\n }\n\n public async executeCell(cellIndex: number) {\n const cell = this.notebook!.cells[cellIndex];\n if (cell.cell_type !== 'code') return;\n\n this.executingCells.add(cellIndex);\n this.requestUpdate();\n\n try {\n await this.ensureKernelLoaded();\n const k = this.kernel;\n if (!k) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: 'No kernel selected' });\n }\n return;\n }\n\n const widget = this.getCellWidgetRef(cellIndex).value;\n const code =\n widget && typeof (widget as { getContent?: unknown }).getContent === 'function'\n ? (widget as DocksMonacoWidget).getContent()\n : this.getCellSource(cell);\n if (code === null || code === undefined) return;\n\n const result = await k.execute(code);\n\n if (result.error) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: result.error });\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'execute_result',\n data: result.data,\n imageData: result.imageData,\n });\n }\n\n this.executionCounter++;\n cell.execution_count = this.executionCounter;\n this.markDirty(true);\n } catch (error) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: error instanceof Error ? error.message : String(error),\n });\n }\n } finally {\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private cancelExecution(cellIndex: number) {\n if (this.kernel?.interrupt) {\n this.kernel.interrupt();\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: 'Cancellation not supported for this kernel',\n });\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private clearAllOutputs() {\n // Clear all outputs\n this.cellOutputs.clear();\n\n // Reset execution counter\n this.executionCounter = 0;\n\n // Reset execution counts on all code cells\n if (this.notebook?.cells) {\n this.notebook.cells.forEach(cell => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n }\n\n // Mark as dirty since we've modified the notebook\n this.markDirty(true);\n\n // Force re-render\n this.requestUpdate();\n }\n\n private async restartKernel() {\n if (!this.kernel?.restart || this.kernelConnecting) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n await this.kernel.restart();\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (error) {\n logger.error('Failed to restart kernel', error);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n }\n }\n\n private async runAllCells() {\n if (!this.notebook?.cells) return;\n\n this.isRunningAll = true;\n this.cancelRunAll = false;\n this.requestUpdate();\n\n try {\n // Execute all code cells sequentially\n for (let i = 0; i < this.notebook.cells.length; i++) {\n // Check if cancellation was requested\n if (this.cancelRunAll) {\n break;\n }\n\n const cell = this.notebook.cells[i];\n if (cell.cell_type === 'code') {\n await this.executeCell(i);\n }\n }\n } finally {\n this.isRunningAll = false;\n this.cancelRunAll = false;\n this.requestUpdate();\n }\n }\n\n private cancelAllCells() {\n this.cancelRunAll = true;\n this.kernel?.interrupt?.();\n }\n\n private toggleMarkdownEdit(index: number) {\n if (this.editingMarkdownCells.has(index)) {\n this.editingMarkdownCells.delete(index);\n } else {\n this.editingMarkdownCells.add(index);\n }\n this.requestUpdate();\n }\n\n private saveMarkdownEdit(index: number, event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n const newContent = textarea.value;\n\n // Update the cell source\n if (this.notebook && this.notebook.cells[index]) {\n const cell = this.notebook.cells[index];\n const oldContent = this.getCellSource(cell);\n\n cell.source = this.stringToSourceArray(newContent);\n\n // Mark dirty if content changed\n if (oldContent !== newContent) {\n this.markDirty(true);\n }\n }\n\n this.editingMarkdownCells.delete(index);\n this.requestUpdate();\n }\n\n private renderMarkdownCell(cell: NotebookCell, index: number) {\n const source = this.getCellSource(cell);\n const isEmpty = !source || source.trim() === '';\n const isEditing = this.editingMarkdownCells.has(index);\n\n if (isEditing) {\n const editButtons = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${(e: Event) => {\n const textarea = (e.target as HTMLElement).closest('.markdown-cell')?.querySelector('textarea');\n if (textarea) {\n this.saveMarkdownEdit(index, { target: textarea } as any);\n }\n }}\n title=\"Save changes\">\n <wa-icon name=\"check\" label=\"Save\"></wa-icon>\n </wa-button>\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Cancel editing\">\n <wa-icon name=\"xmark\" label=\"Cancel\"></wa-icon>\n </wa-button>\n `;\n \n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell editing\">\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButtons)}\n <span class=\"cell-label\">Markdown</span>\n </div>\n <textarea \n class=\"markdown-editor\"\n .value=${source}\n @blur=${(e: Event) => this.saveMarkdownEdit(index, e)}\n placeholder=\"Enter markdown content here... (# for headings, ** for bold, etc.)\"></textarea>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n const rendered = marked.parse(source) as string;\n\n const editButton = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Edit markdown\">\n <wa-icon name=\"pencil\" label=\"Edit\"></wa-icon>\n </wa-button>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell ${isEmpty ? 'empty' : ''}\" @dblclick=${() => this.toggleMarkdownEdit(index)}>\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButton)}\n <span class=\"cell-label\"></span>\n </div>\n <div class=\"cell-content\">\n ${isEmpty ? html`\n <div class=\"markdown-placeholder\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <span>Double-click or click the pencil icon to edit markdown</span>\n </div>\n ` : unsafeHTML(rendered)}\n </div>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCodeCell(cell: NotebookCell, index: number) {\n const output = this.cellOutputs.get(index);\n const isExecuting = this.executingCells.has(index);\n const source = this.getCellSource(cell);\n const language = this.kernel?.language ?? 'javascript';\n const notebookPath = (this.input?.data as File)?.getWorkspacePath?.() ?? 'notebook';\n const cellUri = `${notebookPath}-cell-${index}`;\n const cellHeight = this.cellHeights.get(index) ?? Math.max(100, source.split('\\n').length * 19 + 10);\n\n const runButton = isExecuting ? html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.cancelExecution(index)}\n title=\"Stop execution\">\n <wa-icon name=\"stop\" label=\"Stop\" style=\"color: var(--wa-color-danger-500);\"></wa-icon>\n </wa-button>\n ` : html`\n <docks-command \n cmd=\"notebook.runCell\"\n icon=\"play\"\n title=\"Run cell\"\n size=\"small\"\n appearance=\"plain\"\n .params=${{ cellIndex: index }}>\n </docks-command>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell code-cell ${isExecuting ? 'executing' : ''}\">\n <div class=\"cell-header\">\n <span class=\"cell-label\">\n ${isExecuting ? html`\n In [<wa-animation name=\"pulse\" duration=\"1000\" iterations=\"Infinity\" ?play=${isExecuting}>\n <span class=\"executing-indicator\">*</span>\n </wa-animation>]\n ` : html`\n In [${cell.execution_count ?? ' '}]\n `}\n </span>\n ${this.renderHeaderActions(index, runButton)}\n </div>\n <div\n class=\"cell-input monaco-container\"\n style=${styleMap({ height: `${cellHeight}px` })}\n @wheel=${(e: WheelEvent) => this.onCellWheel(index, e)}\n >\n <docks-monaco-widget\n .value=${source}\n .language=${language}\n .uri=${cellUri}\n ?autoLayout=${true}\n @content-change=${() => this.markDirty(true)}\n @editor-focus=${() => { this.focusedCellIndex = index; }}\n @editor-blur=${() => { if (this.focusedCellIndex === index) this.focusedCellIndex = -1; }}\n @content-height-changed=${(e: CustomEvent<{ height: number }>) => this.onCellHeightChange(index, e.detail.height)}\n ${ref(this.getCellWidgetRef(index))}\n ></docks-monaco-widget>\n </div>\n ${output ? html`\n <div class=\"cell-output ${output.type === 'error' ? 'output-error' : ''}\">\n <div class=\"output-label\">Out [${index + 1}]:</div>\n ${output.imageData ? html`\n <img src=\"data:image/png;base64,${output.imageData}\" alt=\"Output image\" class=\"output-image\" />\n ` : ''}\n ${output.data ? html`<pre><code>${output.data}</code></pre>` : ''}\n </div>\n ` : ''}\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCell(cell: NotebookCell, index: number) {\n if (cell.cell_type === 'markdown') {\n return this.renderMarkdownCell(cell, index);\n } else if (cell.cell_type === 'code') {\n return this.renderCodeCell(cell, index);\n } else {\n // raw cell\n const source = this.getCellSource(cell);\n return html`\n <div class=\"cell raw-cell\">\n <pre><code>${source}</code></pre>\n </div>\n `;\n }\n }\n\n private addCell(index: number, cellType: 'code' | 'markdown' = 'code') {\n if (!this.notebook) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n this.shiftIndices(index, 'up');\n \n this.notebook.cells.splice(index, 0, this.createCell(cellType));\n \n // Automatically enter edit mode for new markdown cells\n if (cellType === 'markdown') {\n this.editingMarkdownCells.add(index);\n }\n \n this.resetCellState();\n \n // Trigger animation and scroll to the new cell\n this.highlightedCellIndex = index;\n this.updateComplete.then(() => {\n this.scrollToCell(index);\n });\n }\n\n private scrollToCell(index: number) {\n // Find the cell wrapper element\n const cellWrapper = this.shadowRoot?.querySelectorAll('.cell-wrapper')[index];\n if (!cellWrapper) return;\n\n // Find the wa-scroller container (parent of this component)\n const scroller = this.closest('wa-scroller');\n if (!scroller) {\n // Fallback to default scrollIntoView if no scroller found\n cellWrapper.scrollIntoView({ \n behavior: 'smooth', \n block: 'center',\n inline: 'nearest'\n });\n return;\n }\n\n // Manually scroll the wa-scroller to the cell position\n const scrollerRect = scroller.getBoundingClientRect();\n const cellRect = cellWrapper.getBoundingClientRect();\n const scrollTop = scroller.scrollTop;\n \n // Calculate target scroll position (center the cell)\n const targetScroll = scrollTop + (cellRect.top - scrollerRect.top) - (scrollerRect.height / 2) + (cellRect.height / 2);\n \n scroller.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n }\n\n private saveEditorContents() {\n this.notebook?.cells.forEach((cell, index) => {\n if (cell.cell_type !== 'code') return;\n const widget = this.getCellWidgetRef(index).value;\n const value =\n widget && typeof (widget as { getContent?: unknown }).getContent === 'function'\n ? (widget as DocksMonacoWidget).getContent()\n : undefined;\n if (value !== undefined && value !== null) {\n cell.source = this.stringToSourceArray(value);\n }\n });\n }\n\n private resetCellState() {\n this.markDirty(true);\n }\n\n private deleteCell(index: number) {\n if (!this.notebook || this.notebook.cells.length <= 1) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n // Remove state for the deleted cell\n this.cellOutputs.delete(index);\n this.executingCells.delete(index);\n this.editingMarkdownCells.delete(index);\n \n this.notebook.cells.splice(index, 1);\n \n this.shiftIndices(index, 'down');\n \n this.resetCellState();\n }\n\n private shiftIndices(startIndex: number, direction: 'up' | 'down') {\n const shift = direction === 'up' ? 1 : -1;\n const filterFn = direction === 'up' \n ? (idx: number) => idx >= startIndex\n : (idx: number) => idx > startIndex;\n const sortFn = direction === 'up'\n ? (a: number, b: number) => b - a\n : (a: number, b: number) => a - b;\n\n const shiftMap = <T>(map: Map<number, T>) => {\n const indices = Array.from(map.keys()).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n const value = map.get(oldIndex);\n map.delete(oldIndex);\n map.set(oldIndex + shift, value!);\n });\n };\n\n const shiftSet = (set: Set<number>) => {\n const indices = Array.from(set).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n set.delete(oldIndex);\n set.add(oldIndex + shift);\n });\n };\n\n shiftMap(this.cellOutputs);\n shiftSet(this.executingCells);\n shiftSet(this.editingMarkdownCells);\n shiftMap(this.cellWidgetRefs);\n shiftMap(this.cellHeights);\n }\n\n private getCellWidgetRef(index: number): Ref<DocksMonacoWidget> {\n if (!this.cellWidgetRefs.has(index)) {\n this.cellWidgetRefs.set(index, createRef());\n }\n return this.cellWidgetRefs.get(index)!;\n }\n\n private onCellHeightChange(index: number, height: number): void {\n const padding = 10;\n const minHeight = 100;\n const newHeight = Math.max(minHeight, height + padding);\n const current = this.cellHeights.get(index);\n if (current === newHeight) return;\n this.cellHeights = new Map(this.cellHeights);\n this.cellHeights.set(index, newHeight);\n this.requestUpdate();\n this.updateComplete.then(() => (this.getCellWidgetRef(index).value as { layout?: () => void })?.layout?.());\n }\n\n private onCellWheel(index: number, e: WheelEvent): void {\n const widget = this.getCellWidgetRef(index).value;\n const editor = widget?.getEditor();\n if (!editor) return;\n const scrollTop = editor.getScrollTop();\n const scrollHeight = editor.getScrollHeight();\n const contentHeight = editor.getContentHeight();\n const canScroll = scrollHeight > contentHeight;\n const atBoundary = (e.deltaY < 0 && scrollTop <= 0) ||\n (e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight);\n if (!canScroll || atBoundary) {\n e.stopImmediatePropagation();\n }\n }\n\n private openPackageManager() {\n if (!this.kernel?.openPackageManager) return;\n const packages = this.notebook?.metadata?.required_packages ?? [];\n this.kernel.openPackageManager({\n requiredPackages: packages,\n onPackageAdded: (packageName: string) => {\n if (!this.notebook) return;\n if (!this.notebook.metadata) this.notebook.metadata = {};\n if (!this.notebook.metadata.required_packages) this.notebook.metadata.required_packages = [];\n if (!this.notebook.metadata.required_packages.includes(packageName)) {\n this.notebook.metadata.required_packages.push(packageName);\n this.markDirty(true);\n void this.syncKernelPackages();\n }\n },\n onPackageRemoved: (packageName: string) => {\n if (!this.notebook?.metadata?.required_packages) return;\n const index = this.notebook.metadata.required_packages.indexOf(packageName);\n if (index > -1) {\n this.notebook.metadata.required_packages.splice(index, 1);\n this.markDirty(true);\n void this.syncKernelPackages();\n }\n },\n });\n }\n\n private async connectKernelWithRequiredPackages(kernel: NotebookKernel): Promise<void> {\n if (!kernel.connect) return;\n await kernel.connect({\n requiredPackages: this.notebook?.metadata?.required_packages ?? [],\n });\n }\n\n private async syncKernelPackages(): Promise<void> {\n if (!this.kernel?.connect) return;\n try {\n await this.connectKernelWithRequiredPackages(this.kernel);\n } catch (err) {\n logger.error('Failed to sync kernel packages', err);\n }\n }\n\n protected updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('kernelConnected') ||\n changedProperties.has('kernelConnecting') ||\n changedProperties.has('kernelVersion') ||\n changedProperties.has('isRunningAll') ||\n changedProperties.has('availableKernels') ||\n changedProperties.has('selectedKernelId')\n ) {\n }\n }\n\n protected renderContent() {\n if (!this.notebook) {\n return html`<div class=\"loading\">Loading notebook...</div>`;\n }\n\n return html`\n <div class=\"noteboocells\">\n ${repeat(\n this.notebook.cells,\n (_cell, index) => index,\n (cell, index) => this.renderCell(cell, index)\n )}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .kernel-select {\n max-width: 10rem;\n }\n\n .noteboocells {\n display: flex;\n flex-direction: column;\n gap: 3rem;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem 1rem;\n width: 100%;\n box-sizing: border-box;\n }\n\n .cell-wrapper {\n position: relative;\n }\n\n .cell {\n border-radius: 4px;\n overflow: hidden;\n opacity: 0.9;\n position: relative;\n }\n\n .cell-header-actions {\n display: flex;\n gap: 0.25rem;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-header-actions .divider {\n width: 1px;\n height: 1rem;\n background: var(--wa-color-outline);\n margin: 0 0.25rem;\n opacity: 0.5;\n }\n\n .cell-header:hover .cell-header-actions {\n opacity: 1;\n }\n\n .cell-footer {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n justify-content: flex-start;\n padding: 0.5rem;\n border-top: 1px solid var(--wa-color-outline);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-footer:hover {\n opacity: 1;\n }\n\n .markdown-cell {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .markdown-cell:hover:not(.editing) {\n opacity: 0.9;\n }\n \n .markdown-cell .cell-content {\n padding: 1rem;\n }\n\n .markdown-cell.editing {\n cursor: default;\n padding: 0;\n }\n \n .markdown-cell.editing .cell-actions {\n display: none;\n }\n\n .markdown-editor {\n width: 100%;\n min-height: 200px;\n padding: 1rem;\n font-family: monospace;\n font-size: 0.95rem;\n line-height: 1.6;\n border: none;\n outline: none;\n resize: vertical;\n background: transparent;\n color: inherit;\n }\n\n .code-cell {\n border-left: 3px solid var(--wa-color-primary-500);\n transition: all 0.3s ease;\n }\n \n .code-cell.executing {\n border-left: 4px solid var(--wa-color-primary-500);\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n animation: pulse-cell 2s ease-in-out infinite;\n }\n \n @keyframes pulse-cell {\n 0%, 100% {\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n opacity: 1;\n }\n 50% {\n box-shadow: 0 0 0 4px var(--wa-color-primary-500, rgba(59, 130, 246, 0.5));\n opacity: 0.95;\n }\n }\n\n .cell-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n flex-wrap: nowrap;\n }\n\n .cell-label {\n font-family: monospace;\n font-weight: bold;\n flex-shrink: 0;\n }\n \n .executing-indicator {\n display: inline-block;\n color: var(--wa-color-primary-500);\n font-weight: bold;\n font-size: 1.2em;\n }\n\n .cell-input {\n margin: 0;\n }\n\n .monaco-container {\n min-height: 100px;\n height: auto;\n width: 100%;\n }\n\n .cell-output {\n padding: 1rem;\n }\n\n .output-label {\n font-family: monospace;\n font-weight: bold;\n margin-bottom: 0.5rem;\n opacity: 0.7;\n }\n\n .cell-output pre {\n margin: 0;\n overflow-x: auto;\n }\n\n .cell-output code {\n font-family: 'Courier New', monospace;\n font-size: 0.9rem;\n line-height: 1.5;\n }\n\n .output-image {\n max-width: 100%;\n height: auto;\n display: block;\n margin: 0.5rem 0;\n border-radius: 4px;\n }\n\n .output-error {\n border-left: 3px solid var(--wa-color-danger-500);\n }\n\n .raw-cell {\n padding: 1rem;\n }\n\n .raw-cell pre {\n margin: 0;\n }\n\n .loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 1.2rem;\n }\n\n .markdown-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n opacity: 0.5;\n font-style: italic;\n transition: opacity 0.2s;\n }\n\n .markdown-cell.empty:hover .markdown-placeholder {\n opacity: 0.8;\n }\n\n .markdown-placeholder wa-icon {\n font-size: 1.5rem;\n }\n `;\n}\n"],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- //#region src/notebook-types.ts
2
- function isNotebookEditorLike(value) {
3
- return Boolean(value && typeof value.executeCell === "function" && typeof value.focusedCellIndex === "number");
4
- }
5
- //#endregion
6
- export { isNotebookEditorLike as t };
7
-
8
- //# sourceMappingURL=notebook-types-6XV6fOSV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-types-6XV6fOSV.js","names":[],"sources":["../src/notebook-types.ts"],"sourcesContent":["export interface NotebookCell {\n cell_type: 'code' | 'markdown' | 'raw';\n source: string | string[];\n outputs?: any[];\n execution_count?: number | null;\n metadata?: any;\n}\n\nexport interface NotebookData {\n cells: NotebookCell[];\n metadata?: {\n kernel?: string;\n required_packages?: string[];\n [key: string]: any;\n };\n nbformat?: number;\n nbformat_minor?: number;\n}\n\nexport interface NotebookEditorLike {\n notebook?: NotebookData;\n focusedCellIndex: number;\n executeCell(index: number): Promise<void>;\n}\n\nexport function isNotebookEditorLike(value: unknown): value is NotebookEditorLike {\n return Boolean(\n value &&\n typeof (value as NotebookEditorLike).executeCell === 'function' &&\n typeof (value as NotebookEditorLike).focusedCellIndex === 'number'\n );\n}\n\n\n"],"mappings":";AAyBA,SAAgB,qBAAqB,OAA6C;AAC9E,QAAO,QACH,SACA,OAAQ,MAA6B,gBAAgB,cACrD,OAAQ,MAA6B,qBAAqB,SAC7D"}