@tlockney/cdp-kernel 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +5 -3
  2. package/dist/browser/channels.d.ts +27 -0
  3. package/dist/browser/channels.js +90 -0
  4. package/dist/browser/kernel.js +29800 -0
  5. package/dist/browser/kernel.js.map +7 -0
  6. package/dist/browser/mod.d.ts +25 -0
  7. package/dist/browser/mod.js +41 -0
  8. package/dist/browser/target.d.ts +94 -0
  9. package/dist/browser/target.js +264 -0
  10. package/dist/browser/worker.js +1071 -0
  11. package/dist/browser/worker.js.map +7 -0
  12. package/dist/bun-target.d.ts +2 -0
  13. package/dist/bun-target.js +15 -2
  14. package/dist/cdp.d.ts +11 -0
  15. package/dist/cdp.js +34 -7
  16. package/dist/celld-target.js +3 -2
  17. package/dist/debugger.d.ts +2 -0
  18. package/dist/debugger.js +63 -11
  19. package/dist/kernel-core.d.ts +78 -0
  20. package/dist/kernel-core.js +824 -0
  21. package/dist/kernel.d.ts +6 -1
  22. package/dist/kernel.js +104 -723
  23. package/dist/main.js +11 -4
  24. package/dist/message.d.ts +34 -0
  25. package/dist/message.js +14 -0
  26. package/dist/package.d.ts +2 -2
  27. package/dist/package.js +2 -2
  28. package/dist/target-api.d.ts +92 -0
  29. package/dist/target-api.js +48 -0
  30. package/dist/target.d.ts +5 -76
  31. package/dist/target.js +62 -33
  32. package/dist/traceback.d.ts +75 -0
  33. package/dist/traceback.js +200 -0
  34. package/dist/transform.d.ts +1 -0
  35. package/dist/transform.js +8 -1
  36. package/dist/wire.d.ts +4 -24
  37. package/dist/wire.js +3 -12
  38. package/dist/workerd-target.d.ts +6 -1
  39. package/dist/workerd-target.js +56 -12
  40. package/dist/workers-project.d.ts +1 -1
  41. package/dist/workers-project.js +4 -3
  42. package/dist/zmq-channels.d.ts +14 -0
  43. package/dist/zmq-channels.js +59 -0
  44. package/package.json +9 -2
  45. package/runtime/bootstrap.mjs +2 -0
  46. package/runtime/browser-worker.mjs +202 -0
  47. package/runtime/cdn.d.mts +2 -0
  48. package/runtime/cdn.mjs +17 -0
  49. package/runtime/display.mjs +202 -1
  50. package/runtime/evaluator.mjs +2 -0
  51. package/runtime/format.d.mts +2 -0
  52. package/runtime/format.mjs +125 -0
  53. package/runtime/workerd-worker.mjs +2 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../runtime/comm.mjs", "../../runtime/widget.mjs", "../../runtime/display.mjs", "../../runtime/evaluator.mjs", "../../runtime/format.mjs", "../../runtime/introspect.mjs", "../../runtime/cdn.mjs", "../../runtime/browser-worker.mjs"],
4
+ "sourcesContent": ["// @ts-self-types=\"./comm.d.mts\"\n// Jupyter comms: bidirectional channels between kernel and frontend, the\n// transport ipywidgets and anywidget are built on (#9). Runs inside the\n// target runtime.\n//\n// Kernel-to-frontend messages (comm_open, comm_msg, comm_close) go out\n// through `send`, the same ordered path as display messages. Frontend\n// messages arrive from the host through `dispatch`, which returns whether\n// anything in the kernel handled them, so the host can answer an unknown\n// target's comm_open with a comm_close, as the protocol asks.\n\nclass Comm {\n #send;\n #onClosed;\n #msgHandlers = [];\n #closeHandlers = [];\n closed = false;\n\n constructor(id, targetName, send, onClosed) {\n this.id = id;\n this.targetName = targetName;\n this.#send = send;\n this.#onClosed = onClosed;\n }\n\n send(data = {}, { metadata = {}, buffers = [] } = {}) {\n if (this.closed) return;\n this.#send(\"comm_msg\", { comm_id: this.id, data }, metadata, buffers);\n }\n\n close(data = {}, { metadata = {}, buffers = [] } = {}) {\n if (this.closed) return;\n this.#send(\"comm_close\", { comm_id: this.id, data }, metadata, buffers);\n // close() is synchronous for callers; its close handlers run detached.\n void this._closed({ data, metadata, buffers });\n }\n\n onMsg(handler) {\n this.#msgHandlers.push(handler);\n }\n\n onClose(handler) {\n this.#closeHandlers.push(handler);\n }\n\n async _receive(msg) {\n for (const handler of this.#msgHandlers) await handler(msg);\n }\n\n async _closed(msg) {\n if (this.closed) return;\n this.closed = true;\n this.#onClosed(this.id);\n for (const handler of this.#closeHandlers) await handler(msg);\n }\n}\n\n/**\n * @param {(msgType: string, content: object, metadata: object, buffers: Uint8Array[]) => void} send\n * @param {() => string} [newId]\n */\nexport function createComms(send, newId = () => crypto.randomUUID()) {\n const comms = new Map(); // comm_id -> Comm\n const targets = new Map(); // target_name -> handler\n const forget = (id) => comms.delete(id);\n\n function track(id, targetName) {\n const comm = new Comm(id, targetName, send, forget);\n comms.set(id, comm);\n return comm;\n }\n\n const api = {\n open(targetName, data = {}, { metadata = {}, buffers = [] } = {}) {\n const comm = track(newId(), targetName);\n send(\"comm_open\", { comm_id: comm.id, target_name: targetName, data }, metadata, buffers);\n return comm;\n },\n registerTarget(targetName, handler) {\n targets.set(targetName, handler);\n },\n unregisterTarget(targetName) {\n targets.delete(targetName);\n },\n };\n\n async function dispatch(msgType, content, metadata, buffers) {\n const msg = { data: content.data ?? {}, metadata: metadata ?? {}, buffers: buffers ?? [] };\n if (msgType === \"comm_open\") {\n const handler = targets.get(content.target_name);\n if (!handler) return false;\n const comm = track(content.comm_id, content.target_name);\n try {\n await handler(comm, msg);\n } catch (err) {\n // The host answers a failed comm_open with comm_close, so the comm\n // is gone on the frontend: drop it here too, without running close\n // handlers or sending anything (#137).\n comm.closed = true;\n forget(comm.id);\n throw err;\n }\n return true;\n }\n const comm = comms.get(content.comm_id);\n if (!comm) return false;\n if (msgType === \"comm_msg\") await comm._receive(msg);\n else if (msgType === \"comm_close\") await comm._closed(msg);\n else return false;\n return true;\n }\n\n function list() {\n return [...comms.values()].map((comm) => ({ commId: comm.id, targetName: comm.targetName }));\n }\n\n return { api, dispatch, list };\n}\n", "// @ts-self-types=\"./widget.d.mts\"\n// anywidget-compatible widgets over Jupyter comms (#9): the kernel half of\n// the ipywidgets model protocol (version 2.1.0) for anywidget's AnyModel,\n// whose frontend is the `anywidget` JupyterLab/Notebook/VS Code extension.\n//\n// const counter = jupyter.widget({ esm, state: { count: 0 } });\n// counter // display it\n// counter.get(\"count\"); counter.set(\"count\", 1);\n// counter.on(\"change:count\", (value, old) => ...);\n//\n// State is synced as in ipywidgets: `update` messages carry changed keys,\n// with binary values lifted out into message buffers at `buffer_paths`\n// (ipywidgets' _remove_buffers/_put_buffers).\n\nexport const WIDGET_PROTOCOL_VERSION = \"2.1.0\";\nconst WIDGET_TARGET = \"jupyter.widget\";\nconst CONTROL_TARGET = \"jupyter.widget.control\";\nconst VIEW_MIME = \"application/vnd.jupyter.widget-view+json\";\n\n// The anywidget model the frontend instantiates. The module version is a\n// semver range for the frontend's registry; anywidget sends \"~major.minor.*\"\n// of its own version, and \"*\" accepts whichever release is installed.\nconst ANYWIDGET_MODEL = {\n _model_name: \"AnyModel\",\n _model_module: \"anywidget\",\n _model_module_version: \"*\",\n _view_name: \"AnyView\",\n _view_module: \"anywidget\",\n _view_module_version: \"*\",\n _view_count: null,\n};\n\nfunction isBinary(value) {\n return value instanceof Uint8Array || value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\n\nfunction toBytes(value) {\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n}\n\n/** Copies `state` with binary values replaced by null, collecting them. */\nexport function removeBuffers(state) {\n const bufferPaths = [];\n const buffers = [];\n function walk(value, path) {\n if (isBinary(value)) {\n bufferPaths.push(path);\n buffers.push(toBytes(value));\n return null;\n }\n if (Array.isArray(value)) return value.map((item, i) => walk(item, [...path, i]));\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, walk(v, [...path, k])]));\n }\n return value;\n }\n return { state: walk(state, []), bufferPaths, buffers };\n}\n\n/** Puts received buffers back into `state` at `bufferPaths` (in place). */\nexport function putBuffers(state, bufferPaths = [], buffers = []) {\n bufferPaths.forEach((path, i) => {\n let obj = state;\n for (const key of path.slice(0, -1)) obj = obj[key];\n obj[path[path.length - 1]] = buffers[i];\n });\n return state;\n}\n\nclass Widget {\n #comm;\n #state;\n #listeners = new Map(); // event -> Set<listener>\n\n constructor(comm, state, $display) {\n this.#comm = comm;\n this.#state = state;\n this[$display] = () => ({\n [VIEW_MIME]: { version_major: 2, version_minor: 1, model_id: this.id },\n \"text/plain\": `Widget(${this.id})`,\n });\n }\n\n get id() {\n return this.#comm.id;\n }\n\n get closed() {\n return this.#comm.closed;\n }\n\n get(key) {\n return this.#state[key];\n }\n\n /** set(\"key\", value) or set({ key: value, ... }); syncs to the frontend. */\n set(keyOrChanges, value) {\n const changes = typeof keyOrChanges === \"string\" ? { [keyOrChanges]: value } : keyOrChanges;\n this.#apply(changes);\n if (this.closed) return;\n const { state, bufferPaths, buffers } = removeBuffers(changes);\n this.#comm.send({ method: \"update\", state, buffer_paths: bufferPaths }, { buffers });\n }\n\n on(event, listener) {\n if (!this.#listeners.has(event)) this.#listeners.set(event, new Set());\n this.#listeners.get(event).add(listener);\n }\n\n off(event, listener) {\n this.#listeners.get(event)?.delete(listener);\n }\n\n /** A custom message, delivered to the view's model.on(\"msg:custom\"). */\n send(content, buffers = []) {\n this.#comm.send({ method: \"custom\", content }, { buffers });\n }\n\n close() {\n this.#comm.close();\n }\n\n /** The full state, as the frontend sees it (for request_state). */\n fullState() {\n return { ...ANYWIDGET_MODEL, ...this.#state };\n }\n\n async #emit(event, ...args) {\n for (const listener of this.#listeners.get(event) ?? []) await listener(...args);\n }\n\n async #apply(changes) {\n const previous = {};\n for (const [key, value] of Object.entries(changes)) {\n previous[key] = this.#state[key];\n this.#state[key] = value;\n }\n for (const key of Object.keys(changes)) await this.#emit(`change:${key}`, changes[key], previous[key]);\n await this.#emit(\"change\", changes);\n }\n\n async _receive(msg) {\n const { method } = msg.data;\n if (method === \"update\") {\n const changes = putBuffers(msg.data.state ?? {}, msg.data.buffer_paths, msg.buffers);\n await this.#apply(changes);\n } else if (method === \"request_state\") {\n const { state, bufferPaths, buffers } = removeBuffers(this.fullState());\n this.#comm.send({ method: \"update\", state, buffer_paths: bufferPaths }, { buffers });\n } else if (method === \"custom\") {\n await this.#emit(\"msg:custom\", msg.data.content, msg.buffers);\n }\n }\n}\n\n/**\n * @param {import(\"./comm.d.mts\").CommApi} commApi\n * @param {symbol} $display\n */\nexport function createWidgetFactory(commApi, $display) {\n const live = new Map(); // model id -> Widget\n\n // The frontend opens this comm to restore every widget's state, e.g.\n // after the page reloads.\n commApi.registerTarget(CONTROL_TARGET, (control) => {\n control.onMsg((msg) => {\n if (msg.data.method !== \"request_states\") return;\n const states = {};\n for (const widget of live.values()) {\n const full = widget.fullState();\n states[widget.id] = {\n model_name: full._model_name,\n model_module: full._model_module,\n model_module_version: full._model_module_version,\n state: full,\n };\n }\n const { state, bufferPaths, buffers } = removeBuffers(states);\n control.send({ method: \"update_states\", states: state, buffer_paths: bufferPaths }, { buffers });\n });\n });\n\n return function widget({ esm, css, state = {} } = {}) {\n if (typeof esm !== \"string\") throw new TypeError(\"jupyter.widget needs an `esm` module string\");\n const initial = { ...state };\n const full = {\n ...ANYWIDGET_MODEL,\n _esm: esm,\n ...(css === undefined ? {} : { _css: css }),\n _anywidget_id: \"cdp-kernel.widget\",\n ...initial,\n };\n const { state: wire, bufferPaths, buffers } = removeBuffers(full);\n const comm = commApi.open(WIDGET_TARGET, { state: wire, buffer_paths: bufferPaths }, {\n metadata: { version: WIDGET_PROTOCOL_VERSION },\n buffers,\n });\n const instance = new Widget(comm, { ...full }, $display);\n live.set(comm.id, instance);\n comm.onMsg((msg) => instance._receive(msg));\n comm.onClose(() => {\n live.delete(comm.id);\n });\n return instance;\n };\n}\n", "// @ts-self-types=\"./display.d.mts\"\n// The Jupyter display API that Deno exposes as `Deno.jupyter`, made\n// runtime-neutral. Runs inside the target runtime (Node or Deno).\n//\n// Ported from Deno's cli/js/40_jupyter.js (v2.9.6), which is\n// Copyright 2018-2026 the Deno authors, MIT license. The formatting rules\n// (display symbol, canvas, Vega, Polars-style DataFrames, JPEG/PNG bytes,\n// HTML/SVG elements) are unchanged; the Deno internals it used are injected:\n// Deno[Deno.internal].inspectArgs -> host.inspect\n// op_base64_encode_from_buffer -> host.base64\n// Deno.readFileSync -> host.readFile\n// op_jupyter_broadcast -> host.send\n// WebGPU texture/buffer display depends on Deno's wgpu bindings and is\n// omitted. Comms and widgets (jupyter.comm, jupyter.widget) are additions\n// Deno doesn't have; see comm.mjs and widget.mjs.\n\nimport { createComms } from \"./comm.mjs\";\nimport { createWidgetFactory } from \"./widget.mjs\";\n\nexport const $display = Symbol.for(\"Jupyter.display\");\n\nconst rawToEntity = new Map([\n [\"&\", \"&amp;\"],\n [\"<\", \"&lt;\"],\n [\">\", \"&gt;\"],\n ['\"', \"&quot;\"],\n [\"'\", \"&#39;\"],\n]);\nconst rawRe = new RegExp(`[${[...rawToEntity.keys()].join(\"\")}]`, \"g\");\n\nexport function escapeHTML(str) {\n return str.replaceAll(rawRe, (m) => rawToEntity.get(m) ?? m);\n}\n\nfunction isVegaLike(obj) {\n return obj !== null && typeof obj === \"object\" && \"toSpec\" in obj;\n}\n\nfunction extractVega(obj) {\n const spec = obj.toSpec();\n if (typeof spec !== \"object\" || spec === null || !(\"$schema\" in spec)) return null;\n let mediaType = \"application/vnd.vega.v5+json\";\n if (spec.$schema === \"https://vega.github.io/schema/vega-lite/v4.json\") {\n mediaType = \"application/vnd.vegalite.v4+json\";\n } else if (spec.$schema === \"https://vega.github.io/schema/vega-lite/v5.json\") {\n mediaType = \"application/vnd.vegalite.v5+json\";\n }\n const summary = summarizeChart(spec);\n return summary === undefined ? { [mediaType]: spec } : { [mediaType]: spec, \"text/plain\": summary };\n}\n\n// A few lines of text/plain next to a chart, for frontends that can't draw\n// it (jupyter console, nbconvert to text, agents reading the notebook):\n// mark, encodings with value ranges, title and row count (#321). The\n// approach follows nteract's repr-llm summarize_viz (BSD-3).\nconst VL_TYPES = { Q: \"quantitative\", N: \"nominal\", O: \"ordinal\", T: \"temporal\", G: \"geojson\" };\nconst MAX_CHILDREN = 6;\n\nfunction clip(str, max = 60) {\n return str.length > max ? `${str.slice(0, max - 1)}\u2026` : str;\n}\n\nfunction formatNumber(n) {\n return Number.isInteger(n) ? String(n) : String(Number(n.toPrecision(4)));\n}\n\nfunction titleText(title) {\n const text = typeof title === \"object\" && title !== null && !Array.isArray(title) ? title.text : title;\n const str = Array.isArray(text) ? text.join(\" \") : typeof text === \"string\" ? text : \"\";\n return str ? ` \"${clip(str, 80)}\"` : \"\";\n}\n\nfunction getField(row, field) {\n if (row === null || typeof row !== \"object\") return undefined;\n if (field in row) return row[field];\n // Vega-Lite reads \"a.b\" as a nested path and \"a\\.b\" as a key with a dot.\n if (field.includes(\"\\\\\")) return row[field.replace(/\\\\(.)/g, \"$1\")];\n return field.split(\".\").reduce((obj, key) => (obj === null || typeof obj !== \"object\" ? undefined : obj[key]), row);\n}\n\nfunction fieldStats(rows, field, type) {\n const values = [];\n for (const row of rows) {\n const value = getField(row, field);\n if (value !== undefined && value !== null && value !== \"\") values.push(value);\n }\n if (values.length === 0) return \"\";\n if (type === \"quantitative\") {\n let min = Infinity;\n let max = -Infinity;\n for (const value of values) {\n const n = Number(value);\n if (!Number.isFinite(n)) continue;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (min > max) return \"\";\n return min === max ? formatNumber(min) : `${formatNumber(min)} to ${formatNumber(max)}`;\n }\n if (type === \"temporal\") {\n let min;\n let max;\n for (const value of values) {\n const t = value instanceof Date ? value.getTime() : typeof value === \"number\" ? value : Date.parse(String(value));\n if (!Number.isFinite(t)) continue;\n if (min === undefined || t < min.t) min = { t, value };\n if (max === undefined || t > max.t) max = { t, value };\n }\n if (min === undefined) return \"\";\n const show = ({ value }) =>\n typeof value === \"string\" ? clip(value, 30) : new Date(value instanceof Date ? value.getTime() : value).toISOString();\n return min.t === max.t ? show(min) : `${show(min)} to ${show(max)}`;\n }\n const distinct = new Set(values.map((value) => typeof value === \"object\" ? JSON.stringify(value) : String(value)));\n return `${distinct.size} ${distinct.size === 1 ? \"value\" : \"values\"}`;\n}\n\nfunction encodingSummary(encoding, rows) {\n const parts = [];\n for (const [channel, def] of Object.entries(encoding)) {\n if (channel === \"tooltip\" || def === null || typeof def !== \"object\" || Array.isArray(def)) continue;\n if (def.field === undefined && def.aggregate === undefined) continue;\n let name = typeof def.field === \"string\" ? def.field : def.field?.repeat ? `repeat ${def.field.repeat}` : \"\";\n if (def.aggregate !== undefined) name = `${def.aggregate}(${name})`;\n else if (def.timeUnit !== undefined) name = `${typeof def.timeUnit === \"string\" ? def.timeUnit : \"time\"}(${name})`;\n const type = VL_TYPES[def.type] ?? def.type;\n const details = [];\n if (typeof type === \"string\") details.push(type);\n if (rows && typeof def.field === \"string\" && def.aggregate === undefined) {\n const stats = fieldStats(rows, def.field, type);\n if (stats) details.push(stats);\n }\n parts.push(`${channel}=${clip(name, 40)}${details.length ? ` (${details.join(\", \")})` : \"\"}`);\n }\n return parts;\n}\n\nfunction vlRows(data, datasets) {\n if (data === null || typeof data !== \"object\") return undefined;\n if (Array.isArray(data.values)) return data.values;\n if (typeof data.name === \"string\" && Array.isArray(datasets?.[data.name])) return datasets[data.name];\n return undefined;\n}\n\nfunction vlDataNote(data, rows) {\n if (rows) return `${rows.length} ${rows.length === 1 ? \"row\" : \"rows\"}`;\n if (typeof data?.url === \"string\") return `data from ${clip(data.url)}`;\n return \"\";\n}\n\nfunction fieldList(def) {\n if (Array.isArray(def)) return def.join(\", \");\n if (def === null || typeof def !== \"object\") return \"\";\n if (typeof def.field === \"string\") return def.field;\n return Object.values(def).map(fieldList).filter(Boolean).join(\", \");\n}\n\nfunction summarizeVegaLiteView(spec, label, inherited, datasets, depth, lines) {\n const indent = \" \".repeat(depth);\n const data = spec.data ?? inherited.data;\n const rows = vlRows(data, datasets);\n const head = `${indent}${label}`;\n const title = titleText(spec.title);\n const children = spec.layer ?? spec.concat ?? spec.hconcat ?? spec.vconcat;\n if (Array.isArray(children)) {\n const noun = spec.layer ? \"layer\" : \"view\";\n const note = [`${children.length} ${children.length === 1 ? noun : `${noun}s`}`, vlDataNote(data, rows)].filter(Boolean);\n lines.push(`${head}${spec.layer ? \"layered\" : \"concatenated\"} chart${title}: ${note.join(\", \")}`);\n const encoding = spec.layer ? { ...inherited.encoding, ...spec.encoding } : {};\n children.slice(0, MAX_CHILDREN).forEach((child, i) => {\n if (child !== null && typeof child === \"object\") {\n summarizeVegaLiteView(child, `${noun} ${i + 1}: `, { data, encoding }, datasets, depth + 1, lines);\n }\n });\n if (children.length > MAX_CHILDREN) lines.push(`${indent} \u2026 ${children.length - MAX_CHILDREN} more`);\n return;\n }\n if ((spec.facet !== undefined || spec.repeat !== undefined) && spec.spec !== null && typeof spec.spec === \"object\") {\n const what = spec.facet !== undefined ? `faceted by ${fieldList(spec.facet)}` : `repeated over ${fieldList(spec.repeat)}`;\n const note = vlDataNote(data, rows);\n lines.push(`${head}chart${title} ${what}${note ? `, ${note}` : \"\"}`);\n summarizeVegaLiteView(spec.spec, \"each panel: \", { data, encoding: {} }, datasets, depth + 1, lines);\n return;\n }\n const mark = typeof spec.mark === \"string\" ? spec.mark : spec.mark?.type;\n const encoding = { ...inherited.encoding, ...spec.encoding };\n const parts = encodingSummary(encoding, rows);\n // A layer's rows were already counted on the layered chart's line.\n if (spec.data !== undefined || depth === 0) {\n const note = vlDataNote(data, rows);\n if (note) parts.push(note);\n }\n lines.push(`${head}${typeof mark === \"string\" ? `${mark} ` : \"\"}chart${title}${parts.length ? `: ${parts.join(\", \")}` : \"\"}`);\n}\n\nfunction vegaMarkTypes(marks, types) {\n if (!Array.isArray(marks)) return types;\n for (const mark of marks) {\n if (typeof mark?.type === \"string\") types.add(mark.type);\n vegaMarkTypes(mark?.marks, types);\n }\n return types;\n}\n\nfunction summarizeVega(spec) {\n const sections = [];\n const marks = [...vegaMarkTypes(spec.marks, new Set())];\n if (marks.length) sections.push(`marks ${marks.join(\", \")}`);\n const list = (items, describe) => {\n const shown = items.slice(0, MAX_CHILDREN).map(describe);\n if (items.length > MAX_CHILDREN) shown.push(`\u2026 ${items.length - MAX_CHILDREN} more`);\n return shown.join(\", \");\n };\n const data = Array.isArray(spec.data) ? spec.data.filter((d) => d !== null && typeof d === \"object\") : [];\n if (data.length) {\n sections.push(`data ${list(data, (d) => {\n const name = clip(String(d.name ?? \"?\"), 30);\n if (Array.isArray(d.values)) return `${name} (${d.values.length} ${d.values.length === 1 ? \"row\" : \"rows\"})`;\n if (typeof d.url === \"string\") return `${name} (from ${clip(d.url)})`;\n if (d.source !== undefined) return `${name} (from ${clip(String(d.source), 30)})`;\n return name;\n })}`);\n }\n const scales = Array.isArray(spec.scales) ? spec.scales.filter((s) => s !== null && typeof s === \"object\") : [];\n if (scales.length) {\n sections.push(`scales ${list(scales, (s) => `${clip(String(s.name ?? \"?\"), 30)} (${s.type ?? \"linear\"})`)}`);\n }\n return `Vega chart${titleText(spec.title)}${sections.length ? `: ${sections.join(\"; \")}` : \"\"}`;\n}\n\nfunction summarizeChart(spec) {\n try {\n if (typeof spec.$schema === \"string\" && spec.$schema.includes(\"/vega-lite/\")) {\n const lines = [];\n summarizeVegaLiteView(spec, \"Vega-Lite \", { encoding: {} }, spec.datasets, 0, lines);\n return lines.join(\"\\n\");\n }\n return summarizeVega(spec);\n } catch {\n // A summary is a fallback; a spec it doesn't understand still renders.\n return undefined;\n }\n}\n\nfunction isDataFrameLike(obj) {\n return obj !== null && typeof obj === \"object\" &&\n obj.schema !== undefined && typeof obj.schema === \"object\" &&\n typeof obj.head === \"function\" && typeof obj.toRecords === \"function\";\n}\n\nfunction mapPolarsTypeToJSONSchema(colType) {\n const typeMapping = {\n Null: \"null\",\n Bool: \"boolean\",\n Int8: \"integer\",\n Int16: \"integer\",\n Int32: \"integer\",\n Int64: \"integer\",\n UInt8: \"integer\",\n UInt16: \"integer\",\n UInt32: \"integer\",\n UInt64: \"integer\",\n Float32: \"number\",\n Float64: \"number\",\n Date: \"string\",\n Datetime: \"string\",\n Utf8: \"string\",\n Categorical: \"string\",\n List: \"array\",\n Struct: \"object\",\n };\n // Polars DataTypes only expose their name through toJSON().\n const dataType = typeof colType?.toJSON === \"function\" ? colType.toJSON()[\"DataType\"] : undefined;\n return typeMapping[dataType] || \"string\";\n}\n\nfunction extractDataFrame(df) {\n const fields = [];\n for (const [name, colType] of Object.entries(df.schema)) {\n fields.push({ name, type: mapPolarsTypeToJSONSchema(colType) });\n }\n const data = df.head(50).toRecords();\n let html = \"<table><thead><tr>\";\n for (const field of fields) html += `<th>${escapeHTML(String(field.name))}</th>`;\n html += \"</tr></thead><tbody>\";\n for (const row of df.head(10).toRecords()) {\n html += \"<tr>\";\n for (const field of fields) html += `<td>${escapeHTML(String(row[field.name]))}</td>`;\n html += \"</tr>\";\n }\n html += \"</tbody></table>\";\n // Polars has `height`; the row count is left out when there isn't one.\n const size = [];\n if (Number.isInteger(df.height)) size.push(`${df.height} ${df.height === 1 ? \"row\" : \"rows\"}`);\n size.push(`${fields.length} ${fields.length === 1 ? \"column\" : \"columns\"}`);\n const columns = fields.slice(0, 20).map((field) => `${clip(String(field.name), 40)} (${field.type})`);\n if (fields.length > 20) columns.push(`\u2026 ${fields.length - 20} more`);\n return {\n \"application/vnd.dataresource+json\": { data, schema: { fields } },\n \"text/html\": html,\n \"text/plain\": `DataFrame (${size.join(\", \")})${columns.length ? `: ${columns.join(\", \")}` : \"\"}`,\n };\n}\n\nfunction isCanvasLike(obj) {\n return obj !== null && typeof obj === \"object\" && \"toDataURL\" in obj;\n}\n\nexport function isJpg(obj) {\n return obj instanceof Uint8Array && obj.length >= 4 &&\n obj[0] === 0xff && obj[1] === 0xd8 &&\n obj[obj.length - 2] === 0xff && obj[obj.length - 1] === 0xd9;\n}\n\nconst PNG_SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];\n\nexport function isPng(obj) {\n return obj instanceof Uint8Array && obj.length >= PNG_SIGNATURE.length &&\n PNG_SIGNATURE.every((byte, i) => obj[i] === byte);\n}\n\nfunction isSVGElementLike(obj) {\n return obj !== null && typeof obj === \"object\" && typeof obj.outerHTML === \"string\" &&\n obj.outerHTML.startsWith(\"<svg\");\n}\n\nfunction isHTMLElementLike(obj) {\n return obj !== null && typeof obj === \"object\" && typeof obj.outerHTML === \"string\";\n}\n\nfunction hasDisplaySymbol(obj) {\n return obj !== null && typeof obj === \"object\" && typeof obj[$display] === \"function\";\n}\n\nfunction isMediaBundle(obj) {\n return obj !== null && typeof obj === \"object\" && !Array.isArray(obj);\n}\n\n/**\n * @param {{\n * inspect: (value: unknown) => string,\n * base64: (bytes: Uint8Array) => string,\n * readFile: (path: string) => Uint8Array,\n * send: (msgType: string, content: object, metadata: object, buffers: Uint8Array[]) => void,\n * input: (prompt: string, password: boolean) => string | null,\n * }} host\n */\nexport function createJupyter(host) {\n async function format(obj) {\n return await formatNow(obj);\n }\n\n // format without awaiting: the debugger's variable viewer formats values\n // while the target is paused, when no promise settles (#18). A $display\n // method's promise is the caller's to handle.\n function formatNow(obj) {\n if (hasDisplaySymbol(obj)) return obj[$display]();\n if (typeof obj !== \"object\" || obj === null) return { \"text/plain\": host.inspect(obj) };\n if (isCanvasLike(obj)) {\n const [prefix, data] = obj.toDataURL().split(\",\");\n return { [prefix.split(\":\")[1].split(\";\")[0]]: data };\n }\n if (isVegaLike(obj)) {\n const vega = extractVega(obj);\n if (vega) return vega;\n }\n if (isDataFrameLike(obj)) return extractDataFrame(obj);\n if (isJpg(obj)) return { \"image/jpeg\": host.base64(obj) };\n if (isPng(obj)) return { \"image/png\": host.base64(obj) };\n if (isSVGElementLike(obj)) return { \"image/svg+xml\": obj.outerHTML };\n if (isHTMLElementLike(obj)) return { \"text/html\": obj.outerHTML };\n return { \"text/plain\": host.inspect(obj) };\n }\n\n function taggedTemplate(mediatype) {\n return (strings, ...values) => {\n const payload = strings.reduce((acc, string, i) =>\n acc + string + (values[i] !== undefined ? values[i] : \"\"), \"\");\n return { [$display]: () => ({ [mediatype]: payload }) };\n };\n }\n\n function image(obj) {\n if (typeof obj === \"string\") {\n // As Deno does: a path that can't be read gets the TypeError below.\n try {\n obj = host.readFile(obj);\n } catch {\n // fall through\n }\n }\n if (isJpg(obj)) return { [$display]: () => ({ \"image/jpeg\": host.base64(obj) }) };\n if (isPng(obj)) return { [$display]: () => ({ \"image/png\": host.base64(obj) }) };\n throw new TypeError(\n \"Object is not a valid image or a path to an image. `jupyter.image` supports displaying JPG or PNG images.\",\n );\n }\n\n function broadcast(msgType, content, { metadata = {}, buffers = [] } = {}) {\n host.send(msgType, content, metadata, buffers);\n }\n\n async function display(obj, options = { raw: false, update: false }) {\n const bundle = options.raw && isMediaBundle(obj) ? obj : await format(obj);\n broadcast(options.update ? \"update_display_data\" : \"display_data\", {\n data: bundle,\n metadata: {},\n transient: options.display_id ? { display_id: options.display_id } : {},\n });\n }\n\n async function broadcastResult(executionCount, result) {\n if (result === undefined) return;\n try {\n broadcast(\"execute_result\", {\n execution_count: executionCount,\n data: await format(result),\n metadata: {},\n // nbclient crashes on a null `transient`; Deno learned this too.\n transient: {},\n });\n } catch (err) {\n broadcast(\"error\", {\n ename: err instanceof Error ? err.name : \"Error\",\n evalue: err instanceof Error ? err.message : String(err),\n traceback: err instanceof Error && err.stack ? err.stack.split(\"\\n\") : [],\n });\n }\n }\n\n function confirm(message = \"Confirm\") {\n const answer = host.input(`${message} [y/N] `, false);\n return answer === \"Y\" || answer === \"y\";\n }\n\n function prompt(message = \"Prompt\", defaultValue = \"\", { password = false } = {}) {\n if (defaultValue != \"\") message += ` [${defaultValue}]`;\n const answer = host.input(message, password);\n return answer === \"\" ? defaultValue : answer;\n }\n\n const comms = createComms((msgType, content, metadata, buffers) => host.send(msgType, content, metadata, buffers));\n\n return {\n namespace: {\n broadcast,\n display,\n format,\n md: taggedTemplate(\"text/markdown\"),\n html: taggedTemplate(\"text/html\"),\n svg: taggedTemplate(\"image/svg+xml\"),\n image,\n $display,\n comm: comms.api,\n widget: createWidgetFactory(comms.api, $display),\n },\n broadcastResult,\n formatNow,\n confirm,\n prompt,\n commDispatch: comms.dispatch,\n };\n}\n", "// The in-process evaluator behind the targets that don't use CDP: Bun (#7),\n// over a pipe (bun-channel.mjs), and workerd (#8), inside a request\n// (workerd-worker.mjs). Cells arrive as global code from\n// src/transform.ts's transformCellForEval, whose value is a promise of the\n// boxed result. Requests and replies mirror the CDP calls the kernel makes\n// of the other targets.\n//\n// No imports: this file must load in every target.\n\n/** Own and inherited property names, as Runtime.getProperties lists them. */\nexport function propertyNames(value) {\n if (value === null || value === undefined) return [];\n const names = new Set();\n for (let o = Object(value); o !== null; o = Object.getPrototypeOf(o)) {\n for (const name of Object.getOwnPropertyNames(o)) names.add(name);\n }\n return [...names];\n}\n\n/**\n * Answers the host's requests. `shim` is globalThis.__cdpk; `evaluate` runs\n * global code. Values the host refers to later (a result to display, an\n * error to describe) stay here under a handle, the stand-in for a CDP\n * objectId.\n */\nexport function createHandler(shim, evaluate = (code) => (0, eval)(code)) {\n const handles = new Map();\n let nextHandle = 0;\n const remote = (value) => {\n const objectId = `h${++nextHandle}`;\n handles.set(objectId, value);\n return { type: value === null ? \"object\" : typeof value, objectId };\n };\n const take = (objectId) => {\n const value = handles.get(objectId);\n handles.delete(objectId);\n return value;\n };\n\n return async function handle(request) {\n switch (request.op) {\n case \"ping\":\n return {};\n case \"eval\": {\n // The host uses a result's handle before its next cell.\n handles.clear();\n try {\n const box = await evaluate(request.code);\n return { result: box === undefined ? { type: \"undefined\" } : remote(box[0]) };\n } catch (err) {\n return {\n exceptionDetails: { text: \"Uncaught\", lineNumber: 0, columnNumber: 0, exception: remote(err) },\n };\n }\n }\n case \"broadcast\":\n await shim.broadcastResult(request.count, take(request.handle));\n return {};\n case \"format\":\n return { value: await shim.formatJson(request.handle === undefined ? undefined : take(request.handle)) };\n case \"describe\":\n return { value: shim.describeError(take(request.handle)) };\n case \"comm\":\n try {\n const handled = await shim.commDispatch(request.msgType, request.content, request.metadata, request.buffers);\n return { handled: handled === true };\n } catch (err) {\n return { error: JSON.parse(shim.describeError(err)) };\n }\n case \"props\": {\n // Completion's expression is a dotted path; resolved by descriptor\n // where the shim can, so completing `obj.` never runs a getter (#10).\n if (typeof shim.resolvePath === \"function\") {\n const resolved = shim.resolvePath(request.expr);\n return { names: resolved.found && !resolved.accessor ? propertyNames(resolved.value) : [] };\n }\n let value;\n try {\n value = evaluate(`(${request.expr})`);\n } catch {\n return { names: [] };\n }\n return { names: propertyNames(value) };\n }\n case \"inspect\":\n return { text: shim.inspectPath(request.path, request.detail ?? 0) };\n case \"barrier\":\n return { value: shim.barrier() };\n default:\n throw new Error(`unknown request ${JSON.stringify(request.op)}`);\n }\n };\n}\n", "// A small stand-in for util.inspect and util.format, for targets that have\n// neither: the browser Worker (runtime/browser-worker.mjs). Output follows\n// Node's for the common cases (strings quoted when nested, objects and\n// arrays on one line, Map, Set, Date, Error, class names, circular\n// references), without colours.\n//\n// No imports: this file must load in every target.\n\nconst MAX_ITEMS = 100;\n\n// Single quotes, unless the string has some and double quotes or\n// backticks would need no escapes, as util.inspect picks.\nfunction quote(s) {\n const q = !s.includes(\"'\") ? \"'\" : !s.includes('\"') ? '\"' : !s.includes(\"`\") && !s.includes(\"${\") ? \"`\" : \"'\";\n const escaped = s.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\n\", \"\\\\n\").replaceAll(q, `\\\\${q}`);\n return `${q}${escaped}${q}`;\n}\n\nfunction key(k) {\n return typeof k === \"symbol\" ? `[${k.toString()}]` : /^[A-Za-z_$][\\w$]*$/.test(k) ? k : quote(k);\n}\n\nfunction className(value) {\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return \"[Object: null prototype]\";\n const name = proto.constructor?.name;\n return name && name !== \"Object\" ? name : \"\";\n}\n\nfunction list(open, items, close, more) {\n if (more > 0) items.push(`... ${more} more item${more === 1 ? \"\" : \"s\"}`);\n return items.length === 0 ? `${open}${close}` : `${open} ${items.join(\", \")} ${close}`;\n}\n\n/** `value` as Node's util.inspect would show it, to `depth` levels. */\nexport function inspect(value, { depth = 2 } = {}) {\n const seen = [];\n const show = (v, level) => {\n switch (typeof v) {\n case \"string\":\n return quote(v);\n case \"bigint\":\n return `${v}n`;\n case \"symbol\":\n return v.toString();\n case \"undefined\":\n return \"undefined\";\n case \"function\": {\n const isClass = /^class\\b/.test(Function.prototype.toString.call(v));\n return isClass ? `[class ${v.name || \"(anonymous)\"}]` : `[Function${v.name ? `: ${v.name}` : \" (anonymous)\"}]`;\n }\n case \"number\":\n return Object.is(v, -0) ? \"-0\" : String(v);\n case \"boolean\":\n return String(v);\n }\n if (v === null) return \"null\";\n if (seen.includes(v)) return \"[Circular *1]\";\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? \"Invalid Date\" : v.toISOString();\n if (v instanceof RegExp) return String(v);\n if (v instanceof Error) return v.stack ?? `${v.name}: ${v.message}`;\n if (v instanceof Promise) return \"Promise { <unknown> }\";\n if (level > depth) return Array.isArray(v) ? \"[Array]\" : `[${className(v) || \"Object\"}]`;\n seen.push(v);\n try {\n if (Array.isArray(v) || ArrayBuffer.isView(v)) {\n const items = Array.from(v).slice(0, MAX_ITEMS).map((x) => show(x, level + 1));\n const prefix = Array.isArray(v) ? \"\" : `${v.constructor.name}(${v.length}) `;\n return prefix + list(\"[\", items, \"]\", v.length - items.length);\n }\n if (v instanceof Map) {\n const items = [...v].slice(0, MAX_ITEMS).map(([k, x]) => `${show(k, level + 1)} => ${show(x, level + 1)}`);\n return `Map(${v.size}) ` + list(\"{\", items, \"}\", v.size - items.length);\n }\n if (v instanceof Set) {\n const items = [...v].slice(0, MAX_ITEMS).map((x) => show(x, level + 1));\n return `Set(${v.size}) ` + list(\"{\", items, \"}\", v.size - items.length);\n }\n const keys = Reflect.ownKeys(v).filter((k) => Object.getOwnPropertyDescriptor(v, k)?.enumerable);\n const items = keys.slice(0, MAX_ITEMS).map((k) => {\n const d = Object.getOwnPropertyDescriptor(v, k);\n const shown = d.get || d.set ? `[${d.get ? \"Getter\" : \"\"}${d.get && d.set ? \"/\" : \"\"}${d.set ? \"Setter\" : \"\"}]` : show(d.value, level + 1);\n return `${key(k)}: ${shown}`;\n });\n const name = className(v);\n return (name ? `${name} ` : \"\") + list(\"{\", items, \"}\", keys.length - items.length);\n } finally {\n seen.pop();\n }\n };\n return show(value, 0);\n}\n\n/** console.log's formatting: strings as they are, everything else inspected, %s/%d/%i/%f/%o/%O/%j substituted. */\nexport function format(...args) {\n let out = [];\n let rest = args;\n if (typeof args[0] === \"string\" && args.length > 1 && args[0].includes(\"%\")) {\n let i = 1;\n const text = args[0].replace(/%[sdifoOjc%]/g, (spec) => {\n if (spec === \"%%\") return \"%\";\n if (i >= args.length) return spec;\n const a = args[i++];\n switch (spec) {\n case \"%s\":\n return typeof a === \"string\" ? a : inspect(a, { depth: 1 });\n case \"%d\":\n case \"%i\":\n return typeof a === \"bigint\" ? `${a}n` : String(spec === \"%i\" ? Math.trunc(Number(a)) : Number(a));\n case \"%f\":\n return String(Number(a));\n case \"%j\":\n return JSON.stringify(a);\n case \"%c\":\n return \"\";\n default:\n return inspect(a, { depth: 4 });\n }\n });\n out = [text];\n rest = args.slice(i);\n }\n for (const a of rest) out.push(typeof a === \"string\" ? a : inspect(a));\n return out.join(\" \");\n}\n", "// What inspect_request (#10) shows for a value: the text of a JupyterLab\n// tooltip (Shift-Tab) or inspector panel. Shared by every target; the host\n// decides how the value is found (src/target.ts: CDP's throwOnSideEffect;\n// in-process targets: resolvePath, below).\n//\n// No imports: this file must load in every target. `inspect` (util.inspect\n// or Deno.inspect) is passed in.\n\nconst PREVIEW_CHARS = 1500;\nconst SOURCE_CHARS = 4000;\nconst MAX_PROPERTIES = 40;\n\nconst IDENTIFIER_PATH = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*$/;\n\n/**\n * Looks up a dotted path such as \"a.b.c\" from globalThis, by property\n * descriptor, so nothing runs: a getter along the way is reported rather\n * than called. In-process targets (Bun, workerd, celld) have no way to\n * evaluate without side effects, so inspection and completion use this.\n */\nexport function resolvePath(path, root = globalThis) {\n if (!IDENTIFIER_PATH.test(path)) return { found: false };\n let value = root;\n for (const name of path.split(\".\")) {\n if (value === null || value === undefined) return { found: false };\n let descriptor;\n for (let o = Object(value); o !== null && descriptor === undefined; o = Object.getPrototypeOf(o)) {\n descriptor = Object.getOwnPropertyDescriptor(o, name);\n }\n if (descriptor === undefined) return { found: false };\n if (!(\"value\" in descriptor)) return { found: true, accessor: true, name };\n value = descriptor.value;\n }\n return { found: true, value };\n}\n\nfunction truncate(text, limit) {\n return text.length > limit ? `${text.slice(0, limit)}\u2026 (${text.length - limit} more characters)` : text;\n}\n\n/** \"function add(a, b) {...}\" -> \"add(a, b)\"; \"class K {...}\" -> \"class K\". */\nexport function signatureOf(fn) {\n let source;\n try {\n source = Function.prototype.toString.call(fn);\n } catch {\n return `${fn.name || \"anonymous\"}(\u2026)`;\n }\n if (/^class\\b/.test(source)) return `class ${fn.name || \"(anonymous)\"}`;\n const params = /^[^(]*\\(([^)]*)\\)/.exec(source)?.[1];\n const native = /\\{\\s*\\[native code\\]\\s*\\}$/.test(source);\n // One line, however the parameters were spread over the source.\n const written = (params ?? \"\").replace(/\\s+/g, \" \").replace(/\\s*,\\s*/g, \", \").trim();\n const args = native ? Array.from({ length: fn.length }, (_, i) => `arg${i}`).join(\", \") : written;\n const arrow = !/^(?:async\\s+)?function\\b/.test(source) && /=>/.test(source.split(\"{\")[0] ?? \"\");\n const name = fn.name || (arrow ? \"(arrow function)\" : \"anonymous\");\n const prefix = /^async\\b/.test(source) ? \"async \" : \"\";\n return `${prefix}${name}(${args})`;\n}\n\nfunction typeOf(value) {\n if (value === null) return \"null\";\n if (typeof value !== \"object\" && typeof value !== \"function\") return typeof value;\n const name = Object.getPrototypeOf(value)?.constructor?.name;\n if (typeof value === \"function\") return /^class\\b/.test(safeSource(value)) ? \"class\" : \"function\";\n return name && name !== \"Object\" ? `object (${name})` : \"object\";\n}\n\nfunction safeSource(fn) {\n try {\n return Function.prototype.toString.call(fn);\n } catch {\n return \"\";\n }\n}\n\nfunction propertyNames(value) {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value === null) return [];\n try {\n // A function's own internals aren't worth listing; older V8 (Node 22 and 24)\n // also gives sloppy-mode functions own `arguments` and `caller`.\n const internal = [\"length\", \"name\", \"prototype\", \"arguments\", \"caller\"];\n return Object.getOwnPropertyNames(value).filter((n) => !(typeof value === \"function\" && internal.includes(n)));\n } catch {\n return [];\n }\n}\n\n/**\n * The tooltip text for a value. `detail` 1 (Shift-Tab twice, or the\n * inspector panel) adds a function's source.\n */\nexport function describeValue(value, { inspect, detail = 0 }) {\n const lines = [`Type: ${typeOf(value)}`];\n if (typeof value === \"function\") lines.push(`Signature: ${signatureOf(value)}`);\n let preview;\n try {\n preview = inspect(value);\n } catch (err) {\n preview = `(inspect failed: ${err instanceof Error ? err.message : String(err)})`;\n }\n lines.push(`Value: ${truncate(preview, PREVIEW_CHARS)}`);\n const names = propertyNames(value);\n if (names.length > 0) {\n const shown = names.slice(0, MAX_PROPERTIES).join(\", \");\n lines.push(`Properties: ${shown}${names.length > MAX_PROPERTIES ? `, \u2026 (${names.length - MAX_PROPERTIES} more)` : \"\"}`);\n }\n if (detail > 0 && typeof value === \"function\") lines.push(`Source:\\n${truncate(safeSource(value), SOURCE_CHARS)}`);\n return lines.join(\"\\n\");\n}\n\n/** inspect_request for in-process targets: resolvePath, then describeValue. */\nexport function inspectPath(path, { inspect, detail = 0, root = globalThis }) {\n const resolved = resolvePath(path, root);\n if (!resolved.found) return null;\n if (resolved.accessor) {\n return `Type: accessor property\\n${resolved.name} has a getter, which isn't called for inspection: it could have side effects.`;\n }\n return describeValue(resolved.value, { inspect, detail });\n}\n", "// Where a browser cell's imports load from. A Worker resolves only URLs, so\n// packages come from a CDN that serves npm and jsr as ES modules: esm.sh by\n// default, with its jsr/ prefix for jsr packages.\n//\n// No imports: this file must load in every target.\n\nexport const DEFAULT_CDN = \"https://esm.sh/\";\n\n/** The URL `specifier`, imported from `base`, loads from. */\nexport function resolveSpecifier(specifier, base, cdn = DEFAULT_CDN) {\n if (/^(?:https?|data|blob):/.test(specifier)) return specifier;\n if (/^\\.{0,2}\\//.test(specifier)) return new URL(specifier, base).href;\n if (specifier.startsWith(\"npm:\")) return cdn + specifier.slice(4);\n if (specifier.startsWith(\"jsr:\")) return `${cdn}jsr/${specifier.slice(4).replace(/^\\//, \"\")}`;\n // esm.sh serves polyfills for Node's builtins under node:.\n return cdn + specifier;\n}\n", "// The driver for the browser target: a module Web Worker that runs cells.\n//\n// The page's kernel (src/browser/target.ts) sends each request as a\n// message and gets a reply message back, as over the workerd driver's\n// WebSocket (runtime/workerd-worker.mjs), whose shape this follows. Cells\n// come from transformCellForEval and run as global code with indirect\n// eval, so their declarations persist from cell to cell.\n//\n// A Worker has no module resolution beyond URLs, so `npm:` and `jsr:`\n// specifiers, and bare package names, load from a CDN (esm.sh by default).\n//\n// The page can also offer cells its own features (#384): `host` requests go\n// to the page's handler, and `preload` modules run before the first cell.\n\nimport { createJupyter } from \"./display.mjs\";\nimport { createHandler } from \"./evaluator.mjs\";\nimport { format, inspect } from \"./format.mjs\";\nimport { describeValue, inspectPath, resolvePath } from \"./introspect.mjs\";\nimport { DEFAULT_CDN, resolveSpecifier } from \"./cdn.mjs\";\n\nfunction base64(bytes) {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(binary);\n}\n\nconst post = (message) => globalThis.postMessage(message);\n\n// --- Output -----------------------------------------------------------------\nconst stream = (name) => (...args) => post({ kind: \"stream\", name, text: format(...args) + \"\\n\" });\nObject.assign(console, {\n log: stream(\"stdout\"),\n info: stream(\"stdout\"),\n debug: stream(\"stdout\"),\n dir: (value) => post({ kind: \"stream\", name: \"stdout\", text: inspect(value, { depth: 4 }) + \"\\n\" }),\n warn: stream(\"stderr\"),\n error: stream(\"stderr\"),\n});\n\n// An error thrown later by a cell's timer or promise goes to stderr, as on\n// the other targets.\nfunction reportUncaught(kind, err) {\n post({ kind: \"stream\", name: \"stderr\", text: `${kind}: ${err instanceof Error ? (err.stack ?? err.message) : inspect(err)}\\n` });\n}\nglobalThis.addEventListener(\"unhandledrejection\", (event) => {\n event.preventDefault();\n reportUncaught(\"Uncaught (in promise)\", event.reason);\n});\nglobalThis.addEventListener(\"error\", (event) => {\n event.preventDefault();\n reportUncaught(\"Uncaught\", event.error ?? event.message);\n});\n\nconst jupyter = createJupyter({\n inspect: (value) => inspect(value, { depth: 4 }),\n base64,\n readFile() {\n throw new Error(\"the browser target has no file system to read from; pass the image bytes instead\");\n },\n send(msgType, content, metadata, buffers) {\n post({ kind: \"iopub\", msg_type: msgType, content, metadata, buffers: buffers.map(base64), barrier: 0 });\n },\n // A synchronous prompt would need SharedArrayBuffer and Atomics.wait, so\n // a cross-origin isolated page; until then, as with no stdin.\n input: () => null,\n});\n\n// --- Modules ----------------------------------------------------------------\nlet cdn = DEFAULT_CDN;\n\n\n// --- The host page (#384) -----------------------------------------------------\n// Requests to the page's `host` handler (src/browser/target.ts), and events\n// it sends. Preload modules get this object; cells only through them.\nconst hostCalls = new Map();\nconst hostListeners = new Set();\nlet nextHostId = 0;\n\nfunction hostError(error) {\n const err = new Error(String(error?.message ?? \"the host request failed\"));\n if (typeof error?.name === \"string\") err.name = error.name;\n if (error?.code !== undefined) err.code = error.code;\n return err;\n}\n\nconst host = {\n /** Resolves with the page's answer; aborting `signal` cancels the call on the page too. */\n request(method, params, { signal, transfer } = {}) {\n if (signal?.aborted) return Promise.reject(signal.reason);\n const id = ++nextHostId;\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n hostCalls.delete(id);\n post({ kind: \"host\", id, cancel: true });\n reject(signal.reason);\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n const done = () => signal?.removeEventListener(\"abort\", onAbort);\n try {\n globalThis.postMessage({ kind: \"host\", id, method, params }, transfer ?? []);\n } catch (err) {\n done(); // params structured clone can't copy\n throw err;\n }\n hostCalls.set(id, { resolve, reject, done });\n });\n },\n /** Calls `listener(event, value)` for each event the page sends; returns a function that stops it. */\n onEvent(listener) {\n hostListeners.add(listener);\n return () => hostListeners.delete(listener);\n },\n};\n\nfunction receiveHost(msg) {\n if (msg.id === undefined) {\n for (const listener of hostListeners) {\n try {\n listener(msg.event, msg.value);\n } catch (err) {\n reportUncaught(\"Uncaught\", err);\n }\n }\n return;\n }\n const call = hostCalls.get(msg.id);\n if (!call) return; // cancelled\n hostCalls.delete(msg.id);\n call.done();\n if (msg.error !== undefined) call.reject(hostError(msg.error));\n else call.resolve(msg.result);\n}\n\n// Each module is imported in order, and a default export that is a function\n// is called with the host. A module that fails is reported, and the kernel\n// runs without it.\nasync function preload(urls, base) {\n for (const specifier of Array.isArray(urls) ? urls : []) {\n try {\n const mod = await import(new URL(specifier, base).href);\n if (typeof mod.default === \"function\") await mod.default({ host, jupyter: jupyter.namespace });\n } catch (err) {\n reportUncaught(`Preloading ${specifier} failed`, err);\n }\n }\n}\n\n// --- The shim cells and the evaluator use -----------------------------------\nlet handle = null;\n\nfunction install({ base, cdn: cdnBase }) {\n if (typeof cdnBase === \"string\") cdn = cdnBase.endsWith(\"/\") ? cdnBase : cdnBase + \"/\";\n const url = new URL(\"$cdpk$repl.mjs\", base).href;\n globalThis.__cdpk = {\n import: (specifier, options) => import(resolveSpecifier(specifier, url, cdn), options),\n meta: { url, resolve: (specifier) => resolveSpecifier(specifier, url, cdn) },\n // inspect_request (#10): by descriptor, so nothing runs.\n describeForInspect: (value, detail) => describeValue(value, { inspect: (v) => inspect(v, { depth: 2 }), detail }),\n inspectPath: (path, detail) => inspectPath(path, { inspect: (v) => inspect(v, { depth: 2 }), detail }),\n resolvePath,\n barrier: () => 0,\n broadcastResult: jupyter.broadcastResult,\n // execute_request's user_expressions (#340).\n formatJson: async (value) => JSON.stringify(await jupyter.namespace.format(value)),\n async commDispatch(msgType, content, metadata, buffers64) {\n const buffers = buffers64.map((b) => Uint8Array.from(atob(b), (c) => c.charCodeAt(0)));\n return await jupyter.commDispatch(msgType, content, metadata, buffers);\n },\n describeError(value) {\n if (value instanceof Error) {\n return JSON.stringify({ name: value.name, message: value.message, stack: value.stack ?? \"\" });\n }\n return JSON.stringify({ name: \"Error\", message: inspect(value), stack: \"\" });\n },\n };\n Object.defineProperty(globalThis, \"__cdpk\", { enumerable: false });\n globalThis.jupyter = jupyter.namespace;\n globalThis.prompt = jupyter.prompt;\n globalThis.confirm = jupyter.confirm;\n handle = createHandler(globalThis.__cdpk, (code) => (0, eval)(code));\n}\n\nasync function answer(req) {\n if (req.op === \"info\") {\n install(req);\n await preload(req.preload, req.base);\n return { userAgent: globalThis.navigator?.userAgent ?? \"\" };\n }\n if (handle === null) throw new Error(\"the driver wasn't sent info first\");\n return await handle(req);\n}\n\nglobalThis.addEventListener(\"message\", (event) => {\n const req = event.data;\n if (req?.op === \"host\") return receiveHost(req);\n answer(req).then(\n (reply) => post({ kind: \"reply\", id: req.id, ...reply }),\n (err) => post({ kind: \"reply\", id: req.id, failure: String(err?.stack ?? err) }),\n );\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["comm", "list", "key", "$display", "key", "encoding", "list", "host", "format", "answer", "handle", "items", "propertyNames", "inspect", "cdn"]
7
+ }
@@ -24,6 +24,7 @@ export declare class BunTarget implements KernelTarget {
24
24
  static launch(events: TargetEvents, options?: {
25
25
  cwd?: string;
26
26
  executable?: string;
27
+ startTimeoutMs?: number;
27
28
  }): Promise<BunTarget>;
28
29
  evaluate(script: string): Promise<EvaluateResult>;
29
30
  /**
@@ -45,6 +46,7 @@ export declare class BunTarget implements KernelTarget {
45
46
  stack: string;
46
47
  };
47
48
  }>;
49
+ format(value: RemoteObject): Promise<CdpParams>;
48
50
  describeError(exception: RemoteObject): Promise<{
49
51
  name: string;
50
52
  message: string;
@@ -13,7 +13,8 @@ import { asEvaluateResult } from "./cdp.js";
13
13
  import { transformCellForEval } from "./transform.js";
14
14
  import { runtimeDir } from "./package.js";
15
15
  import { killOnExit } from "./children.js";
16
- import { Gates, Interrupted, isTargetMessage, parseJson, PipeDemux } from "./target.js";
16
+ import { Gates, Interrupted, isTargetMessage, parseBundle, parseJson, PipeDemux } from "./target.js";
17
+ import { withStartTimeout } from "./target-api.js";
17
18
  /**
18
19
  * How long an interrupted target has to answer a ping. A cell waiting on a
19
20
  * promise leaves the event loop free, so the answer is near-instant; a busy
@@ -91,7 +92,15 @@ export class BunTarget {
91
92
  });
92
93
  target.#readChannel(events);
93
94
  child.once("exit", (code) => target.#exited(code, events));
94
- const { versions } = await ready;
95
+ let versions;
96
+ try {
97
+ // A bun that stays up but never says it's ready is stopped (#336).
98
+ ({ versions } = await withStartTimeout(ready, cmd, options.startTimeoutMs));
99
+ }
100
+ catch (err) {
101
+ child.kill();
102
+ throw err;
103
+ }
95
104
  if (isRecord(versions))
96
105
  Object.assign(target.versions, versions);
97
106
  return target;
@@ -230,6 +239,10 @@ export class BunTarget {
230
239
  }
231
240
  return { handled: reply.handled === true };
232
241
  }
242
+ async format(value) {
243
+ const reply = await this.#request("format", { handle: value.objectId });
244
+ return parseBundle(reply.value);
245
+ }
233
246
  async describeError(exception) {
234
247
  if (exception.objectId === undefined)
235
248
  return { name: "Error", message: exception.description ?? "", stack: "" };
package/dist/cdp.d.ts CHANGED
@@ -15,6 +15,15 @@ export interface ExceptionDetails {
15
15
  lineNumber: number;
16
16
  columnNumber: number;
17
17
  exception?: RemoteObject;
18
+ /** Where it was thrown, with each script's URL (#322). */
19
+ stackTrace?: {
20
+ callFrames: {
21
+ functionName: string;
22
+ url: string;
23
+ lineNumber: number;
24
+ columnNumber: number;
25
+ }[];
26
+ };
18
27
  }
19
28
  export interface EvaluateResult {
20
29
  result: RemoteObject;
@@ -30,6 +39,8 @@ export declare class CdpAbandoned extends Error {
30
39
  export declare class CdpSession {
31
40
  #private;
32
41
  private constructor();
42
+ /** Called once, when the session closes for any reason. */
43
+ onClose(listener: () => void): void;
33
44
  static connect(url: string): Promise<CdpSession>;
34
45
  on(method: string, listener: (params: CdpParams) => void): void;
35
46
  send(method: string, params?: CdpParams): Promise<CdpParams>;
package/dist/cdp.js CHANGED
@@ -21,10 +21,21 @@ export class CdpSession {
21
21
  #nextId = 0;
22
22
  #pending = new Map();
23
23
  #listeners = new Map();
24
+ #closeListeners = [];
25
+ #closed = false;
24
26
  constructor(ws) {
25
27
  this.#ws = ws;
26
28
  ws.addEventListener("message", (event) => {
27
- const msg = JSON.parse(String(event.data));
29
+ let msg;
30
+ try {
31
+ msg = JSON.parse(String(event.data));
32
+ }
33
+ catch {
34
+ // Not CDP: the session can't be trusted to answer, but one bad frame
35
+ // mustn't throw out of the listener and end the kernel (#337).
36
+ this.#closeBroken("CDP connection closed: the runtime sent a frame that isn't JSON");
37
+ return;
38
+ }
28
39
  if (isResponse(msg)) {
29
40
  const pending = this.#pending.get(msg.id);
30
41
  if (!pending)
@@ -42,12 +53,28 @@ export class CdpSession {
42
53
  listener(msg.params);
43
54
  }
44
55
  });
45
- ws.addEventListener("close", () => {
46
- for (const pending of this.#pending.values()) {
47
- pending.reject(new Error("CDP connection closed"));
48
- }
49
- this.#pending.clear();
50
- });
56
+ ws.addEventListener("close", () => this.#closedWith("CDP connection closed"));
57
+ }
58
+ /** Fails what's in flight, and tells the close listeners, once. */
59
+ #closedWith(reason) {
60
+ for (const pending of this.#pending.values()) {
61
+ pending.reject(new Error(reason));
62
+ }
63
+ this.#pending.clear();
64
+ if (this.#closed)
65
+ return;
66
+ this.#closed = true;
67
+ for (const listener of this.#closeListeners)
68
+ listener();
69
+ }
70
+ /** Without waiting for the close handshake. */
71
+ #closeBroken(reason) {
72
+ this.#closedWith(reason);
73
+ this.#ws.close();
74
+ }
75
+ /** Called once, when the session closes for any reason. */
76
+ onClose(listener) {
77
+ this.#closeListeners.push(listener);
51
78
  }
52
79
  static async connect(url) {
53
80
  const ws = new WebSocket(url);
@@ -25,6 +25,7 @@ import { isRecord } from "./cdp.js";
25
25
  import { parseJsonc } from "./deno-config.js";
26
26
  import { runtimeDir } from "./package.js";
27
27
  import { childPids, killOnExit, reapWith } from "./children.js";
28
+ import { withStartTimeout } from "./target-api.js";
28
29
  import { cellMeta, WorkerdTarget } from "./workerd-target.js";
29
30
  import { builtinAliases, findWranglerConfig } from "./workers-project.js";
30
31
  /** The project keys the generated config keeps: bindings and compatibility. */
@@ -255,7 +256,7 @@ class CelldHost {
255
256
  return channelOf(ws);
256
257
  })();
257
258
  try {
258
- const host = new CelldHost(child, await Promise.race([ready, exited]), `celld ${version}`.trim(), projectConfig ?? undefined);
259
+ const host = new CelldHost(child, await withStartTimeout(Promise.race([ready, exited]), "celld"), `celld ${version}`.trim(), projectConfig ?? undefined);
259
260
  // Its server, in its own process group, outlives a SIGKILLed celld dev.
260
261
  for (const pid of childPids(child.pid ?? -1))
261
262
  reapWith(pid, child);
@@ -305,5 +306,5 @@ export async function launchCelld(events, options = {}) {
305
306
  }
306
307
  }
307
308
  host ??= await CelldHost.start(cwd, null, options.executable);
308
- return await WorkerdTarget.open(host, cwd, events, "celld", notice);
309
+ return await WorkerdTarget.open(host, cwd, events, "celld", { notice });
309
310
  }
@@ -8,6 +8,8 @@ export interface DebugChannel {
8
8
  readonly contextId: number;
9
9
  /** Enumerable globals the runtime had before any cell ran. */
10
10
  readonly baselineGlobals: ReadonlySet<string>;
11
+ /** Runs a call of the kernel's own with pausing on exceptions held off (#307). */
12
+ withoutPausing?<T>(call: () => Promise<T>): Promise<T>;
11
13
  }
12
14
  export type DapMessage = {
13
15
  [key: string]: unknown;
package/dist/debugger.js CHANGED
@@ -8,14 +8,14 @@
8
8
  // as their //# sourceURL, so breakpoints bind and frames point at the cell.
9
9
  // Lines go through the cell's source map (src/sourcemap.ts), since esbuild
10
10
  // rewrites TypeScript.
11
- import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
11
+ import { lstatSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
12
12
  import { tmpdir } from "node:os";
13
13
  import { join, sep } from "node:path";
14
14
  import process from "node:process";
15
15
  import { fileURLToPath } from "node:url";
16
16
  import { isRecord, isRemoteObject } from "./cdp.js";
17
17
  import { murmur2 } from "./murmur2.js";
18
- import { SETTLE, transformCellWithLines } from "./transform.js";
18
+ import { SETTLE, transformCellWithLines, YIELD } from "./transform.js";
19
19
  /** ipykernel's seed, so a kernel switch doesn't move JupyterLab's breakpoints. */
20
20
  export const HASH_SEED = 0xc70f6907;
21
21
  export const THREAD_ID = 1;
@@ -23,6 +23,9 @@ const EXCEPTION_FILTERS = [
23
23
  { filter: "caught", label: "Caught Exceptions", default: false },
24
24
  { filter: "uncaught", label: "Uncaught Exceptions", default: false },
25
25
  ];
26
+ /** URLs of the runtime's built-in modules: Deno's `ext:`, Node's `node:`. */
27
+ const RUNTIME_SCRIPTS = ["^ext:", "^node:"];
28
+ const RUNTIME_SCRIPT = /^(ext|node):/;
26
29
  /** Bindings the kernel itself installs, hidden from the variable views. */
27
30
  const KERNEL_GLOBALS = new Set(["__cdpk", "__cdpk_send", "jupyter", "prompt", "confirm"]);
28
31
  const SCOPE_NAMES = {
@@ -52,6 +55,18 @@ function isCallFrame(value) {
52
55
  typeof value.location.lineNumber === "number" && Array.isArray(value.scopeChain) &&
53
56
  value.scopeChain.every((scope) => isRecord(scope) && typeof scope.type === "string" && isRemoteObject(scope.object));
54
57
  }
58
+ /**
59
+ * Whether `dir` is a directory, not a symlink, owned by this user and
60
+ * closed to others. Windows has no uids; its tmpdir() is per-user.
61
+ */
62
+ function isOwnPrivateDir(dir) {
63
+ const stat = lstatSync(dir);
64
+ if (!stat.isDirectory())
65
+ return false;
66
+ if (process.getuid === undefined)
67
+ return true;
68
+ return stat.uid === process.getuid() && (stat.mode & 0o077) === 0;
69
+ }
55
70
  /** A DAP value string for a CDP RemoteObject. */
56
71
  export function describeRemote(object) {
57
72
  if (object.type === "string")
@@ -256,6 +271,8 @@ export class Debugger {
256
271
  if (!channel)
257
272
  return;
258
273
  await channel.send("Debugger.enable");
274
+ // Stepping doesn't enter the runtime's own code (#380).
275
+ await channel.send("Debugger.setBlackboxPatterns", { patterns: RUNTIME_SCRIPTS });
259
276
  await channel.send("Debugger.setPauseOnExceptions", { state: this.#pauseOnExceptions });
260
277
  this.#cdpBreakpoints.clear();
261
278
  for (const path of this.#breakpoints.keys())
@@ -332,21 +349,38 @@ export class Debugger {
332
349
  }
333
350
  // --- stopped state ----------------------------------------------------------
334
351
  #onPaused(params) {
352
+ const hit = Array.isArray(params.hitBreakpoints) && params.hitBreakpoints.length > 0;
353
+ const exception = params.reason === "exception" || params.reason === "promiseRejection";
354
+ if (exception && !hit && this.#inRuntime(params.callFrames)) {
355
+ // Thrown in the runtime's own code, as Chrome's ignore list treats it.
356
+ // Deno's lazy node:process setup throws and catches one there, which
357
+ // blackboxing doesn't always skip, and it held the cell (#380). The
358
+ // cell still sees an error that reaches it.
359
+ void this.#channel?.send("Debugger.resume").catch(() => { });
360
+ return;
361
+ }
335
362
  this.#frames = Array.isArray(params.callFrames) ? params.callFrames.filter(isCallFrame) : [];
336
363
  this.#stopped = true;
337
364
  for (const notify of this.#pauseWaiters.splice(0))
338
365
  notify();
339
366
  this.#refs.clear();
340
- const hit = Array.isArray(params.hitBreakpoints) && params.hitBreakpoints.length > 0;
341
367
  const reason = hit
342
368
  ? "breakpoint"
343
- : params.reason === "exception" || params.reason === "promiseRejection"
369
+ : exception
344
370
  ? "exception"
345
371
  : params.reason === "other"
346
372
  ? "step"
347
373
  : String(params.reason ?? "pause");
348
374
  this.#event("stopped", { reason, threadId: THREAD_ID, allThreadsStopped: true });
349
375
  }
376
+ /** Whether the top frame is the runtime's own code. */
377
+ #inRuntime(callFrames) {
378
+ const top = Array.isArray(callFrames) ? callFrames[0] : undefined;
379
+ if (!isRecord(top) || !isRecord(top.location))
380
+ return false;
381
+ const url = this.#scripts.get(String(top.location.scriptId)) ?? (typeof top.url === "string" ? top.url : "");
382
+ return RUNTIME_SCRIPT.test(url);
383
+ }
350
384
  #resetStop() {
351
385
  this.#stopped = false;
352
386
  this.#frames = [];
@@ -472,13 +506,14 @@ export class Debugger {
472
506
  // While paused, only a frame can evaluate: use the top one if none was named.
473
507
  const frame = typeof frameId === "number" ? this.#frames[frameId] : this.#stopped ? this.#frames[0] : undefined;
474
508
  // replMode (for the console's `await`) returns a promise the inspector
475
- // holds only weakly: SETTLE closes that window, as for cells (#55). A
476
- // side-effect-free lookup can't await, so it uses a plain evaluate.
509
+ // holds only weakly: YIELD and SETTLE close that window, as for cells
510
+ // (#55, #329). A side-effect-free lookup can't await, so it uses a plain
511
+ // evaluate.
477
512
  const res = frame
478
513
  ? await channel.send("Debugger.evaluateOnCallFrame", { callFrameId: frame.callFrameId, expression, throwOnSideEffect: pure })
479
514
  : pure
480
515
  ? await channel.send("Runtime.evaluate", { expression, contextId: channel.contextId, throwOnSideEffect: true })
481
- : await channel.send("Runtime.evaluate", { expression: expression + SETTLE, contextId: channel.contextId, replMode: true });
516
+ : await this.#withoutPausing(() => channel.send("Runtime.evaluate", { expression: YIELD + expression + SETTLE, contextId: channel.contextId, replMode: true }));
482
517
  if (isRecord(res.exceptionDetails)) {
483
518
  const exception = res.exceptionDetails.exception;
484
519
  throw new Error(exception ? describeRemote(exception) : String(res.exceptionDetails.text ?? "evaluation failed"));
@@ -500,12 +535,12 @@ export class Debugger {
500
535
  const value = await this.#valueOf(name, frameId, true);
501
536
  const arg = value.objectId ? { objectId: value.objectId } : { value: value.value };
502
537
  // Synchronous: while the target is paused, no promise would settle.
503
- const res = await channel.send("Runtime.callFunctionOn", {
538
+ const res = await this.#withoutPausing(() => channel.send("Runtime.callFunctionOn", {
504
539
  functionDeclaration: "function (v) { return globalThis.__cdpk.richBundle(v); }",
505
540
  arguments: [arg],
506
541
  executionContextId: channel.contextId,
507
542
  returnByValue: true,
508
- });
543
+ }));
509
544
  const text = res.result?.value;
510
545
  const data = typeof text === "string" ? JSON.parse(text) : {};
511
546
  return { data: isRecord(data) ? data : {}, metadata: {} };
@@ -525,18 +560,35 @@ export class Debugger {
525
560
  }
526
561
  #writeCell(path, code) {
527
562
  try {
563
+ mkdirSync(this.prefix, { recursive: true, mode: 0o700 });
564
+ // The path is predictable (the frontend computes it too), so another
565
+ // user could have made the directory first and planted symlinks in it:
566
+ // write only into a directory that is ours and closed to others (#339).
567
+ if (!isOwnPrivateDir(this.prefix))
568
+ return;
528
569
  if (!this.#cleanupRegistered) {
529
570
  // The files only serve this kernel's frontend: remove them with it.
530
- process.once("exit", () => rmSync(this.prefix, { recursive: true, force: true }));
571
+ process.once("exit", () => {
572
+ try {
573
+ rmSync(this.prefix, { recursive: true, force: true });
574
+ }
575
+ catch {
576
+ // Best effort; exiting matters more.
577
+ }
578
+ });
531
579
  this.#cleanupRegistered = true;
532
580
  }
533
- mkdirSync(this.prefix, { recursive: true });
534
581
  writeFileSync(path, code);
535
582
  }
536
583
  catch {
537
584
  // The frontend has the cell itself; the file is a convenience.
538
585
  }
539
586
  }
587
+ /** The kernel's own evaluation, unpaused by exceptions; while stopped, nothing more pauses anyway. */
588
+ #withoutPausing(call) {
589
+ const channel = this.#channel;
590
+ return channel?.withoutPausing && !this.#stopped ? channel.withoutPausing(call) : call();
591
+ }
540
592
  #event(event, body) {
541
593
  const message = { type: "event", seq: ++this.#seq, event, body };
542
594
  trace("event", message);