@marimo-team/islands 0.15.2 → 0.15.4
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/{ConnectedDataExplorerComponent-C39nQwtD.js → ConnectedDataExplorerComponent-B68gXlbY.js} +323 -328
- package/dist/{ImageComparisonComponent-BhkiyswP.js → ImageComparisonComponent-Cw1oA8Tn.js} +13 -13
- package/dist/{_baseUniq-DdHL34FO.js → _baseUniq-CQrhBg_9.js} +67 -67
- package/dist/any-language-editor-pzUl6lxp.js +27 -0
- package/dist/{arc-BXrety1g.js → arc-BOhn-m2C.js} +1 -1
- package/dist/{architectureDiagram-KFL7JDKH-BMy6ywCF.js → architectureDiagram-W76B3OCA-DdYf2VnU.js} +144 -144
- package/dist/assets/{worker-COGufAQn.js → worker-BcG8m3h5.js} +33 -29
- package/dist/asterisk-DS281yxp.js +271 -0
- package/dist/{blockDiagram-ZYB65J3Q-DYT2-nlI.js → blockDiagram-QIGZ2CNN-DmmYotkP.js} +10 -10
- package/dist/{c4Diagram-AAMF2YG6-ZiQzioe6.js → c4Diagram-FPNF74CW-Dyz4zMHJ.js} +8 -8
- package/dist/{channel-CeuXqUAU.js → channel-CCL8jXAe.js} +1 -1
- package/dist/{chunk-ANTBXLJU-BvYnIrdq.js → chunk-4BX2VUAB-BfKwWLfJ.js} +1 -1
- package/dist/{chunk-WVR4S24B-DXj8yaUk.js → chunk-55IACEB6-CFQU7zSp.js} +1 -1
- package/dist/{chunk-GLLZNHP4-CyFsosAe.js → chunk-FMBD7UC4-DDjZzUcl.js} +1 -1
- package/dist/{chunk-JBRWN2VN-DA_EEhy2.js → chunk-K7UQS3LO-nBRjBU1H.js} +117 -117
- package/dist/{chunk-NRVI72HA-BYx2jMlI.js → chunk-QN33PNHL-B-g8sJzl.js} +1 -1
- package/dist/{chunk-FHKO5MBM-DfCztBk8.js → chunk-QZHKN3VN-B7QSJS3J.js} +1 -1
- package/dist/{chunk-LXBSTHXV-Se7vdY6J.js → chunk-TVAH2DTR-pGXll4d1.js} +7 -7
- package/dist/{chunk-OMD6QJNC-CqgcPMgL.js → chunk-TZMSLE5B-Dx9h-1mv.js} +1 -1
- package/dist/{classDiagram-v2-QTMF73CY-B19A3G1l.js → classDiagram-KNZD7YFC-BXryI7DY.js} +2 -2
- package/dist/{classDiagram-3BZAVTQC-B19A3G1l.js → classDiagram-v2-RKCZMP56-BXryI7DY.js} +2 -2
- package/dist/{clone-78au0tn1.js → clone-DqwV7ges.js} +1 -1
- package/dist/cose-bilkent-S5V4N54A-Di6FNMXz.js +2609 -0
- package/dist/{cytoscape.esm-BYnVVhJX.js → cytoscape.esm-DfdJODL8.js} +34 -34
- package/dist/{dagre-2BBEFEWP-BfEn3ZUV.js → dagre-5GWH7T2D-BTZPMTey.js} +6 -6
- package/dist/{data-grid-overlay-editor-CH_qLkV2.js → data-grid-overlay-editor-ryatXXby.js} +11 -11
- package/dist/{diagram-4IRLE6MV-CL8xidnG.js → diagram-N5W7TBWH-D79_zdOu.js} +59 -60
- package/dist/{diagram-RP2FKANI-B1BPcUew.js → diagram-QEK2KX5R-DX2A_SD0.js} +15 -15
- package/dist/{diagram-GUPCWM2R-CZ5cfqlq.js → diagram-S2PKOQOG-DM6VMTrJ.js} +10 -10
- package/dist/dockerfile-BoowzQlp.js +194 -0
- package/dist/ebnf-DUPDuY4r.js +78 -0
- package/dist/{erDiagram-HZWUO2LU-BEAIww50.js → erDiagram-AWTI2OKA-BBirxtlI.js} +8 -8
- package/dist/fcl-CPC2WYrI.js +103 -0
- package/dist/{flowDiagram-THRYKUMA-Czs2UAI2.js → flowDiagram-PVAE7QVJ-DyVweEMs.js} +9 -9
- package/dist/{ganttDiagram-WV7ZQ7D5-ByYIAVFO.js → ganttDiagram-OWAHRB6G-DTB7FX7r.js} +34 -34
- package/dist/{gitGraphDiagram-OJR772UL-BcpDsiyB.js → gitGraphDiagram-NY62KEGX-BrbIb5pD.js} +4 -4
- package/dist/{glide-data-editor-CmN6FVyi.js → glide-data-editor-DhMX4nmM.js} +33 -33
- package/dist/{graph-77W6heli.js → graph-CuLSrclI.js} +3 -3
- package/dist/http-D9LttvKF.js +44 -0
- package/dist/{index-BOojn38D.js → index-BNgdUQ2e.js} +7711 -7711
- package/dist/index-DIy6LHLJ.js +98 -0
- package/dist/{index-CmozKMxx.js → index-Df2dsx1t.js} +6 -6
- package/dist/{index-pBmAzQJl.js → index-MCx5v1x0.js} +2 -2
- package/dist/{index-Bfk9dnyS.js → index-cz_xaKvT.js} +33090 -32892
- package/dist/{infoDiagram-6WOFNB3A-CfzLHHVP.js → infoDiagram-STP46IZ2-CCBHc7-K.js} +2 -2
- package/dist/{journeyDiagram-FFXJYRFH-ndAcpkGn.js → journeyDiagram-BIP6EPQ6-LhGSj54j.js} +24 -26
- package/dist/{kanban-definition-KOZQBZVT-DcQYzNvc.js → kanban-definition-6OIFK2YF-aegTMFS6.js} +14 -14
- package/dist/{layout-XySVHJgD.js → layout-BEARWMhl.js} +81 -81
- package/dist/{linear-PbooOqg7.js → linear-fbJq6cdO.js} +35 -35
- package/dist/{main-B5yML0bw.js → main-HerZgEhd.js} +76533 -69945
- package/dist/main.js +1 -1
- package/dist/{mermaid-Cg5IX6Nv.js → mermaid-DxPYK0KX.js} +6160 -7493
- package/dist/min-DBJkhObB.js +80 -0
- package/dist/mindmap-definition-Q6HEUPPD-A3Fh5XDZ.js +785 -0
- package/dist/nginx-zDPm3Z74.js +89 -0
- package/dist/{number-overlay-editor-DUhfZqtP.js → number-overlay-editor-USMrY6k3.js} +19 -19
- package/dist/{pieDiagram-DBDJKBY4-DTOlNsja.js → pieDiagram-ADFJNKIX-Q9uFlCV0.js} +17 -17
- package/dist/{quadrantDiagram-YPSRARAO-BX2d8VS-.js → quadrantDiagram-LMRXKWRM-BuPh-qpK.js} +6 -6
- package/dist/{react-plotly-Dcyw-3Sa.js → react-plotly-HSqJPRfa.js} +3577 -3577
- package/dist/{requirementDiagram-EGVEC5DT-D1T5u-wG.js → requirementDiagram-4UW4RH46-CHROYNU_.js} +7 -7
- package/dist/{sankeyDiagram-HRAUVNP4-G6xDfnp-.js → sankeyDiagram-GR3RE2ED-DkUqHP2d.js} +5 -5
- package/dist/sequenceDiagram-C3RYC4MD-YoPTMplP.js +2519 -0
- package/dist/{slides-component-BJLlPJSr.js → slides-component-D7CHSR00.js} +66 -66
- package/dist/solr-BNlsLglM.js +41 -0
- package/dist/spreadsheet-C-cy4P5N.js +49 -0
- package/dist/{stateDiagram-UUKSUZ4H-CYXbjaom.js → stateDiagram-KXAO66HF-DEN00mVU.js} +5 -5
- package/dist/{stateDiagram-v2-EYPG3UTE-Br1HYKT6.js → stateDiagram-v2-UMBNRL4Z-DlQqSUAa.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/tiddlywiki-5wqsXtSk.js +155 -0
- package/dist/tiki-__Kn3CeS.js +181 -0
- package/dist/{time-B9SZnSen.js → time-BtVcKqeD.js} +58 -58
- package/dist/{timeline-definition-3HZDQTIS-DeK_ZRD0.js → timeline-definition-XQNQX7LJ-DEteLt8D.js} +10 -12
- package/dist/{timer-BYwnU4DF.js → timer-B0-z63CM.js} +16 -16
- package/dist/{treemap-75Q7IDZK-CKP4vV_0.js → treemap-75Q7IDZK-8S6podme.js} +14 -14
- package/dist/{vega-component-CpgdqX2d.js → vega-component-D35L45kI.js} +30 -30
- package/dist/{xychartDiagram-FDP5SA34-AMEPsx_R.js → xychartDiagram-6GGTOJPD-DKwGThyy.js} +7 -7
- package/package.json +44 -41
- package/src/__mocks__/notebook.ts +3 -0
- package/src/__mocks__/requests.ts +3 -0
- package/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +12 -12
- package/src/__tests__/chat-utils.test.ts +26 -211
- package/src/components/ai/ai-model-dropdown.tsx +25 -9
- package/src/components/ai/ai-provider-icon.tsx +5 -1
- package/src/components/app-config/ai-config.tsx +7 -0
- package/src/components/chat/acp/__tests__/__snapshots__/prompt.test.ts.snap +304 -0
- package/src/components/chat/acp/__tests__/atoms.test.ts +56 -0
- package/src/components/chat/acp/__tests__/prompt.test.ts +12 -0
- package/src/components/chat/acp/__tests__/state.test.ts +621 -0
- package/src/components/chat/acp/agent-docs.tsx +78 -0
- package/src/components/chat/acp/agent-panel.css +23 -0
- package/src/components/chat/acp/agent-panel.tsx +715 -0
- package/src/components/chat/acp/agent-selector.tsx +138 -0
- package/src/components/chat/acp/blocks.tsx +664 -0
- package/src/components/chat/acp/common.tsx +198 -0
- package/src/components/chat/acp/prompt.ts +284 -0
- package/src/components/chat/acp/scroll-to-bottom-button.tsx +50 -0
- package/src/components/chat/acp/session-tabs.tsx +138 -0
- package/src/components/chat/acp/state.ts +263 -0
- package/src/components/chat/acp/thread.tsx +121 -0
- package/src/components/chat/acp/types.ts +63 -0
- package/src/components/chat/acp/utils.ts +45 -0
- package/src/components/chat/chat-components.tsx +71 -0
- package/src/components/chat/chat-panel.tsx +481 -291
- package/src/components/chat/chat-utils.ts +50 -0
- package/src/components/chat/markdown-renderer.tsx +3 -7
- package/src/components/chat/tool-call-accordion.tsx +6 -6
- package/src/components/datasources/__tests__/utils.test.ts +6 -0
- package/src/components/datasources/column-preview.tsx +1 -3
- package/src/components/editor/actions/useNotebookActions.tsx +1 -1
- package/src/components/editor/ai/add-cell-with-ai.tsx +20 -15
- package/src/components/editor/ai/ai-completion-editor.tsx +22 -3
- package/src/components/editor/ai/completion-handlers.tsx +2 -4
- package/src/components/editor/ai/completion-utils.ts +85 -11
- package/src/components/editor/alerts/startup-logs-alert.tsx +72 -0
- package/src/components/editor/chrome/panels/datasources-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/documentation-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/error-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/file-explorer-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/logs-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/outline-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -2
- package/src/components/editor/chrome/panels/scratchpad-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/secrets-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/snippets-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/tracing-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/variable-panel.tsx +3 -1
- package/src/components/editor/chrome/types.ts +10 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +55 -31
- package/src/components/editor/controls/command-palette-button.tsx +1 -1
- package/src/components/editor/controls/command-palette.tsx +5 -4
- package/src/components/editor/controls/state.ts +4 -0
- package/src/components/editor/package-alert.tsx +108 -58
- package/src/components/editor/renderers/CellArray.tsx +2 -0
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +0 -1
- package/src/components/pages/edit-page.tsx +7 -3
- package/src/core/ai/chat-utils.ts +26 -43
- package/src/core/ai/config.ts +1 -1
- package/src/core/ai/context/__tests__/registry.test.ts +277 -3
- package/src/core/ai/context/context.ts +11 -1
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +378 -0
- package/src/core/ai/context/providers/__tests__/error.test.ts +3 -2
- package/src/core/ai/context/providers/__tests__/file.test.ts +119 -0
- package/src/core/ai/context/providers/cell-output.ts +349 -0
- package/src/core/ai/context/providers/common.ts +5 -1
- package/src/core/ai/context/providers/file.ts +287 -0
- package/src/core/ai/context/registry.ts +79 -0
- package/src/core/ai/state.ts +22 -5
- package/src/core/alerts/state.ts +71 -3
- package/src/core/cells/cell.ts +2 -2
- package/src/core/cells/cells.ts +1 -1
- package/src/core/cells/logs.ts +1 -1
- package/src/core/cells/runs.ts +6 -5
- package/src/core/codemirror/ai/resources.ts +47 -5
- package/src/core/codemirror/ai/state.ts +12 -0
- package/src/core/codemirror/language/__tests__/sql.test.ts +45 -0
- package/src/core/codemirror/markdown/__tests__/commands.test.ts +1 -0
- package/src/core/codemirror/theme/dark.ts +1 -1
- package/src/core/config/capabilities.ts +1 -1
- package/src/core/config/feature-flag.tsx +2 -0
- package/src/core/datasets/__tests__/data-source.test.ts +24 -0
- package/src/core/errors/__tests__/errors.test.ts +2 -0
- package/src/core/islands/bridge.ts +1 -0
- package/src/core/islands/main.ts +1 -0
- package/src/core/kernel/messages.ts +12 -6
- package/src/core/layout/layout.ts +3 -3
- package/src/core/network/requests-network.ts +8 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.ts +1 -0
- package/src/core/network/types.ts +4 -1
- package/src/core/wasm/bridge.ts +18 -2
- package/src/core/wasm/worker/bootstrap.ts +3 -1
- package/src/core/wasm/worker/getMarimoWheel.ts +3 -8
- package/src/core/wasm/worker/types.ts +3 -0
- package/src/core/websocket/useMarimoWebSocket.tsx +7 -1
- package/src/css/app/Cell.css +42 -21
- package/src/css/app/codemirror.css +5 -1
- package/src/css/globals.css +3 -0
- package/src/css/md.css +1 -1
- package/src/plugins/impl/MicrophonePlugin.tsx +2 -2
- package/src/plugins/impl/chat/ChatPlugin.tsx +2 -9
- package/src/plugins/impl/chat/chat-ui.tsx +129 -110
- package/src/plugins/impl/chat/types.ts +5 -8
- package/src/plugins/impl/code/__tests__/language.test.ts +15 -0
- package/src/plugins/impl/code/any-language-editor.tsx +11 -8
- package/src/plugins/impl/vega/vega.css +121 -0
- package/src/plugins/layout/MimeRenderPlugin.tsx +3 -6
- package/src/stories/cell.stories.tsx +6 -0
- package/src/stories/layout/vertical/one-column.stories.tsx +215 -0
- package/src/theme/useTheme.ts +11 -6
- package/src/utils/Logger.ts +5 -6
- package/src/utils/__tests__/blob.test.ts +37 -0
- package/src/utils/arrays.ts +13 -0
- package/src/utils/fileToBase64.ts +21 -6
- package/src/utils/json/base64.ts +5 -2
- package/src/utils/numbers.ts +9 -7
- package/dist/any-language-editor-DC5170DQ.js +0 -45
- package/dist/asn1-jKiBa2Ya.js +0 -95
- package/dist/clojure-CCKyeQKf.js +0 -800
- package/dist/css-BkF-NPzE.js +0 -1553
- package/dist/index-5ZH_qS8j.js +0 -288
- package/dist/index-U4yn89qO.js +0 -341
- package/dist/javascript-C2yteZeJ.js +0 -691
- package/dist/min-DS5Jz-hg.js +0 -80
- package/dist/mindmap-definition-LNHGMQRG-0aOVaMR8.js +0 -3234
- package/dist/mllike-BSnXJBGA.js +0 -272
- package/dist/pug-CwAQJzGR.js +0 -248
- package/dist/python-BkR3uSy8.js +0 -313
- package/dist/rpm-IznJm2Xc.js +0 -57
- package/dist/sequenceDiagram-WFGC7UMF-DMhHzllb.js +0 -2284
- package/dist/ttcn-cfg-Bac_acMi.js +0 -88
|
@@ -258,6 +258,9 @@ describe("add table list", () => {
|
|
|
258
258
|
{
|
|
259
259
|
name: "table1",
|
|
260
260
|
columns: [],
|
|
261
|
+
num_columns: 0,
|
|
262
|
+
num_rows: 0,
|
|
263
|
+
variable_name: null,
|
|
261
264
|
source: "",
|
|
262
265
|
source_type: "local",
|
|
263
266
|
type: "table",
|
|
@@ -286,6 +289,9 @@ describe("add table list", () => {
|
|
|
286
289
|
{
|
|
287
290
|
name: "table2",
|
|
288
291
|
columns: [],
|
|
292
|
+
num_columns: 0,
|
|
293
|
+
num_rows: 0,
|
|
294
|
+
variable_name: null,
|
|
289
295
|
source: "",
|
|
290
296
|
source_type: "local",
|
|
291
297
|
type: "table",
|
|
@@ -303,6 +309,9 @@ describe("add table list", () => {
|
|
|
303
309
|
{
|
|
304
310
|
name: "table1",
|
|
305
311
|
columns: [],
|
|
312
|
+
num_columns: 0,
|
|
313
|
+
num_rows: 0,
|
|
314
|
+
variable_name: null,
|
|
306
315
|
source: "",
|
|
307
316
|
source_type: "local",
|
|
308
317
|
type: "table",
|
|
@@ -323,6 +332,9 @@ describe("add table list", () => {
|
|
|
323
332
|
{
|
|
324
333
|
name: "table2",
|
|
325
334
|
columns: [],
|
|
335
|
+
num_columns: 0,
|
|
336
|
+
num_rows: 0,
|
|
337
|
+
variable_name: null,
|
|
326
338
|
source: "",
|
|
327
339
|
source_type: "local",
|
|
328
340
|
type: "table",
|
|
@@ -387,6 +399,9 @@ describe("add table", () => {
|
|
|
387
399
|
source: "",
|
|
388
400
|
source_type: "local",
|
|
389
401
|
type: "table",
|
|
402
|
+
num_columns: 0,
|
|
403
|
+
num_rows: 0,
|
|
404
|
+
variable_name: null,
|
|
390
405
|
};
|
|
391
406
|
const newState = addTable(table, {
|
|
392
407
|
engine: "conn1" as ConnectionName,
|
|
@@ -410,6 +425,9 @@ describe("add table", () => {
|
|
|
410
425
|
const table: DataTable = {
|
|
411
426
|
name: "table1",
|
|
412
427
|
columns: [],
|
|
428
|
+
num_columns: 0,
|
|
429
|
+
num_rows: 0,
|
|
430
|
+
variable_name: null,
|
|
413
431
|
source: "",
|
|
414
432
|
source_type: "local",
|
|
415
433
|
type: "table",
|
|
@@ -428,6 +446,9 @@ describe("add table", () => {
|
|
|
428
446
|
source: "new_source",
|
|
429
447
|
source_type: "local",
|
|
430
448
|
type: "table",
|
|
449
|
+
num_columns: 0,
|
|
450
|
+
num_rows: 0,
|
|
451
|
+
variable_name: null,
|
|
431
452
|
};
|
|
432
453
|
|
|
433
454
|
const updatedState = addTable(updatedTable, sqlTableContext);
|
|
@@ -444,6 +465,9 @@ describe("add table", () => {
|
|
|
444
465
|
const table: DataTable = {
|
|
445
466
|
name: "table2",
|
|
446
467
|
columns: [],
|
|
468
|
+
num_columns: 0,
|
|
469
|
+
num_rows: 0,
|
|
470
|
+
variable_name: null,
|
|
447
471
|
source: "",
|
|
448
472
|
source_type: "local",
|
|
449
473
|
type: "table",
|
|
@@ -34,6 +34,7 @@ describe("getAutoFixes", () => {
|
|
|
34
34
|
type: "exception",
|
|
35
35
|
exception_type: "NameError",
|
|
36
36
|
msg: "name 'np' is not defined",
|
|
37
|
+
raising_cell: null,
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
const fixes = getAutoFixes(error);
|
|
@@ -46,6 +47,7 @@ describe("getAutoFixes", () => {
|
|
|
46
47
|
type: "exception",
|
|
47
48
|
exception_type: "NameError",
|
|
48
49
|
msg: "name 'unknown_module' is not defined",
|
|
50
|
+
raising_cell: null,
|
|
49
51
|
};
|
|
50
52
|
|
|
51
53
|
expect(getAutoFixes(error)).toHaveLength(0);
|
|
@@ -155,6 +155,7 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
|
|
|
155
155
|
previewDataSourceConnection = throwNotImplemented;
|
|
156
156
|
openFile = throwNotImplemented;
|
|
157
157
|
sendListFiles = throwNotImplemented;
|
|
158
|
+
sendSearchFiles = throwNotImplemented;
|
|
158
159
|
sendPdb = throwNotImplemented;
|
|
159
160
|
sendCreateFileOrFolder = throwNotImplemented;
|
|
160
161
|
sendDeleteFileOrFolder = throwNotImplemented;
|
package/src/core/islands/main.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { components } from "@marimo-team/marimo-api";
|
|
3
3
|
|
|
4
4
|
export type schemas = components["schemas"];
|
|
5
|
-
export type DataType = schemas["
|
|
5
|
+
export type DataType = schemas["KnownUnions"]["data_type"];
|
|
6
6
|
export const DATA_TYPES = [
|
|
7
7
|
"string",
|
|
8
8
|
"boolean",
|
|
@@ -21,7 +21,11 @@ export type Database = schemas["Database"];
|
|
|
21
21
|
export type DatabaseSchema = schemas["Schema"];
|
|
22
22
|
export type DataSourceConnection = schemas["DataSourceConnection"];
|
|
23
23
|
export type OutputChannel = schemas["CellChannel"];
|
|
24
|
-
export type
|
|
24
|
+
export type CellOutput = schemas["CellOutput"];
|
|
25
|
+
export type MarimoError = Extract<
|
|
26
|
+
CellOutput["data"],
|
|
27
|
+
Array<{ type: string }>
|
|
28
|
+
>[number];
|
|
25
29
|
export type OutputMessage = schemas["CellOutput"];
|
|
26
30
|
export type CompletionOption = schemas["CompletionResult"]["options"][0];
|
|
27
31
|
export type CompletionResultMessage = OperationMessageData<"completion-result">;
|
|
@@ -35,20 +39,22 @@ export type SQLTablePreview = OperationMessageData<"sql-table-preview">;
|
|
|
35
39
|
export type SQLTableListPreview =
|
|
36
40
|
OperationMessageData<"sql-table-list-preview">;
|
|
37
41
|
export type SecretKeysResult = OperationMessageData<"secret-keys-result">;
|
|
42
|
+
export type StartupLogs = OperationMessageData<"startup-logs">;
|
|
43
|
+
export type MessageOperation = schemas["KnownUnions"]["operation"];
|
|
38
44
|
|
|
39
|
-
export type OperationMessageType =
|
|
45
|
+
export type OperationMessageType = MessageOperation["op"];
|
|
40
46
|
export type OperationMessage = {
|
|
41
47
|
[Type in OperationMessageType]: {
|
|
42
48
|
op: Type;
|
|
43
|
-
data: Omit<Extract<
|
|
49
|
+
data: Omit<Extract<MessageOperation, { op: Type }>, "op">;
|
|
44
50
|
};
|
|
45
51
|
}[OperationMessageType];
|
|
46
52
|
|
|
47
53
|
export type CellMessage = OperationMessageData<"cell-op">;
|
|
48
54
|
|
|
49
55
|
export type OperationMessageData<T extends OperationMessageType> = Omit<
|
|
50
|
-
Extract<
|
|
51
|
-
"
|
|
56
|
+
Extract<MessageOperation, { op: T }>,
|
|
57
|
+
"op"
|
|
52
58
|
>;
|
|
53
59
|
|
|
54
60
|
export type Capabilities = OperationMessageData<"kernel-ready">["capabilities"];
|
|
@@ -77,11 +77,11 @@ export function getSerializedLayout() {
|
|
|
77
77
|
|
|
78
78
|
// Vertical layout has no data, as it is the default.
|
|
79
79
|
if (selectedLayout === "vertical") {
|
|
80
|
-
return
|
|
80
|
+
return null;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
if (layoutData === undefined) {
|
|
84
|
-
return
|
|
84
|
+
return null;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
const data = layoutData[selectedLayout];
|
|
@@ -90,7 +90,7 @@ export function getSerializedLayout() {
|
|
|
90
90
|
);
|
|
91
91
|
if (plugin === undefined) {
|
|
92
92
|
Logger.error(`Unknown layout type: ${selectedLayout}`);
|
|
93
|
-
return
|
|
93
|
+
return null;
|
|
94
94
|
}
|
|
95
95
|
return {
|
|
96
96
|
type: selectedLayout,
|
|
@@ -235,6 +235,14 @@ export function createNetworkRequests(): EditRequests & RunRequests {
|
|
|
235
235
|
})
|
|
236
236
|
.then(handleResponse);
|
|
237
237
|
},
|
|
238
|
+
sendSearchFiles: async (request) => {
|
|
239
|
+
await waitForConnectionOpen();
|
|
240
|
+
return getClient()
|
|
241
|
+
.POST("/api/files/search", {
|
|
242
|
+
body: request,
|
|
243
|
+
})
|
|
244
|
+
.then(handleResponse);
|
|
245
|
+
},
|
|
238
246
|
sendCreateFileOrFolder: async (request) => {
|
|
239
247
|
await waitForConnectionOpen();
|
|
240
248
|
return getClient()
|
|
@@ -60,6 +60,7 @@ export function createStaticRequests(): EditRequests & RunRequests {
|
|
|
60
60
|
openFile: throwNotInEditMode,
|
|
61
61
|
getUsageStats: throwNotInEditMode,
|
|
62
62
|
sendListFiles: throwNotInEditMode,
|
|
63
|
+
sendSearchFiles: throwNotInEditMode,
|
|
63
64
|
sendPdb: throwNotInEditMode,
|
|
64
65
|
sendCreateFileOrFolder: throwNotInEditMode,
|
|
65
66
|
sendDeleteFileOrFolder: throwNotInEditMode,
|
|
@@ -38,6 +38,7 @@ export function createErrorToastingRequests(
|
|
|
38
38
|
openFile: "Failed to open file",
|
|
39
39
|
getUsageStats: "", // No toast
|
|
40
40
|
sendListFiles: "Failed to list files",
|
|
41
|
+
sendSearchFiles: "Failed to search files",
|
|
41
42
|
sendPdb: "Failed to start debug session",
|
|
42
43
|
sendCreateFileOrFolder: "Failed to create file or folder",
|
|
43
44
|
sendDeleteFileOrFolder: "Failed to delete file or folder",
|
|
@@ -14,7 +14,7 @@ export type CellConfig = schemas["CellConfig"];
|
|
|
14
14
|
* idle: not running.
|
|
15
15
|
* disabled-transitively: disabled because an ancestor was disabled.
|
|
16
16
|
*/
|
|
17
|
-
export type RuntimeState = schemas["
|
|
17
|
+
export type RuntimeState = schemas["CellOp"]["status"];
|
|
18
18
|
export type CodeCompletionRequest = schemas["CodeCompletionRequest"];
|
|
19
19
|
export type DeleteCellRequest = schemas["DeleteCellRequest"];
|
|
20
20
|
export type ExecuteMultipleRequest = schemas["ExecuteMultipleRequest"];
|
|
@@ -32,6 +32,8 @@ export type FileDetailsResponse = schemas["FileDetailsResponse"];
|
|
|
32
32
|
export type FileInfo = schemas["FileInfo"];
|
|
33
33
|
export type FileListRequest = schemas["FileListRequest"];
|
|
34
34
|
export type FileListResponse = schemas["FileListResponse"];
|
|
35
|
+
export type FileSearchRequest = schemas["FileSearchRequest"];
|
|
36
|
+
export type FileSearchResponse = schemas["FileSearchResponse"];
|
|
35
37
|
export type FileMoveRequest = schemas["FileMoveRequest"];
|
|
36
38
|
export type FileMoveResponse = schemas["FileMoveResponse"];
|
|
37
39
|
export type FileUpdateRequest = schemas["FileUpdateRequest"];
|
|
@@ -144,6 +146,7 @@ export interface EditRequests {
|
|
|
144
146
|
sendPdb: (request: PdbRequest) => Promise<null>;
|
|
145
147
|
// File explorer requests
|
|
146
148
|
sendListFiles: (request: FileListRequest) => Promise<FileListResponse>;
|
|
149
|
+
sendSearchFiles: (request: FileSearchRequest) => Promise<FileSearchResponse>;
|
|
147
150
|
sendCreateFileOrFolder: (
|
|
148
151
|
request: FileCreateRequest,
|
|
149
152
|
) => Promise<FileCreateResponse>;
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -21,6 +21,7 @@ import type {
|
|
|
21
21
|
FileDetailsResponse,
|
|
22
22
|
FileListResponse,
|
|
23
23
|
FileMoveResponse,
|
|
24
|
+
FileSearchResponse,
|
|
24
25
|
FileUpdateResponse,
|
|
25
26
|
FormatResponse,
|
|
26
27
|
RunRequests,
|
|
@@ -373,6 +374,14 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
373
374
|
return response as FileListResponse;
|
|
374
375
|
};
|
|
375
376
|
|
|
377
|
+
sendSearchFiles: EditRequests["sendSearchFiles"] = async (request) => {
|
|
378
|
+
const response = await this.rpc.proxy.request.bridge({
|
|
379
|
+
functionName: "search_files",
|
|
380
|
+
payload: request,
|
|
381
|
+
});
|
|
382
|
+
return response as FileSearchResponse;
|
|
383
|
+
};
|
|
384
|
+
|
|
376
385
|
sendComponentValues: RunRequests["sendComponentValues"] = async (request) => {
|
|
377
386
|
await this.putControlRequest({
|
|
378
387
|
...request,
|
|
@@ -514,9 +523,16 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
514
523
|
return response;
|
|
515
524
|
};
|
|
516
525
|
|
|
517
|
-
getDependencyTree = async () => {
|
|
526
|
+
getDependencyTree: EditRequests["getDependencyTree"] = async () => {
|
|
518
527
|
// WASM doesn't support dependency trees yet
|
|
519
|
-
return {
|
|
528
|
+
return {
|
|
529
|
+
tree: {
|
|
530
|
+
dependencies: [],
|
|
531
|
+
name: "",
|
|
532
|
+
tags: [],
|
|
533
|
+
version: null,
|
|
534
|
+
},
|
|
535
|
+
};
|
|
520
536
|
};
|
|
521
537
|
|
|
522
538
|
listSecretKeys: EditRequests["listSecretKeys"] = async (request) => {
|
|
@@ -6,6 +6,7 @@ import type { JsonString } from "@/utils/json/base64";
|
|
|
6
6
|
import { invariant } from "../../../utils/invariant";
|
|
7
7
|
import { Logger } from "../../../utils/Logger";
|
|
8
8
|
import { WasmFileSystem } from "./fs";
|
|
9
|
+
import { getMarimoWheel } from "./getMarimoWheel";
|
|
9
10
|
import { t } from "./tracer";
|
|
10
11
|
import type { SerializedBridge, WasmController } from "./types";
|
|
11
12
|
|
|
@@ -57,7 +58,8 @@ export class DefaultWasmController implements WasmController {
|
|
|
57
58
|
// Perf: These get loaded while pyodide is being bootstrapped
|
|
58
59
|
packages: [
|
|
59
60
|
"micropip",
|
|
60
|
-
"
|
|
61
|
+
"msgspec",
|
|
62
|
+
getMarimoWheel(opts.version),
|
|
61
63
|
"Markdown",
|
|
62
64
|
"pymdown-extensions",
|
|
63
65
|
"narwhals",
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
2
3
|
export function getMarimoWheel(version: string) {
|
|
3
|
-
if (
|
|
4
|
-
return "marimo-base>=0.9.0";
|
|
5
|
-
}
|
|
6
|
-
if (version === "local") {
|
|
4
|
+
if (import.meta.env.DEV && import.meta.env.VITE_MARIMO_VERSION) {
|
|
7
5
|
return `http://localhost:8000/dist/marimo-${
|
|
8
6
|
import.meta.env.VITE_MARIMO_VERSION
|
|
9
7
|
}-py3-none-any.whl`;
|
|
10
8
|
}
|
|
11
|
-
|
|
12
|
-
return "marimo-base";
|
|
13
|
-
}
|
|
14
|
-
return `marimo-base==${version}`;
|
|
9
|
+
return "marimo-base";
|
|
15
10
|
}
|
|
@@ -16,6 +16,8 @@ import type {
|
|
|
16
16
|
FileListResponse,
|
|
17
17
|
FileMoveRequest,
|
|
18
18
|
FileMoveResponse,
|
|
19
|
+
FileSearchRequest,
|
|
20
|
+
FileSearchResponse,
|
|
19
21
|
FileUpdateRequest,
|
|
20
22
|
FileUpdateResponse,
|
|
21
23
|
FormatRequest,
|
|
@@ -72,6 +74,7 @@ export interface RawBridge {
|
|
|
72
74
|
save_user_config(request: SaveUserConfigurationRequest): Promise<null>;
|
|
73
75
|
rename_file(request: string): Promise<string>;
|
|
74
76
|
list_files(request: FileListRequest): Promise<FileListResponse>;
|
|
77
|
+
search_files(request: FileSearchRequest): Promise<FileSearchResponse>;
|
|
75
78
|
file_details(request: { path: string }): Promise<FileDetailsResponse>;
|
|
76
79
|
create_file_or_directory(
|
|
77
80
|
request: FileCreateRequest,
|
|
@@ -79,7 +79,7 @@ export function useMarimoWebSocket(opts: {
|
|
|
79
79
|
const { setLayoutData } = useLayoutActions();
|
|
80
80
|
const [connection, setConnection] = useAtom(connectionAtom);
|
|
81
81
|
const { addBanner } = useBannersActions();
|
|
82
|
-
const { addPackageAlert } = useAlertActions();
|
|
82
|
+
const { addPackageAlert, addStartupLog } = useAlertActions();
|
|
83
83
|
const setKioskMode = useSetAtom(kioskModeAtom);
|
|
84
84
|
const setCapabilities = useSetAtom(capabilitiesAtom);
|
|
85
85
|
const runtimeManager = useRuntimeManager();
|
|
@@ -204,6 +204,12 @@ export function useMarimoWebSocket(opts: {
|
|
|
204
204
|
kind: "installing",
|
|
205
205
|
});
|
|
206
206
|
return;
|
|
207
|
+
case "startup-logs":
|
|
208
|
+
addStartupLog({
|
|
209
|
+
content: msg.data.content,
|
|
210
|
+
status: msg.data.status,
|
|
211
|
+
});
|
|
212
|
+
return;
|
|
207
213
|
case "query-params-append":
|
|
208
214
|
queryParamHandlers.append(msg.data);
|
|
209
215
|
return;
|
package/src/css/app/Cell.css
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
|
|
19
19
|
&:focus-visible {
|
|
20
20
|
/* focus-visible outlines the entire cell body in black, but the cell's
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
* body is an irregular shape because of pseudo-elements that extend
|
|
22
|
+
* its hit-box / hover area. */
|
|
23
23
|
outline: none;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -28,16 +28,19 @@
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/* Hover z-index is higher than focus-within z-index
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
* This is because you may hover for tooltip docs while
|
|
32
|
+
* not focused in another cell.
|
|
33
|
+
*/
|
|
34
|
+
|
|
34
35
|
&:hover {
|
|
35
36
|
z-index: 30;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
/* Interactive */
|
|
40
|
+
|
|
39
41
|
&.interactive {
|
|
40
42
|
/* Only restrain output length in edit mode. */
|
|
43
|
+
|
|
41
44
|
.output-area,
|
|
42
45
|
.console-output-area {
|
|
43
46
|
max-height: 610px;
|
|
@@ -45,6 +48,7 @@
|
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
/* Special case for particular components */
|
|
51
|
+
|
|
48
52
|
.output-area:has(> .output > marimo-ui-element > marimo-table) {
|
|
49
53
|
max-height: none;
|
|
50
54
|
overflow: hidden;
|
|
@@ -71,14 +75,14 @@
|
|
|
71
75
|
@apply shadow-lg-solid shadow-shade;
|
|
72
76
|
|
|
73
77
|
/* a little bit of motion
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
*
|
|
79
|
+
* Note: we use left/top instead of transform because transform creates a new
|
|
80
|
+
* stacking context and makes completion tooltip appear below surrounding
|
|
81
|
+
* cells/outputs. See
|
|
82
|
+
*
|
|
83
|
+
* https://stackoverflow.com/questions/20851452/z-index-is-canceled-by-setting-transformrotate,
|
|
84
|
+
* https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
|
|
85
|
+
* */
|
|
82
86
|
left: -1px;
|
|
83
87
|
top: -1px;
|
|
84
88
|
}
|
|
@@ -97,6 +101,7 @@
|
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
/* Stale styles for Cell */
|
|
104
|
+
|
|
100
105
|
&.stale,
|
|
101
106
|
&.disabled.stale {
|
|
102
107
|
.output-area,
|
|
@@ -108,6 +113,7 @@
|
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
/* Disabled styles for Cell */
|
|
116
|
+
|
|
111
117
|
&.disabled,
|
|
112
118
|
&.disabled.has-error,
|
|
113
119
|
&.disabled:hover,
|
|
@@ -127,6 +133,7 @@
|
|
|
127
133
|
}
|
|
128
134
|
|
|
129
135
|
/* Error styles for Cell, less precedence than needs run */
|
|
136
|
+
|
|
130
137
|
&.has-error,
|
|
131
138
|
&.error-outline {
|
|
132
139
|
outline: 1px solid var(--red-4);
|
|
@@ -149,6 +156,7 @@
|
|
|
149
156
|
}
|
|
150
157
|
|
|
151
158
|
/* Needs Run */
|
|
159
|
+
|
|
152
160
|
&.needs-run {
|
|
153
161
|
/* TODO(akshayka): Can give this an outline to make more visible. */
|
|
154
162
|
outline: none;
|
|
@@ -174,6 +182,7 @@
|
|
|
174
182
|
}
|
|
175
183
|
|
|
176
184
|
/* Focus state */
|
|
185
|
+
|
|
177
186
|
&.focus-outline {
|
|
178
187
|
transition: all 0.6s;
|
|
179
188
|
border-color: var(--blue-8) !important;
|
|
@@ -183,21 +192,28 @@
|
|
|
183
192
|
}
|
|
184
193
|
|
|
185
194
|
/* Published - when its just the output */
|
|
195
|
+
|
|
186
196
|
&.published {
|
|
187
197
|
border: none;
|
|
188
198
|
box-shadow: none;
|
|
189
199
|
|
|
190
200
|
.output-area {
|
|
191
201
|
/* flow-root interferes with margin collapsing, but appears to be unneeded
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
202
|
+
* when cell outlines are hidden; clear:both is sufficient.
|
|
203
|
+
*
|
|
204
|
+
* if developers just use css-grid instead of float, this won't matter.
|
|
205
|
+
* */
|
|
196
206
|
display: block;
|
|
197
207
|
padding-top: 0;
|
|
198
208
|
padding-bottom: 0;
|
|
199
209
|
border: none;
|
|
200
210
|
box-shadow: none;
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
do not restrict the dimensions when outlines are hidden,
|
|
214
|
+
otherwise text with a scrollbar w/o a container looks weird
|
|
215
|
+
*/
|
|
216
|
+
overflow: visible;
|
|
201
217
|
}
|
|
202
218
|
|
|
203
219
|
&:hover {
|
|
@@ -211,6 +227,7 @@
|
|
|
211
227
|
}
|
|
212
228
|
|
|
213
229
|
/* Borderless styles for Cell */
|
|
230
|
+
|
|
214
231
|
&.borderless {
|
|
215
232
|
border-color: transparent;
|
|
216
233
|
box-shadow: none;
|
|
@@ -220,6 +237,7 @@
|
|
|
220
237
|
}
|
|
221
238
|
|
|
222
239
|
/* Apply the original styles */
|
|
240
|
+
|
|
223
241
|
&:hover {
|
|
224
242
|
border: 1px solid var(--gray-4);
|
|
225
243
|
@apply shadow-sm-solid shadow-shade;
|
|
@@ -227,6 +245,7 @@
|
|
|
227
245
|
}
|
|
228
246
|
|
|
229
247
|
/* -------------------------- Shoulders/Buttons ---------------------------- */
|
|
248
|
+
|
|
230
249
|
.shoulder-right {
|
|
231
250
|
display: inline-flex;
|
|
232
251
|
flex-direction: column;
|
|
@@ -259,6 +278,7 @@
|
|
|
259
278
|
}
|
|
260
279
|
|
|
261
280
|
/* Apply the original styles */
|
|
281
|
+
|
|
262
282
|
&:hover {
|
|
263
283
|
border: 1px solid var(--gray-4);
|
|
264
284
|
@apply shadow-sm-solid shadow-shade;
|
|
@@ -268,6 +288,7 @@
|
|
|
268
288
|
|
|
269
289
|
#App.disconnected {
|
|
270
290
|
/* Background determined by disconnected gradient/noise. */
|
|
291
|
+
|
|
271
292
|
.marimo-cell,
|
|
272
293
|
.console-output-area,
|
|
273
294
|
.cm .cm-gutters,
|
|
@@ -278,6 +299,7 @@
|
|
|
278
299
|
}
|
|
279
300
|
|
|
280
301
|
/* Hide when disconnected. */
|
|
302
|
+
|
|
281
303
|
.cell-running-icon,
|
|
282
304
|
.cell-queued-icon,
|
|
283
305
|
.elapsed-time {
|
|
@@ -306,6 +328,7 @@
|
|
|
306
328
|
}
|
|
307
329
|
|
|
308
330
|
/* expand the hover area left and right */
|
|
331
|
+
|
|
309
332
|
&::before,
|
|
310
333
|
&::after {
|
|
311
334
|
content: "";
|
|
@@ -400,13 +423,11 @@
|
|
|
400
423
|
padding: 1rem;
|
|
401
424
|
|
|
402
425
|
/* Prevent floated elements from extending out of the output areas and into
|
|
403
|
-
|
|
426
|
+
* the editor. */
|
|
404
427
|
clear: both;
|
|
405
428
|
display: flow-root;
|
|
406
429
|
|
|
407
|
-
|
|
408
|
-
* doesn't break margin collapse. Setting overflow (eg, overflow: auto)
|
|
409
|
-
* breaks margin collapse. */
|
|
430
|
+
overflow: auto;
|
|
410
431
|
}
|
|
411
432
|
|
|
412
433
|
.marimo-output-stale,
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
/* -- Panels -- */
|
|
68
68
|
|
|
69
69
|
.cm .cm-panels {
|
|
70
|
-
background:
|
|
70
|
+
background-color: var(--cm-background);
|
|
71
71
|
color: var(--sky-11);
|
|
72
72
|
font-weight: 700;
|
|
73
73
|
|
|
@@ -75,6 +75,10 @@
|
|
|
75
75
|
margin-right: 30px;
|
|
76
76
|
|
|
77
77
|
@apply text-xs;
|
|
78
|
+
|
|
79
|
+
&.cm-panels-bottom {
|
|
80
|
+
border-top: 1px solid var(--border);
|
|
81
|
+
}
|
|
78
82
|
}
|
|
79
83
|
|
|
80
84
|
/* -- Linting -- */
|
package/src/css/globals.css
CHANGED
package/src/css/md.css
CHANGED
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
import { AudioRecorder } from "@/components/audio/audio-recorder";
|
|
6
6
|
import { useAudioRecorder } from "@/hooks/useAudioRecorder";
|
|
7
7
|
import type { IPlugin, IPluginProps } from "@/plugins/types";
|
|
8
|
-
import {
|
|
8
|
+
import { blobToString } from "@/utils/fileToBase64";
|
|
9
9
|
import { Labeled } from "./common/labeled";
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -33,7 +33,7 @@ const Microphone = ({ setValue, data }: IPluginProps<Value, Data>) => {
|
|
|
33
33
|
const { start, stop, pauseResume, recordingStatus, recordingTime, allowed } =
|
|
34
34
|
useAudioRecorder({
|
|
35
35
|
onDone: async (file) => {
|
|
36
|
-
const base64 = await
|
|
36
|
+
const base64 = await blobToString(file, "base64");
|
|
37
37
|
setValue(base64);
|
|
38
38
|
},
|
|
39
39
|
});
|
|
@@ -41,6 +41,7 @@ export const ChatPlugin = createPlugin<{ messages: ChatMessage[] }>(
|
|
|
41
41
|
z.object({
|
|
42
42
|
role: z.enum(["system", "user", "assistant"]),
|
|
43
43
|
content: z.string(),
|
|
44
|
+
parts: z.array(z.any()),
|
|
44
45
|
}),
|
|
45
46
|
),
|
|
46
47
|
}),
|
|
@@ -56,15 +57,7 @@ export const ChatPlugin = createPlugin<{ messages: ChatMessage[] }>(
|
|
|
56
57
|
z.object({
|
|
57
58
|
role: z.enum(["system", "user", "assistant"]),
|
|
58
59
|
content: z.string(),
|
|
59
|
-
|
|
60
|
-
.array(
|
|
61
|
-
z.object({
|
|
62
|
-
name: z.string().optional(),
|
|
63
|
-
contentType: z.string().optional(),
|
|
64
|
-
url: z.string(),
|
|
65
|
-
}),
|
|
66
|
-
)
|
|
67
|
-
.optional(),
|
|
60
|
+
parts: z.array(z.any()),
|
|
68
61
|
}),
|
|
69
62
|
),
|
|
70
63
|
config: z.object({
|