@marimo-team/frontend 0.23.2-dev38 → 0.23.2-dev40
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/assets/{CellStatus-CjPI69hZ.js → CellStatus-DVCNDLN4.js} +1 -1
- package/dist/assets/{JsonOutput-CcRaYhT-.js → JsonOutput-CaMHqTRB.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-BYuSTceB.js → MarimoErrorOutput-BlvHXVUx.js} +1 -1
- package/dist/assets/{RenderHTML-DQttWYDe.js → RenderHTML-Cz27UcDX.js} +1 -1
- package/dist/assets/{add-cell-with-ai-CPCm86Mb.js → add-cell-with-ai-5BBZGFp9.js} +1 -1
- package/dist/assets/{add-connection-dialog-dNJgn8Ox.js → add-connection-dialog-BTUO6NJ0.js} +1 -1
- package/dist/assets/{agent-panel-CZV8iRUC.js → agent-panel-D2MAo4Fl.js} +1 -1
- package/dist/assets/{ai-model-dropdown-CHNX-Yvn.js → ai-model-dropdown-DAgirzoG.js} +1 -1
- package/dist/assets/{app-config-button-B7ptjTn8.js → app-config-button-CM7eYfWU.js} +1 -1
- package/dist/assets/{cell-editor-OuSBQcHa.js → cell-editor-CTaekLvG.js} +1 -1
- package/dist/assets/{cell-link-CeI1GPxX.js → cell-link-D8xLFRwF.js} +1 -1
- package/dist/assets/{cells-CkQXmtbU.js → cells-9Zp_JbEx.js} +33 -33
- package/dist/assets/{chat-display-qsryOR04.js → chat-display-C9e79L_T.js} +1 -1
- package/dist/assets/{chat-panel-B0ITjHrb.js → chat-panel-Bd1FEqbW.js} +1 -1
- package/dist/assets/{chat-ui-FgswEfHK.js → chat-ui-DOiOkm2n.js} +1 -1
- package/dist/assets/{column-preview-hHmxmCnB.js → column-preview-CoawaYbp.js} +1 -1
- package/dist/assets/{command-palette-BlNedegf.js → command-palette-BlLPeMPB.js} +1 -1
- package/dist/assets/{common-B1gBVTty.js → common--vhf6hkz.js} +1 -1
- package/dist/assets/{components-GayobceR.js → components-Cdl3TnkR.js} +1 -1
- package/dist/assets/{components-4Llkti3I.js → components-D8goxQ66.js} +1 -1
- package/dist/assets/{datasource-DohSpOc8.js → datasource-AQKUhUjP.js} +1 -1
- package/dist/assets/{dependency-graph-panel-_bVWly6X.js → dependency-graph-panel-Dmzxw1B_.js} +1 -1
- package/dist/assets/{documentation-panel-DBQM75dO.js → documentation-panel-eJQ66av2.js} +1 -1
- package/dist/assets/{download-aayD25Wi.js → download-CsVG4qrR.js} +1 -1
- package/dist/assets/{edit-page-Cw8d_f2S.js → edit-page-C28CPNWD.js} +3 -3
- package/dist/assets/{error-panel-D-9BQN8U.js → error-panel-DMnj0nOD.js} +1 -1
- package/dist/assets/{file-explorer-panel-CxfXG24m.js → file-explorer-panel-DeoEBy9i.js} +1 -1
- package/dist/assets/{file-icons-UkZeY45t.js → file-icons-DLa7-MLk.js} +1 -1
- package/dist/assets/{floating-outline--H6knKWf.js → floating-outline-DdtzicWh.js} +1 -1
- package/dist/assets/{focus-DxuOmtKI.js → focus-COBUb5b6.js} +1 -1
- package/dist/assets/{form-3fPAWHbK.js → form-BNhPt7_q.js} +1 -1
- package/dist/assets/{home-page-_beA3R51.js → home-page-BbQwtlN0.js} +1 -1
- package/dist/assets/{hooks-B4ys0c0n.js → hooks-XpLDm4ny.js} +1 -1
- package/dist/assets/{html-to-image-RqGk5tNG.js → html-to-image-BB3CKaMw.js} +1 -1
- package/dist/assets/{index-lpZP7WFc.js → index-ddxYLCBl.js} +4 -4
- package/dist/assets/{kiosk-mode-CtVLUXra.js → kiosk-mode-BVPZu333.js} +1 -1
- package/dist/assets/{layout-Dz6l5gDf.js → layout-CU55YmC3.js} +1 -1
- package/dist/assets/{logs-panel-Gg9rCqvY.js → logs-panel-C8usBneO.js} +1 -1
- package/dist/assets/{markdown-renderer-CPtNggG4.js → markdown-renderer-BclMAJo1.js} +1 -1
- package/dist/assets/{name-cell-input-D3CxUPEc.js → name-cell-input-B_6HAmm5.js} +1 -1
- package/dist/assets/{outline-panel-COUl_K0O.js → outline-panel-ljJ_fuK8.js} +1 -1
- package/dist/assets/{packages-panel-C_MusfCT.js → packages-panel-4kAgcZnP.js} +1 -1
- package/dist/assets/{panels-DwDu5SGI.js → panels-CHFFNaFY.js} +1 -1
- package/dist/assets/{process-output-B4IfPdhN.js → process-output-GJTUEkWa.js} +1 -1
- package/dist/assets/{readonly-python-code-CcyUzrM-.js → readonly-python-code-Lck67mJo.js} +1 -1
- package/dist/assets/{run-page-C2kQLw9h.js → run-page-Tt0WlqGQ.js} +1 -1
- package/dist/assets/{scratchpad-panel-BN9Sv2Hh.js → scratchpad-panel-CEN-dBEu.js} +1 -1
- package/dist/assets/{session-panel-CMI4faW3.js → session-panel-CcYW5DIV.js} +1 -1
- package/dist/assets/{snippets-panel-lJwSEA5M.js → snippets-panel-B87fFN0r.js} +1 -1
- package/dist/assets/state-BV4n_RxL.js +3 -0
- package/dist/assets/{state-DbB3Bx1n.js → state-DF3-mDqB.js} +1 -1
- package/dist/assets/{textarea-jLEyGvlo.js → textarea-DwVik6yG.js} +1 -1
- package/dist/assets/{tracing-CFor4yuK.js → tracing-BzXQ5H6_.js} +1 -1
- package/dist/assets/{tracing-panel-DM9aAZvv.js → tracing-panel-DyqA4WqJ.js} +2 -2
- package/dist/assets/{useAddCell-pxYjm9Vz.js → useAddCell-DgomfDJt.js} +1 -1
- package/dist/assets/{useCellActionButton-GNljpGS_.js → useCellActionButton-CfZZmpoB.js} +1 -1
- package/dist/assets/{useDeleteCell-1EiCOF19.js → useDeleteCell-DNcoM-0z.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-DLosV83A.js → useDependencyPanelTab-eVqw00QY.js} +1 -1
- package/dist/assets/{useNotebookActions-D_eNWvNH.js → useNotebookActions-Di_CkPfK.js} +1 -1
- package/dist/assets/{useRunCells-BGxIfw3R.js → useRunCells-DM6jetbr.js} +1 -1
- package/dist/assets/{useSplitCell-oguWPZqA.js → useSplitCell-BDm4rmCg.js} +1 -1
- package/dist/index.html +22 -22
- package/package.json +1 -1
- package/src/core/cells/__tests__/apply-transaction.test.ts +441 -0
- package/src/core/cells/__tests__/cells.test.ts +110 -0
- package/src/core/cells/cells.ts +18 -0
- package/src/core/cells/document-changes.ts +34 -1
- package/src/plugins/core/__test__/trusted-url.test.ts +45 -1
- package/src/plugins/core/trusted-url.ts +27 -2
- package/dist/assets/state-BoK4XWzN.js +0 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
3
|
+
import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
|
|
4
|
+
import { store } from "@/core/state/jotai";
|
|
3
5
|
import { isTrustedVirtualFileUrl } from "../trusted-url";
|
|
4
6
|
|
|
5
7
|
describe("isTrustedVirtualFileUrl", () => {
|
|
@@ -45,4 +47,46 @@ describe("isTrustedVirtualFileUrl", () => {
|
|
|
45
47
|
expect(isTrustedVirtualFileUrl(42)).toBe(false);
|
|
46
48
|
expect(isTrustedVirtualFileUrl({})).toBe(false);
|
|
47
49
|
});
|
|
50
|
+
|
|
51
|
+
describe("data URL exemption", () => {
|
|
52
|
+
let previousHasRunAnyCell: boolean;
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
previousHasRunAnyCell = store.get(hasRunAnyCellAtom);
|
|
56
|
+
store.set(hasRunAnyCellAtom, true);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
afterEach(() => {
|
|
60
|
+
store.set(hasRunAnyCellAtom, previousHasRunAnyCell);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it.each([
|
|
64
|
+
"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
|
|
65
|
+
"data:application/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
|
|
66
|
+
"data:text/css;base64,Ym9keXt9",
|
|
67
|
+
])("accepts safe data URL %s after a cell has run", (url) => {
|
|
68
|
+
expect(isTrustedVirtualFileUrl(url)).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it.each([
|
|
72
|
+
// Non-base64 data URLs are refused
|
|
73
|
+
"data:text/javascript,alert(1)",
|
|
74
|
+
"data:text/javascript;charset=utf-8,alert(1)",
|
|
75
|
+
// HTML / SVG / arbitrary types are refused
|
|
76
|
+
"data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==",
|
|
77
|
+
"data:image/svg+xml;base64,PHN2Zy8+",
|
|
78
|
+
"data:application/octet-stream;base64,AAA=",
|
|
79
|
+
])("still rejects unsafe data URL %s", (url) => {
|
|
80
|
+
expect(isTrustedVirtualFileUrl(url)).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("rejects data URL when no cell has been run", () => {
|
|
84
|
+
store.set(hasRunAnyCellAtom, false);
|
|
85
|
+
expect(
|
|
86
|
+
isTrustedVirtualFileUrl(
|
|
87
|
+
"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
|
|
88
|
+
),
|
|
89
|
+
).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
48
92
|
});
|
|
@@ -1,20 +1,45 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
|
|
4
|
+
import { store } from "@/core/state/jotai";
|
|
5
|
+
|
|
3
6
|
/**
|
|
4
7
|
* Whether a URL can be trusted to point at a marimo-served virtual file.
|
|
5
8
|
*
|
|
6
9
|
* Plugins that load remote scripts or stylesheets (e.g. MplInteractive, Panel)
|
|
7
10
|
* must call this before turning a plugin-supplied URL into a `<script src>` or
|
|
8
|
-
* `<link href>`. The backend
|
|
11
|
+
* `<link href>`. The backend normally serializes these URLs as virtual file
|
|
9
12
|
* paths of the form `./@file/<byte_length>-<filename>` (see
|
|
10
13
|
* `VirtualFile.create_and_register`). Accepting anything else would let a
|
|
11
14
|
* maliciously crafted `<marimo-*>` element embedded in markdown load
|
|
12
15
|
* attacker-controlled JavaScript at same origin, since the HTML sanitizer
|
|
13
16
|
* lets arbitrary marimo custom elements and attributes through.
|
|
17
|
+
*
|
|
18
|
+
* Some runtimes (WASM, VS Code) have no backend to serve virtual files, so
|
|
19
|
+
* `VirtualFile` falls back to inline base64 data URLs (see `virtual_file.py`).
|
|
20
|
+
* We accept those only once the user has explicitly run a cell in the current
|
|
21
|
+
* notebook — the same trust signal `sanitize.ts` uses to lift HTML
|
|
22
|
+
* sanitization. Running a cell requires deliberate user action and already
|
|
23
|
+
* executes arbitrary Python, so a data URL script loaded afterwards is not a
|
|
24
|
+
* new attack surface.
|
|
14
25
|
*/
|
|
15
26
|
export function isTrustedVirtualFileUrl(url: unknown): url is string {
|
|
16
27
|
if (typeof url !== "string" || url.length === 0) {
|
|
17
28
|
return false;
|
|
18
29
|
}
|
|
19
|
-
|
|
30
|
+
if (/^(\.?\/)?@file\/[^?#]+$/.test(url)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (isSafeDataUrl(url) && store.get(hasRunAnyCellAtom)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isSafeDataUrl(url: string): boolean {
|
|
40
|
+
return (
|
|
41
|
+
url.startsWith("data:text/javascript;base64,") ||
|
|
42
|
+
url.startsWith("data:application/javascript;base64,") ||
|
|
43
|
+
url.startsWith("data:text/css;base64,")
|
|
44
|
+
);
|
|
20
45
|
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
var Ot=Object.defineProperty;var He=f=>{throw TypeError(f)};var $t=(f,h,y)=>h in f?Ot(f,h,{enumerable:!0,configurable:!0,writable:!0,value:y}):f[h]=y;var n=(f,h,y)=>$t(f,typeof h!="symbol"?h+"":h,y),ue=(f,h,y)=>h.has(f)||He("Cannot "+y);var o=(f,h,y)=>(ue(f,h,"read from private field"),y?y.call(f):h.get(f)),_=(f,h,y)=>h.has(f)?He("Cannot add the same private member more than once"):h instanceof WeakSet?h.add(f):h.set(f,y),C=(f,h,y,z)=>(ue(f,h,"write to private field"),z?z.call(f,y):h.set(f,y),y),A=(f,h,y)=>(ue(f,h,"access private method"),y);import{i as Q,p as de,u as zt}from"./useEvent-D91BmmQi.js";import{An as Vt,Si as Y,b as Qt,ci as Yt,di as Gt,gi as Jt,it as Oe,pi as Kt,x as Xt,xi as Zt,__tla as er}from"./cells-CkQXmtbU.js";import{t as tr}from"./get-C-qh_et5.js";import{t as rr}from"./debounce-DhnxH9Rh.js";import{t as sr}from"./_baseSet-CxV9N1bc.js";import{_ as p,y as g}from"./useEventListener-BR0C1MaI.js";import{t as nr}from"./invariant-BUdrueMv.js";import{S as ar}from"./utils-DIGrmLDO.js";import{S as ir,n as or}from"./config-Calf6e81.js";import{n as lr}from"./switch-CqJGGLBT.js";import{n as $e}from"./globals-DY_dRKpv.js";import{at as ce,ot as ze,__tla as ur}from"./JsonOutput-CcRaYhT-.js";import{t as dr}from"./createReducer-1ePoj7v6.js";import{r as cr}from"./strings-md4mFbOQ.js";import{t as pe}from"./requests-DIwGYs0l.js";import{a as Ve,l as pr,r as Qe,__tla as fr}from"./markdown-renderer-CPtNggG4.js";import{t as hr}from"./DeferredRequestRegistry-C2V-hXrK.js";import{t as mr}from"./preload-helper-BFv3hW2s.js";import{t as Ye}from"./Deferred-Bk0r4KDZ.js";import{t as Ge}from"./uuid-CCkGk34L.js";import{t as gr}from"./use-toast-PYIpV284.js";import{n as yr,r as wr,t as br}from"./share-CJEPnWjm.js";import{t as vr}from"./blob-CpeNXBj-.js";import{i as Je,r as _r,t as Cr}from"./events-CWUex2qo.js";let G,Ke,Xe,fe,Ze,et,he,tt,J,rt,st,me,ge,nt,at,it,ot,ne,lt,ut,ye,dt,we,Rr=Promise.all([(()=>{try{return er}catch{}})(),(()=>{try{return ur}catch{}})(),(()=>{try{return fr}catch{}})()]).then(async()=>{var U,ee,pt,Le,M,T,E,Ne,F,Ae,P,V,D,ae,Ue,Te,te,I,L,H,R,j,N,ft,ht,mt,re;function f(t,e,r){return t==null?t:sr(t,e,r)}G=f,Ze=de(null);var{valueAtom:h,useActions:y}=dr(()=>({banners:[]}),{addBanner:(t,e)=>({...t,banners:[...t.banners,{...e,id:Ge()}]}),removeBanner:(t,e)=>({...t,banners:t.banners.filter(r=>r.id!==e)}),clearBanners:t=>({...t,banners:[]})});dt=()=>zt(h),Ke=function(){return y()};let z,ve,_e;z=class{constructor(){n(this,"subscriptions",new Map)}addSubscription(t,e){var r;this.subscriptions.has(t)||this.subscriptions.set(t,new Set),(r=this.subscriptions.get(t))==null||r.add(e)}removeSubscription(t,e){var r;(r=this.subscriptions.get(t))==null||r.delete(e)}notify(t,e){for(let r of this.subscriptions.get(t)??[])r(e)}},we=class be{constructor(e){n(this,"subscriptions",new z);this.producer=e}static withProducerCallback(e){return new be(e)}static empty(){return new be}startProducer(){this.producer&&this.producer(e=>{this.subscriptions.notify("message",e)})}connect(){return new Promise(e=>setTimeout(e,0)).then(()=>{this.subscriptions.notify("open",new Event("open"))})}get readyState(){return WebSocket.OPEN}reconnect(e,r){this.close(),this.connect()}close(){this.subscriptions.notify("close",new Event("close"))}send(e){return this.subscriptions.notify("message",new MessageEvent("message",{data:e})),Promise.resolve()}addEventListener(e,r){this.subscriptions.addSubscription(e,r),e==="open"&&r(new Event("open")),e==="message"&&this.startProducer()}removeEventListener(e,r){this.subscriptions.removeSubscription(e,r)}},ve=1e10,_e=1e3;function K(t,e){let r=t.map(s=>`"${s}"`).join(", ");return Error(`This RPC instance cannot ${e} because the transport did not provide one or more of these methods: ${r}`)}function yt(t={}){let e={};function r(l){e=l}let s={};function a(l){var c;s.unregisterHandler&&s.unregisterHandler(),s=l,(c=s.registerHandler)==null||c.call(s,Ht)}let i;function u(l){if(typeof l=="function"){i=l;return}i=(c,w)=>{let m=l[c];if(m)return m(w);let b=l._;if(!b)throw Error(`The requested method has no handler: ${c}`);return b(c,w)}}let{maxRequestTime:d=_e}=t;t.transport&&a(t.transport),t.requestHandler&&u(t.requestHandler),t._debugHooks&&r(t._debugHooks);let v=0;function q(){return v<=ve?++v:v=0}let x=new Map,S=new Map;function O(l,...c){let w=c[0];return new Promise((m,b)=>{var $;if(!s.send)throw K(["send"],"make requests");let k=q(),W={type:"request",id:k,method:l,params:w};x.set(k,{resolve:m,reject:b}),d!==1/0&&S.set(k,setTimeout(()=>{S.delete(k),b(Error("RPC request timed out."))},d)),($=e.onSend)==null||$.call(e,W),s.send(W)})}let se=new Proxy(O,{get:(l,c,w)=>c in l?Reflect.get(l,c,w):m=>O(c,m)}),je=se;function Be(l,...c){var b;let w=c[0];if(!s.send)throw K(["send"],"send messages");let m={type:"message",id:l,payload:w};(b=e.onSend)==null||b.call(e,m),s.send(m)}let We=new Proxy(Be,{get:(l,c,w)=>c in l?Reflect.get(l,c,w):m=>Be(c,m)}),De=We,B=new Map,le=new Set;function Wt(l,c){var w;if(!s.registerHandler)throw K(["registerHandler"],"register message listeners");if(l==="*"){le.add(c);return}B.has(l)||B.set(l,new Set),(w=B.get(l))==null||w.add(c)}function Dt(l,c){var w,m;if(l==="*"){le.delete(c);return}(w=B.get(l))==null||w.delete(c),((m=B.get(l))==null?void 0:m.size)===0&&B.delete(l)}async function Ht(l){var c,w;if((c=e.onReceive)==null||c.call(e,l),!("type"in l))throw Error("Message does not contain a type.");if(l.type==="request"){if(!s.send||!i)throw K(["send","requestHandler"],"handle requests");let{id:m,method:b,params:k}=l,W;try{W={type:"response",id:m,success:!0,payload:await i(b,k)}}catch($){if(!($ instanceof Error))throw $;W={type:"response",id:m,success:!1,error:$.message}}(w=e.onSend)==null||w.call(e,W),s.send(W);return}if(l.type==="response"){let m=S.get(l.id);m!=null&&clearTimeout(m);let{resolve:b,reject:k}=x.get(l.id)??{};l.success?b==null||b(l.payload):k==null||k(Error(l.error));return}if(l.type==="message"){for(let b of le)b(l.id,l.payload);let m=B.get(l.id);if(!m)return;for(let b of m)b(l.payload);return}throw Error(`Unexpected RPC message type: ${l.type}`)}return{setTransport:a,setRequestHandler:u,request:se,requestProxy:je,send:We,sendProxy:De,addMessageListener:Wt,removeMessageListener:Dt,proxy:{send:De,request:je},_setDebugHooks:r}}function wt(t){return yt(t)}var Ce="[transport-id]";function bt(t,e){let{transportId:r}=e;return r==null?t:{[Ce]:r,data:t}}function vt(t,e){let{transportId:r,filter:s}=e,a=s==null?void 0:s();if(r!=null&&a!=null)throw Error("Cannot use both `transportId` and `filter` at the same time");let i=t;if(r){if(t[Ce]!==r)return[!0];i=t.data}return a===!1?[!0]:[!1,i]}function _t(t,e={}){let{transportId:r,filter:s,remotePort:a}=e,i=t,u=a??t,d;return{send(v){u.postMessage(bt(v,{transportId:r}))},registerHandler(v){d=q=>{let x=q.data,[S,O]=vt(x,{transportId:r,filter:()=>s==null?void 0:s(q)});S||v(O)},i.addEventListener("message",d)},unregisterHandler(){d&&i.removeEventListener("message",d)}}}function Ct(t,e){return _t(t,e)}function Re(t){return wt({transport:Ct(t,{transportId:"marimo-transport"}),maxRequestTime:2e4,_debugHooks:{onSend:e=>{p.debug("[rpc] Parent -> Worker",e)},onReceive:e=>{p.debug("[rpc] Worker -> Parent",e)}}})}ye=de("Initializing..."),Xe=de(t=>{let e=t(Qt),r=Object.values(e.cellRuntime);return r.some(s=>!pr(s.output))?!0:r.every(s=>s.status==="idle")});var qe=yr(),xe="marimo:file",Se=new Yt(null);const Rt={saveFile(t){Se.set(xe,t)},readFile(){return Se.get(xe)}};var qt={saveFile(t){Y.setCodeForHash((0,qe.compressToEncodedURIComponent)(t))},readFile(){let t=Y.getCodeFromHash()||Y.getCodeFromSearchParam();return t?(0,qe.decompressFromEncodedURIComponent)(t):null}};const xt={saveFile(t){},readFile(){let t=document.querySelector("marimo-code");return t?decodeURIComponent(t.textContent||"").trim():null}};var St={saveFile(t){},readFile(){if(window.location.hostname!=="marimo.app")return null;let t=new URL("files/wasm-intro.py",document.baseURI);return fetch(t.toString()).then(e=>e.ok?e.text():null).catch(()=>null)}};const Et={saveFile(t){},readFile(){return Q.get(Gt)??null}};var kt={saveFile(t){},readFile(){return["import marimo","app = marimo.App()","","@app.cell","def __():"," return","",'if __name__ == "__main__":'," app.run()"].join(`
|
|
2
|
-
`)}},Ee=class{constructor(t){this.stores=t}insert(t,e){this.stores.splice(t,0,e)}saveFile(t){this.stores.forEach(e=>e.saveFile(t))}readFile(){for(let t of this.stores){let e=t.readFile();if(e)return e}return null}};let X;J=new Ee([Et,xt,qt]),X=new Ee([Rt,St,kt]),ge=class ct{constructor(){n(this,"initialized",new Ye);n(this,"sendRename",async({filename:e})=>(e===null||(Y.setFilename(e),await this.rpc.proxy.request.bridge({functionName:"rename_file",payload:e})),null));n(this,"sendSave",async e=>{if(!this.saveRpc)return p.warn("Save RPC not initialized"),null;await this.saveRpc.saveNotebook(e);let r=await this.readCode();return r.contents&&(J.saveFile(r.contents),X.saveFile(r.contents)),this.rpc.proxy.request.saveNotebook(e).catch(s=>{p.error(s)}),null});n(this,"sendCopy",async()=>{g()});n(this,"sendStdin",async e=>(await this.rpc.proxy.request.bridge({functionName:"put_input",payload:e.text}),null));n(this,"sendPdb",async()=>{g()});n(this,"sendRun",async e=>(await this.rpc.proxy.request.loadPackages(e.codes.join(`
|
|
3
|
-
`)),await this.putControlRequest({type:"execute-cells",...e}),null));n(this,"sendRunScratchpad",async e=>(await this.rpc.proxy.request.loadPackages(e.code),await this.putControlRequest({type:"execute-scratchpad",...e}),null));n(this,"sendInterrupt",async()=>(this.interruptBuffer!==void 0&&(this.interruptBuffer[0]=2),null));n(this,"sendShutdown",async()=>(window.close(),null));n(this,"sendFormat",async e=>await this.rpc.proxy.request.bridge({functionName:"format",payload:e}));n(this,"sendDeleteCell",async e=>(await this.putControlRequest({type:"delete-cell",...e}),null));n(this,"sendInstallMissingPackages",async e=>(this.putControlRequest({type:"install-packages",...e}),null));n(this,"sendCodeCompletionRequest",async e=>(Q.get(Xt)||await this.rpc.proxy.request.bridge({functionName:"code_complete",payload:e}),null));n(this,"saveUserConfig",async e=>(await this.rpc.proxy.request.bridge({functionName:"save_user_config",payload:e}),lr.post("/kernel/save_user_config",e,{baseUrl:"/"}).catch(r=>(p.error(r),null))));n(this,"saveAppConfig",async e=>(await this.rpc.proxy.request.bridge({functionName:"save_app_config",payload:e}),null));n(this,"saveCellConfig",async e=>(await this.putControlRequest({type:"update-cell-config",...e}),null));n(this,"sendRestart",async()=>{let e=await this.readCode();return e.contents&&(J.saveFile(e.contents),X.saveFile(e.contents)),wr(),null});n(this,"readCode",async()=>this.saveRpc?{contents:await this.saveRpc.readNotebook()}:(p.warn("Save RPC not initialized"),{contents:""}));n(this,"readSnippets",async()=>await this.rpc.proxy.request.bridge({functionName:"read_snippets",payload:void 0}));n(this,"openFile",async({path:e})=>{let r=br({code:null,baseUrl:window.location.origin});return window.open(r,"_blank"),null});n(this,"sendListFiles",async e=>await this.rpc.proxy.request.bridge({functionName:"list_files",payload:e}));n(this,"sendSearchFiles",async e=>await this.rpc.proxy.request.bridge({functionName:"search_files",payload:e}));n(this,"sendComponentValues",async e=>(await this.putControlRequest({type:"update-ui-element",...e,token:Ge()}),null));n(this,"sendInstantiate",async e=>null);n(this,"sendFunctionRequest",async e=>(await this.putControlRequest({type:"invoke-function",...e}),null));n(this,"sendCreateFileOrFolder",async e=>await this.rpc.proxy.request.bridge({functionName:"create_file_or_directory",payload:e}));n(this,"sendDeleteFileOrFolder",async e=>await this.rpc.proxy.request.bridge({functionName:"delete_file_or_directory",payload:e}));n(this,"sendRenameFileOrFolder",async e=>await this.rpc.proxy.request.bridge({functionName:"move_file_or_directory",payload:e}));n(this,"sendUpdateFile",async e=>await this.rpc.proxy.request.bridge({functionName:"update_file",payload:e}));n(this,"sendFileDetails",async e=>await this.rpc.proxy.request.bridge({functionName:"file_details",payload:e}));n(this,"exportAsHTML",async e=>await this.rpc.proxy.request.bridge({functionName:"export_html",payload:e}));n(this,"exportAsMarkdown",async e=>await this.rpc.proxy.request.bridge({functionName:"export_markdown",payload:e}));n(this,"previewDatasetColumn",async e=>(await this.putControlRequest({type:"preview-dataset-column",...e}),null));n(this,"previewSQLTable",async e=>(await this.putControlRequest({type:"preview-sql-table",...e}),null));n(this,"previewSQLTableList",async e=>(await this.putControlRequest({type:"list-sql-tables",...e}),null));n(this,"previewSQLSchemaList",async e=>(await this.putControlRequest({type:"list-sql-schemas",...e}),null));n(this,"previewDataSourceConnection",async e=>(await this.putControlRequest({type:"list-data-source-connection",...e}),null));n(this,"validateSQL",async e=>(await this.putControlRequest({type:"validate-sql",...e}),null));n(this,"sendModelValue",async e=>(await this.putControlRequest({type:"model",...e}),null));n(this,"sendDocumentTransaction",()=>Promise.resolve(null));n(this,"addPackage",async e=>this.rpc.proxy.request.addPackage(e));n(this,"removePackage",async e=>this.rpc.proxy.request.removePackage(e));n(this,"getPackageList",async()=>await this.rpc.proxy.request.listPackages());n(this,"getDependencyTree",async()=>({tree:{dependencies:[],name:"",tags:[],version:null}}));n(this,"listSecretKeys",async e=>(await this.putControlRequest({type:"list-secret-keys",...e}),null));n(this,"getUsageStats",g);n(this,"openTutorial",g);n(this,"getRecentFiles",g);n(this,"getWorkspaceFiles",g);n(this,"getRunningNotebooks",g);n(this,"shutdownSession",g);n(this,"exportAsIPYNB",g);n(this,"exportAsPDF",g);n(this,"autoExportAsHTML",g);n(this,"autoExportAsMarkdown",g);n(this,"autoExportAsIPYNB",g);n(this,"updateCellOutputs",g);n(this,"writeSecret",g);n(this,"invokeAiTool",g);n(this,"clearCache",g);n(this,"getCacheInfo",g);n(this,"listStorageEntries",g);n(this,"downloadStorage",g);ir()&&(this.rpc=Re(new Worker(new URL(""+new URL("worker-BPV9SmHz.js",import.meta.url).href,""+import.meta.url),{type:"module",name:$e()})),this.rpc.addMessageListener("ready",()=>{this.startSession()}),this.rpc.addMessageListener("initialized",()=>{this.saveRpc=this.getSaveWorker(),this.setInterruptBuffer(),this.initialized.resolve()}),this.rpc.addMessageListener("initializingMessage",({message:e})=>{Q.set(ye,e)}),this.rpc.addMessageListener("initializedError",({error:e})=>{this.initialized.status==="resolved"&&(p.error(e),gr({title:"Error initializing",description:e,variant:"danger"})),this.initialized.reject(Error(e))}),this.rpc.addMessageListener("kernelMessage",({message:e})=>{var r;(r=this.messageConsumer)==null||r.call(this,new MessageEvent("message",{data:e}))}))}static get INSTANCE(){let e="_marimo_private_PyodideBridge";return window[e]||(window[e]=new ct),window[e]}getSaveWorker(){return Oe()==="read"?(p.debug("Skipping SaveWorker in read-mode"),{readFile:g,readNotebook:g,saveNotebook:g}):Re(new Worker(new URL(""+new URL("save-worker-CtJsIYIM.js",import.meta.url).href,""+import.meta.url),{type:"module",name:$e()})).proxy.request}async startSession(){let e=await J.readFile(),r=await X.readFile(),s=Q.get(Kt)??Y.getFilename(),a=Q.get(ar),i={},u=new URLSearchParams(window.location.search);for(let d of u.keys()){let v=u.getAll(d);i[d]=v.length===1?v[0]:v}await this.rpc.proxy.request.startSession({queryParameters:i,code:e||r||"",filename:s,userConfig:{...a,runtime:{...a.runtime,auto_instantiate:Oe()==="read"?!0:a.runtime.auto_instantiate}}})}setInterruptBuffer(){crossOriginIsolated?(this.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),this.rpc.proxy.request.setInterruptBuffer(this.interruptBuffer)):p.warn("Not running in a secure context; interrupts are not available.")}attachMessageConsumer(e){this.messageConsumer=e,this.rpc.proxy.send.consumerReady({})}async putControlRequest(e){await this.rpc.proxy.request.bridge({functionName:"put_control_request",payload:e})}},rt=function(){return we.withProducerCallback(t=>{ge.INSTANCE.attachMessageConsumer(t)})},tt=function(t=ce()){let e=window.fetch;return window.fetch=async(r,s)=>{let a=r instanceof Request?r.url:r.toString();if(a.startsWith("data:"))return e(r,s);try{let i=Z(a,t);if(i){let u=await(await e(i)).arrayBuffer();return new Response(u,{headers:{"Content-Type":Mt(a)}})}return e(r,s)}catch(i){return p.error("Error parsing URL",i),e(r,s)}},()=>{window.fetch=e}};function Mt(t){return t.endsWith(".csv")?"text/csv":t.endsWith(".json")?"application/json":t.endsWith(".txt")?"text/plain":"application/octet-stream"}it=function(t,e=ce()){let r=t.http.bind(t),s=t.load.bind(t);return t.http=async a=>{let i=Z(a,e);if(i)return await window.fetch(i).then(u=>u.text());try{return await r(a)}catch(u){if(a.startsWith("data:"))return await window.fetch(a).then(d=>d.text());throw u}},t.load=async a=>{let i=Z(a,e);if(i)return await window.fetch(i).then(u=>u.text());try{return await s(a)}catch(u){if(a.startsWith("data:"))return await window.fetch(a).then(d=>d.text());throw u}},()=>{t.http=r,t.load=s}};function ke(t){return t.startsWith(".")?t.slice(1):t}function Pt(t,e=ce()){let r=Z(t,e);if(!r)return t;let s=vr(r);return URL.createObjectURL(s)}function Z(t,e){let r=document.baseURI;r.startsWith("blob:")&&(r=r.replace("blob:",""));let s=new URL(t,r).pathname,a=Me(t),i=Me(s);return e[t]||e[ke(t)]||e[s]||e[ke(s)]||a&&e[a]||i&&e[i]}function Me(t){let e=t.indexOf("/@file/");return e===-1?null:t.slice(e)}function ie(t,e=[]){let r=[];if(t instanceof DataView)r.push(e);else if(Array.isArray(t))for(let[s,a]of t.entries())r.push(...ie(a,[...e,s]));else if(typeof t=="object"&&t)for(let[s,a]of Object.entries(t))r.push(...ie(a,[...e,s]));return r}function Ft(t){let e=ie(t);if(e.length===0)return{state:t,buffers:[],bufferPaths:[]};let r=structuredClone(t),s=[],a=[];for(let i of e){let u=tr(t,i);if(u instanceof DataView){let d=Ve(u);s.push(d),a.push(i),G(r,i,d)}}return{state:r,buffers:s,bufferPaths:a}}function Pe(t){let{state:e,bufferPaths:r,buffers:s}=t;if(!r||r.length===0)return e;s&&nr(s.length===r.length,"Buffers and buffer paths not the same length");let a=e;for(let[i,u]of r.entries()){let d=s==null?void 0:s[i];if(d==null){p.warn("[anywidget] Could not find buffer at path",u);continue}typeof d=="string"?G(a,u,Qe(d)):G(a,u,d)}return a}he=function(t){return typeof t!="string"||t.length===0?!1:/^(\.?\/)?@file\/[^?#]+$/.test(t)};const Fe={invoke:async()=>{let t="anywidget.invoke not supported in marimo. Please file an issue at https://github.com/marimo-team/marimo/issues";throw p.warn(t),Error(t)}};function It(t){if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let e=new AbortController;for(let r of t){if(r.aborted)return e.abort(r.reason),e.signal;r.addEventListener("abort",()=>e.abort(r.reason),{once:!0})}return e.signal}var Lt=(Le=class{constructor(){_(this,ee);_(this,U,new Map)}getModule(t,e){let r=o(this,U).get(e);if(r)return r;let s=A(this,ee,pt).call(this,t).catch(a=>{throw o(this,U).delete(e),a});return o(this,U).set(e,s),s}invalidate(t){p.debug(`[WidgetDefRegistry] Invalidating module cache for hash=${t}`),o(this,U).delete(t)}},U=new WeakMap,ee=new WeakSet,pt=async function(t){if(!he(t))throw Error(`Refusing to load anywidget module from untrusted URL: ${String(t)}`);let e=or(t).toString();return ze()&&(e=Pt(e)),mr(()=>import(e).then(async r=>(await r.__tla,r)),[],import.meta.url)},Le),Nt=(Ne=class{constructor(){_(this,M);_(this,T);_(this,E)}async bind(t,e){var i,u;if(o(this,E)&&o(this,T)===t)return o(this,E);o(this,E)&&o(this,T)!==t&&(p.debug("[WidgetBinding] Hot-reload detected, aborting previous binding"),(i=o(this,M))==null||i.abort(),C(this,M,void 0),C(this,E,void 0)),C(this,T,t),C(this,M,new AbortController);let r=o(this,M).signal,s=typeof t=="function"?await t():t,a=await((u=s.initialize)==null?void 0:u.call(s,{model:e,experimental:Fe}));return a&&r.addEventListener("abort",a),C(this,E,async(d,v)=>{var x;let q=await((x=s.render)==null?void 0:x.call(s,{model:e,el:d,experimental:Fe}));q&&It([v,r]).addEventListener("abort",()=>{let S=v.aborted?"view unmount":"binding destroyed";p.debug(`[WidgetBinding] Render cleanup triggered (reason: ${S})`),q()})}),o(this,E)}destroy(){var t;p.debug("[WidgetBinding] Destroying binding, aborting initialize lifecycle"),(t=o(this,M))==null||t.abort(),C(this,M,void 0),C(this,T,void 0),C(this,E,void 0)}},M=new WeakMap,T=new WeakMap,E=new WeakMap,Ne),At=(Ae=class{constructor(){_(this,F,new Map)}getOrCreate(t){let e=o(this,F).get(t);return e||(e=new Nt,o(this,F).set(t,e)),e}destroy(t){let e=o(this,F).get(t);e&&(p.debug(`[BindingManager] Destroying binding for model=${t}`),e.destroy(),o(this,F).delete(t))}has(t){return o(this,F).has(t)}},F=new WeakMap,Ae);ut=new Lt,me=new At;var Ut=(Ue=class{constructor(t=1e4){_(this,D);_(this,P,new Map);_(this,V);C(this,V,t)}get(t){let e=A(this,D,ae).call(this,t);return e.deferred.status==="pending"&&setTimeout(()=>{e.deferred.status==="pending"&&(e.deferred.reject(Error(`Model not found for key: ${t}`)),o(this,P).delete(t))},o(this,V)),e.deferred.promise}create(t,e){let r=A(this,D,ae).call(this,t);r.deferred.resolve(e(r.controller.signal))}set(t,e){A(this,D,ae).call(this,t).deferred.resolve(e)}getSync(t){let e=o(this,P).get(t);if(e&&e.deferred.status==="resolved")return e.deferred.value}delete(t){var e;p.debug(`[ModelManager] Deleting model=${t}, aborting lifecycle signal`),(e=o(this,P).get(t))==null||e.controller.abort(),o(this,P).delete(t)}},P=new WeakMap,V=new WeakMap,D=new WeakSet,ae=function(t){let e=o(this,P).get(t);return e||(e={deferred:new Ye,controller:new AbortController},o(this,P).set(t,e)),e},Ue),Ie=Symbol("marimo");function oe(t){return t[Ie]}ne=new Ut;var Tt=(Te=Ie,j=class{constructor(e,r,s){_(this,N);_(this,te,"change");_(this,I);_(this,L);_(this,H);_(this,R,{});n(this,Te,{updateAndEmitDiffs:e=>A(this,N,ht).call(this,e),emitCustomMessage:(e,r)=>A(this,N,mt).call(this,e,r)});n(this,"widget_manager",{async get_model(e){let r=await j._modelManager.get(e);if(!r)throw Error(`Model not found with id: ${e}. This is likely because the model was not registered.`);return r}});_(this,re,rr(()=>{let e=o(this,R)[o(this,te)];if(e)for(let r of e)try{r()}catch(s){p.error("Error emitting event",s)}},0));C(this,L,e),C(this,H,r),C(this,I,new Map),s&&s.addEventListener("abort",()=>{p.debug("[Model] Signal aborted, clearing all listeners"),C(this,R,{})})}off(e,r){var s;if(!e){C(this,R,{});return}if(!r){o(this,R)[e]=new Set;return}(s=o(this,R)[e])==null||s.delete(r)}send(e,r,s){let a=(s??[]).map(i=>i instanceof ArrayBuffer?new DataView(i):new DataView(i.buffer,i.byteOffset,i.byteLength));return o(this,H).sendCustomMessage(e,a).then(()=>r==null?void 0:r())}get(e){return o(this,L)[e]}set(e,r){C(this,L,{...o(this,L),[e]:r}),o(this,I).set(e,r),A(this,N,ft).call(this,`change:${e}`,r),o(this,re).call(this)}save_changes(){if(o(this,I).size===0)return;let e=Object.fromEntries(o(this,I).entries());o(this,I).clear(),o(this,H).sendUpdate(e)}on(e,r){o(this,R)[e]||(o(this,R)[e]=new Set),o(this,R)[e].add(r)}},te=new WeakMap,I=new WeakMap,L=new WeakMap,H=new WeakMap,R=new WeakMap,N=new WeakSet,ft=function(e,r){if(!o(this,R)[e])return;let s=o(this,R)[e];for(let a of s)try{a(r)}catch(i){p.error("Error emitting event",i)}},ht=function(e){e!=null&&Object.keys(e).forEach(r=>{let s=r;o(this,L)[s]!==e[s]&&this.set(s,e[s])})},mt=function(e,r=[]){let s=o(this,R)["msg:custom"];if(s)for(let a of s)try{a(e.content,r)}catch(i){p.error("Error emitting event",i)}},re=new WeakMap,n(j,"_modelManager",ne),j);et=async function(t,e){let r=e.model_id,s=e.message,a=("buffers"in s?s.buffers:[]).map(Qe);switch(s.method){case"open":{let{state:i,buffer_paths:u=[]}=s,d=Pe({state:i,bufferPaths:u,buffers:a}),v=t.getSync(r);if(v){oe(v).updateAndEmitDiffs(d);return}t.create(r,q=>new Tt(d,ze()?{sendUpdate:async()=>{},sendCustomMessage:async()=>{}}:{async sendUpdate(x){if(q.aborted){p.debug(`[Model] sendUpdate suppressed for model=${r} (signal aborted)`);return}let{state:S,buffers:O,bufferPaths:se}=Ft(x);await pe().sendModelValue({modelId:r,message:{method:"update",state:S,bufferPaths:se},buffers:O})},async sendCustomMessage(x,S){if(q.aborted){p.debug(`[Model] sendCustomMessage suppressed for model=${r} (signal aborted)`);return}await pe().sendModelValue({modelId:r,message:{method:"custom",content:x},buffers:S.map(Ve)})}},q));return}case"custom":oe(await t.get(r)).emitCustomMessage({method:"custom",content:s.content},a);return;case"close":me.destroy(r),t.delete(r);return;case"update":{let{state:i,buffer_paths:u=[]}=s,d=Pe({state:i,bufferPaths:u,buffers:a});oe(await t.get(r)).updateAndEmitDiffs(d);return}default:cr(s)}},Vt(ne,"MODEL_MANAGER");function jt(t){return typeof t!="object"||!t?!1:"type"in t&&t.type==="marimo-ui-value-update"}fe=class gt{static get INSTANCE(){let e="_marimo_private_UIElementRegistry";return window[e]||(window[e]=new gt),window[e]}constructor(){this.entries=new Map}has(e){return this.entries.has(e)}set(e,r){this.entries.has(e)&&p.debug("UIElementRegistry overwriting entry for objectId.",e),this.entries.set(e,{objectId:e,value:r,elements:new Set})}registerInstance(e,r){let s=this.entries.get(e);s===void 0?this.entries.set(e,{objectId:e,value:Zt(r,this),elements:new Set([r])}):s.elements.add(r)}removeInstance(e,r){let s=this.entries.get(e);s!=null&&s.elements.has(r)&&s.elements.delete(r)}removeElementsByCell(e){[...this.entries.keys()].filter(r=>r.startsWith(`${e}-`)).forEach(r=>{this.entries.delete(r)})}lookupValue(e){let r=this.entries.get(e);return r===void 0?void 0:r.value}broadcastMessage(e,r,s){let a=this.entries.get(e);if(a===void 0){p.warn("UIElementRegistry missing entry",e);return}if(jt(r)){a.value=r.value,a.elements.forEach(i=>{i.dispatchEvent(Je.create({bubbles:!1,composed:!0,detail:{value:r.value,element:i}}))});return}a.elements.forEach(i=>{i.dispatchEvent(Cr.create({bubbles:!1,composed:!0,detail:{objectId:e,message:r,buffers:s}}))})}broadcastValueUpdate(e,r,s){let a=this.entries.get(r);a===void 0?p.warn("UIElementRegistry missing entry",r):(a.value=s,a.elements.forEach(i=>{i!==e&&i.dispatchEvent(Je.create({bubbles:!1,composed:!0,detail:{value:s,element:i}}))}),document.dispatchEvent(_r.create({bubbles:!0,composed:!0,detail:{objectId:r}})))}},at=fe.INSTANCE,st=new hr("function-call-result",async(t,e)=>{await pe().sendFunctionRequest({functionCallId:t,...e})}),lt="68px";var Bt="288px";nt=t=>t?/^\d+$/.test(t)?`${t}px`:t:Bt,ot=Jt({isOpen:!0},(t,e)=>{if(!e)return t;switch(e.type){case"toggle":return{...t,isOpen:e.isOpen??t.isOpen};case"setWidth":return{...t,width:e.width};default:return t}})});export{G as C,Ke as S,Xe as _,Rr as __tla,fe as a,Ze as b,et as c,he as d,tt as f,J as g,rt as h,st as i,me as l,ge as m,nt as n,at as o,it as p,ot as r,ne as s,lt as t,ut as u,ye as v,dt as x,we as y};
|