@marimo-team/islands 0.23.11-dev27 → 0.23.11-dev28

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.
@@ -72,6 +72,17 @@ var Ban = createLucideIcon("ban", [["path", {
72
72
  }], ["path", {
73
73
  d: "m9 11 3 3L22 4",
74
74
  key: "1pflzl"
75
+ }]]), CircleSlash = createLucideIcon("circle-slash", [["circle", {
76
+ cx: "12",
77
+ cy: "12",
78
+ r: "10",
79
+ key: "1mglay"
80
+ }], ["line", {
81
+ x1: "9",
82
+ x2: "15",
83
+ y1: "15",
84
+ y2: "9",
85
+ key: "1dfufj"
75
86
  }]]), Paperclip = createLucideIcon("paperclip", [["path", {
76
87
  d: "m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551",
77
88
  key: "1miecu"
@@ -6796,27 +6807,35 @@ var import_compiler_runtime$3 = require_compiler_runtime(), STATUS_LABEL = {
6796
6807
  "approval-responded": "Awaiting result",
6797
6808
  "output-available": "Done",
6798
6809
  "output-denied": "Denied"
6799
- }, StatusIcon = (e18) => {
6800
- let m = (0, import_compiler_runtime$3.c)(4), { state: h } = e18;
6810
+ }, PENDING_STATES = /* @__PURE__ */ new Set([
6811
+ "input-streaming",
6812
+ "input-available",
6813
+ "approval-responded"
6814
+ ]), StatusIcon = (e18) => {
6815
+ let m = (0, import_compiler_runtime$3.c)(5), { state: h, interrupted: g } = e18;
6816
+ if (g) {
6817
+ let e19;
6818
+ return m[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleSlash, { className: "h-3 w-3 text-muted-foreground" }), m[0] = e19) : e19 = m[0], e19;
6819
+ }
6801
6820
  switch (h) {
6802
6821
  case "input-streaming":
6803
6822
  case "input-available":
6804
6823
  case "approval-responded": {
6805
6824
  let e19;
6806
- return m[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "h-3 w-3 animate-spin" }), m[0] = e19) : e19 = m[0], e19;
6825
+ return m[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "h-3 w-3 animate-spin" }), m[1] = e19) : e19 = m[1], e19;
6807
6826
  }
6808
6827
  case "output-available": {
6809
6828
  let e19;
6810
- return m[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheckBig, { className: "h-3 w-3 text-(--grass-11)" }), m[1] = e19) : e19 = m[1], e19;
6829
+ return m[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheckBig, { className: "h-3 w-3 text-(--grass-11)" }), m[2] = e19) : e19 = m[2], e19;
6811
6830
  }
6812
6831
  case "output-denied": {
6813
6832
  let e19;
6814
- return m[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Ban, { className: "h-3 w-3 text-muted-foreground" }), m[2] = e19) : e19 = m[2], e19;
6833
+ return m[3] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Ban, { className: "h-3 w-3 text-muted-foreground" }), m[3] = e19) : e19 = m[3], e19;
6815
6834
  }
6816
6835
  default: {
6817
6836
  logNever(h);
6818
6837
  let e19;
6819
- return m[3] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Wrench, { className: "h-3 w-3" }), m[3] = e19) : e19 = m[3], e19;
6838
+ return m[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Wrench, { className: "h-3 w-3" }), m[4] = e19) : e19 = m[4], e19;
6820
6839
  }
6821
6840
  }
6822
6841
  };
@@ -6835,36 +6854,41 @@ function getTriggerToneClass(e18) {
6835
6854
  }
6836
6855
  }
6837
6856
  const ToolHistoryRow = (e18) => {
6838
- let m = (0, import_compiler_runtime$3.c)(29), { toolName: h, state: g, input: v, result: y, approval: b, index: x, className: S } = e18, w = `tool-${x === void 0 ? 0 : x}`, T;
6839
- m[0] === S ? T = m[1] : (T = cn("w-full", S), m[0] = S, m[1] = T);
6840
- let E;
6841
- m[2] === g ? E = m[3] : (E = cn("h-6 text-xs border-border shadow-none! ring-0! bg-muted/60 hover:bg-muted py-0 px-2 gap-1 rounded-sm [&[data-state=open]>svg]:rotate-180 hover:no-underline", getTriggerToneClass(g)), m[2] = g, m[3] = E);
6842
- let D;
6843
- m[4] === g ? D = m[5] : (D = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { state: g }), m[4] = g, m[5] = D);
6844
- let O = STATUS_LABEL[g], k;
6845
- m[6] === h ? k = m[7] : (k = formatToolName(h), m[6] = h, m[7] = k);
6846
- let A;
6847
- m[8] === k ? A = m[9] : (A = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
6848
- className: "font-mono text-xs",
6849
- children: k
6850
- }), m[8] = k, m[9] = A);
6857
+ let m = (0, import_compiler_runtime$3.c)(34), { toolName: h, state: g, input: v, result: y, approval: b, index: x, className: S, isActive: w } = e18, T = x === void 0 ? 0 : x, E = w === void 0 ? true : w, D;
6858
+ m[0] !== E || m[1] !== g ? (D = !E && PENDING_STATES.has(g), m[0] = E, m[1] = g, m[2] = D) : D = m[2];
6859
+ let O = D, k = `tool-${T}`, A;
6860
+ m[3] === S ? A = m[4] : (A = cn("w-full", S), m[3] = S, m[4] = A);
6851
6861
  let j;
6852
- m[10] !== D || m[11] !== O || m[12] !== A ? (j = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
6862
+ m[5] !== O || m[6] !== g ? (j = cn("h-6 text-xs border-border shadow-none! ring-0! bg-muted/60 hover:bg-muted py-0 px-2 gap-1 rounded-sm [&[data-state=open]>svg]:rotate-180 hover:no-underline", O ? "text-muted-foreground" : getTriggerToneClass(g)), m[5] = O, m[6] = g, m[7] = j) : j = m[7];
6863
+ let M;
6864
+ m[8] !== O || m[9] !== g ? (M = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, {
6865
+ state: g,
6866
+ interrupted: O
6867
+ }), m[8] = O, m[9] = g, m[10] = M) : M = m[10];
6868
+ let N = O ? "Interrupted" : STATUS_LABEL[g], P;
6869
+ m[11] === h ? P = m[12] : (P = formatToolName(h), m[11] = h, m[12] = P);
6870
+ let F;
6871
+ m[13] === P ? F = m[14] : (F = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
6872
+ className: "font-mono text-xs",
6873
+ children: P
6874
+ }), m[13] = P, m[14] = F);
6875
+ let I;
6876
+ m[15] !== F || m[16] !== M || m[17] !== N ? (I = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
6853
6877
  className: "flex items-center gap-1",
6854
6878
  children: [
6855
- D,
6856
- O,
6879
+ M,
6880
+ N,
6857
6881
  ":",
6858
- A
6882
+ F
6859
6883
  ]
6860
- }), m[10] = D, m[11] = O, m[12] = A, m[13] = j) : j = m[13];
6861
- let M;
6862
- m[14] !== E || m[15] !== j ? (M = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionTrigger, {
6863
- className: E,
6864
- children: j
6865
- }), m[14] = E, m[15] = j, m[16] = M) : M = m[16];
6866
- let N;
6867
- m[17] !== b || m[18] !== v || m[19] !== y || m[20] !== g ? (N = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionContent, {
6884
+ }), m[15] = F, m[16] = M, m[17] = N, m[18] = I) : I = m[18];
6885
+ let z;
6886
+ m[19] !== I || m[20] !== j ? (z = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionTrigger, {
6887
+ className: j,
6888
+ children: I
6889
+ }), m[19] = I, m[20] = j, m[21] = z) : z = m[21];
6890
+ let B;
6891
+ m[22] !== b || m[23] !== v || m[24] !== y || m[25] !== g ? (B = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionContent, {
6868
6892
  className: "py-2 px-2",
6869
6893
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HistoryContent, {
6870
6894
  state: g,
@@ -6872,20 +6896,20 @@ const ToolHistoryRow = (e18) => {
6872
6896
  result: y,
6873
6897
  approval: b
6874
6898
  })
6875
- }), m[17] = b, m[18] = v, m[19] = y, m[20] = g, m[21] = N) : N = m[21];
6876
- let P;
6877
- m[22] !== M || m[23] !== N ? (P = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AccordionItem, {
6899
+ }), m[22] = b, m[23] = v, m[24] = y, m[25] = g, m[26] = B) : B = m[26];
6900
+ let V;
6901
+ m[27] !== z || m[28] !== B ? (V = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AccordionItem, {
6878
6902
  value: "tool-call",
6879
6903
  className: "border-0",
6880
- children: [M, N]
6881
- }), m[22] = M, m[23] = N, m[24] = P) : P = m[24];
6882
- let F;
6883
- return m[25] !== P || m[26] !== w || m[27] !== T ? (F = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Accordion, {
6904
+ children: [z, B]
6905
+ }), m[27] = z, m[28] = B, m[29] = V) : V = m[29];
6906
+ let H;
6907
+ return m[30] !== V || m[31] !== k || m[32] !== A ? (H = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Accordion, {
6884
6908
  type: "single",
6885
6909
  collapsible: true,
6886
- className: T,
6887
- children: P
6888
- }, w), m[25] = P, m[26] = w, m[27] = T, m[28] = F) : F = m[28], F;
6910
+ className: A,
6911
+ children: V
6912
+ }, k), m[30] = V, m[31] = k, m[32] = A, m[33] = H) : H = m[33], H;
6889
6913
  };
6890
6914
  var HistoryContent = (e18) => {
6891
6915
  let m = (0, import_compiler_runtime$3.c)(16), { state: h, input: g, result: _, approval: v } = e18;
@@ -6926,7 +6950,7 @@ var HistoryContent = (e18) => {
6926
6950
  }
6927
6951
  }, import_compiler_runtime$2 = require_compiler_runtime();
6928
6952
  const ToolCallView = (e18) => {
6929
- let m = (0, import_compiler_runtime$2.c)(25), { toolName: h, state: g, result: _, errorText: v, input: y, approval: b, onApprove: x, index: S, className: C, isLive: w } = e18, T = w === void 0 ? true : w;
6953
+ let m = (0, import_compiler_runtime$2.c)(27), { toolName: h, state: g, result: _, errorText: v, input: y, approval: b, onApprove: x, index: S, className: C, isLive: w, isActive: T } = e18, E = w === void 0 ? true : w, D = T === void 0 ? true : T;
6930
6954
  switch (g) {
6931
6955
  case "approval-requested": {
6932
6956
  if (b != null && x != null) {
@@ -6940,23 +6964,24 @@ const ToolCallView = (e18) => {
6940
6964
  }), m[0] = b, m[1] = C, m[2] = y, m[3] = x, m[4] = h, m[5] = e20) : e20 = m[5], e20;
6941
6965
  }
6942
6966
  let e19;
6943
- return m[6] !== C || m[7] !== S || m[8] !== y || m[9] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolHistoryRow, {
6967
+ return m[6] !== C || m[7] !== S || m[8] !== y || m[9] !== D || m[10] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolHistoryRow, {
6944
6968
  toolName: h,
6945
6969
  state: "input-available",
6946
6970
  input: y,
6947
6971
  index: S,
6948
- className: C
6949
- }), m[6] = C, m[7] = S, m[8] = y, m[9] = h, m[10] = e19) : e19 = m[10], e19;
6972
+ className: C,
6973
+ isActive: D
6974
+ }), m[6] = C, m[7] = S, m[8] = y, m[9] = D, m[10] = h, m[11] = e19) : e19 = m[11], e19;
6950
6975
  }
6951
6976
  case "output-error": {
6952
6977
  let e19;
6953
- return m[11] !== C || m[12] !== v || m[13] !== y || m[14] !== T || m[15] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolErrorCard, {
6978
+ return m[12] !== C || m[13] !== v || m[14] !== y || m[15] !== E || m[16] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolErrorCard, {
6954
6979
  toolName: h,
6955
6980
  input: y,
6956
6981
  errorText: v,
6957
- isLive: T,
6982
+ isLive: E,
6958
6983
  className: C
6959
- }), m[11] = C, m[12] = v, m[13] = y, m[14] = T, m[15] = h, m[16] = e19) : e19 = m[16], e19;
6984
+ }), m[12] = C, m[13] = v, m[14] = y, m[15] = E, m[16] = h, m[17] = e19) : e19 = m[17], e19;
6960
6985
  }
6961
6986
  case "input-streaming":
6962
6987
  case "input-available":
@@ -6964,74 +6989,77 @@ const ToolCallView = (e18) => {
6964
6989
  case "output-available":
6965
6990
  case "output-denied": {
6966
6991
  let e19;
6967
- return m[17] !== b || m[18] !== C || m[19] !== S || m[20] !== y || m[21] !== _ || m[22] !== g || m[23] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolHistoryRow, {
6992
+ return m[18] !== b || m[19] !== C || m[20] !== S || m[21] !== y || m[22] !== D || m[23] !== _ || m[24] !== g || m[25] !== h ? (e19 = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolHistoryRow, {
6968
6993
  toolName: h,
6969
6994
  state: g,
6970
6995
  input: y,
6971
6996
  result: _,
6972
6997
  approval: b,
6973
6998
  index: S,
6974
- className: C
6975
- }), m[17] = b, m[18] = C, m[19] = S, m[20] = y, m[21] = _, m[22] = g, m[23] = h, m[24] = e19) : e19 = m[24], e19;
6999
+ className: C,
7000
+ isActive: D
7001
+ }), m[18] = b, m[19] = C, m[20] = S, m[21] = y, m[22] = D, m[23] = _, m[24] = g, m[25] = h, m[26] = e19) : e19 = m[26], e19;
6976
7002
  }
6977
7003
  default:
6978
7004
  return logNever(g), null;
6979
7005
  }
6980
- }, renderUIMessage = ({ message: e18, isStreamingReasoning: m, isLast: g, addToolApprovalResponse: _ }) => {
6981
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: e18.parts.map((e19, m2) => v(e19, m2)) });
6982
- function v(v2, y) {
6983
- if (isToolPart(v2)) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolCallView, {
6984
- index: y,
6985
- toolName: v2.type,
6986
- result: v2.output,
6987
- errorText: v2.state === "output-error" ? v2.errorText : void 0,
7006
+ }, renderUIMessage = ({ message: e18, isStreamingReasoning: m, isLast: g, isActive: _, addToolApprovalResponse: v }) => {
7007
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: e18.parts.map((e19, m2) => y(e19, m2)) });
7008
+ function y(y2, b) {
7009
+ if (isToolPart(y2)) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolCallView, {
7010
+ index: b,
7011
+ toolName: y2.type,
7012
+ result: y2.output,
7013
+ errorText: y2.state === "output-error" ? y2.errorText : void 0,
6988
7014
  className: "my-2",
6989
- state: v2.state,
6990
- input: v2.input,
6991
- approval: v2.approval,
6992
- onApprove: _,
6993
- isLive: g
6994
- }, y);
6995
- if (isDataPart(v2)) return Logger.debug("Found data part", v2), null;
6996
- switch (v2.type) {
7015
+ state: y2.state,
7016
+ input: y2.input,
7017
+ approval: y2.approval,
7018
+ onApprove: v,
7019
+ isLive: g,
7020
+ isActive: _
7021
+ }, b);
7022
+ if (isDataPart(y2)) return Logger.debug("Found data part", y2), null;
7023
+ switch (y2.type) {
6997
7024
  case "text":
6998
- return v2.text.includes("<marimo-") ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Fragment, { children: renderHTML({ html: v2.text }) }, y) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarkdownRenderer, { content: v2.text }, y);
7025
+ return y2.text.includes("<marimo-") ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Fragment, { children: renderHTML({ html: y2.text }) }, b) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarkdownRenderer, { content: y2.text }, b);
6999
7026
  case "reasoning":
7000
7027
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReasoningAccordion, {
7001
- reasoning: v2.text,
7002
- index: y,
7003
- isStreaming: m && g && y === (e18.parts.length || 0) - 1
7004
- }, y);
7028
+ reasoning: y2.text,
7029
+ index: b,
7030
+ isStreaming: m && g && b === (e18.parts.length || 0) - 1
7031
+ }, b);
7005
7032
  case "file":
7006
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AttachmentRenderer, { attachment: v2 }, y);
7033
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AttachmentRenderer, { attachment: y2 }, b);
7007
7034
  case "dynamic-tool":
7008
7035
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ToolCallView, {
7009
- toolName: v2.toolName,
7010
- result: v2.output,
7011
- errorText: v2.state === "output-error" ? v2.errorText : void 0,
7012
- state: v2.state,
7013
- input: v2.input,
7014
- approval: v2.approval,
7015
- onApprove: _,
7016
- isLive: g
7017
- }, y);
7036
+ toolName: y2.toolName,
7037
+ result: y2.output,
7038
+ errorText: y2.state === "output-error" ? y2.errorText : void 0,
7039
+ state: y2.state,
7040
+ input: y2.input,
7041
+ approval: y2.approval,
7042
+ onApprove: v,
7043
+ isLive: g,
7044
+ isActive: _
7045
+ }, b);
7018
7046
  case "source-document":
7019
7047
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SourceChip, {
7020
7048
  icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileText, { className: "h-3 w-3 shrink-0" }),
7021
- title: v2.title,
7022
- subtitle: v2.filename
7023
- }, y);
7049
+ title: y2.title,
7050
+ subtitle: y2.filename
7051
+ }, b);
7024
7052
  case "source-url":
7025
7053
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SourceChip, {
7026
7054
  icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ExternalLink, { className: "h-3 w-3 shrink-0" }),
7027
- title: v2.title ?? v2.url,
7028
- subtitle: v2.title ? v2.url : void 0,
7029
- href: v2.url
7030
- }, y);
7055
+ title: y2.title ?? y2.url,
7056
+ subtitle: y2.title ? y2.url : void 0,
7057
+ href: y2.url
7058
+ }, b);
7031
7059
  case "step-start":
7032
7060
  return null;
7033
7061
  default:
7034
- return logNever(v2), null;
7062
+ return logNever(y2), null;
7035
7063
  }
7036
7064
  }
7037
7065
  };
@@ -7735,6 +7763,7 @@ const Chatbot = (e18) => {
7735
7763
  message: e19,
7736
7764
  isStreamingReasoning: B === "streaming",
7737
7765
  isLast: g2,
7766
+ isActive: K,
7738
7767
  addToolApprovalResponse: g2 ? G : void 0
7739
7768
  })
7740
7769
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -35996,7 +35996,7 @@ ${d}`,
35996
35996
  return Logger.warn("Failed to get version from mount config"), null;
35997
35997
  }
35998
35998
  }
35999
- marimoVersionAtom = atom(getVersionFromMountConfig() || "0.23.11-dev27");
35999
+ marimoVersionAtom = atom(getVersionFromMountConfig() || "0.23.11-dev28");
36000
36000
  showCodeInRunModeAtom = atom(true);
36001
36001
  atom(null);
36002
36002
  var import_compiler_runtime = require_compiler_runtime();
package/dist/main.js CHANGED
@@ -26,7 +26,7 @@ import { $ as reducer, B as safeExtractSetUIElementMessageBuffers, Bn as CircleA
26
26
  import { __tla as __tla_1 } from "./chunk-5FQGJX7Z-BbqSm5gU.js";
27
27
  import { o as useSize, s as Root$1, u as createLucideIcon } from "./dist-Dk6PV_d3.js";
28
28
  import { A as SquareFunction, C as DEFAULT_COLOR_SCHEME, D as SCALE_TYPE_DESCRIPTIONS, E as EMPTY_VALUE$1, O as TIME_UNIT_DESCRIPTIONS, S as DEFAULT_AGGREGATION, T as DEFAULT_TIME_UNIT, _ as AGGREGATION_TYPE_DESCRIPTIONS, a as AGGREGATION_FNS$1, b as COLOR_SCHEMES, c as COLOR_BY_FIELDS, d as NONE_VALUE, f as SELECTABLE_DATA_TYPES, g as TIME_UNITS, h as STRING_AGGREGATION_FNS, i as convertDataTypeToSelectable, j as ChartColumn, k as escapeFieldName, l as COMBINED_TIME_UNITS, m as SORT_TYPES, n as createSpecWithoutData, o as BIN_AGGREGATION, p as SINGLE_TIME_UNITS, r as isFieldSet, s as CHART_TYPES, t as augmentSpecWithData, u as ChartType, v as AGGREGATION_TYPE_ICON, w as DEFAULT_MAX_BINS_FACET, x as COUNT_FIELD, y as CHART_TYPE_ICON } from "./spec-f8-xgaui.js";
29
- import { $ as contextAwarePanelOpen, $t as $fae977aafc393c5c$export$6b862160d295c8e, A as prettifyRowCount, At as SELECT_COLUMN_ID, B as DatePicker, Bt as TabsContent, C as downloadSizeLimitAtom, Ct as DelayMount, D as ErrorState, Dt as loadTableAndRawData, E as EmptyState, Et as getPageIndexForRow, F as ContextMenuSeparator, Ft as Maps, G as CommandEmpty, Gt as ChartLoadingState, H as Combobox, Ht as TabsTrigger, I as ContextMenuTrigger, It as dateToLocalISODate, J as CommandList, Jt as RenderTextWithLinks, K as CommandInput, Kt as LazyVegaEmbed, L as useInternalStateWithSync, Lt as dateToLocalISODateTime, M as ContextMenu, Mt as toFieldTypes, N as ContextMenuContent, Nt as getMimeValues, O as LoadingState, Ot as loadTableData, P as ContextMenuItem, Pt as isNullishFilter, Q as PANEL_TYPES, Qt as $fae977aafc393c5c$export$588937bcd60ade55, R as useSelectList, Rt as dateToLocalISOTime, S as Filenames, St as ColumnChartSpecModel, T as ColumnPreviewContainer, Tt as usePrevious$1, U as ComboboxItem, Ut as ChartErrorState, V as DateRangePicker, Vt as TabsList, W as Command, Wt as ChartInfoState, X as smartMatch, Xt as HtmlOutput, Y as CommandSeparator, Yt as Kbd, Z as ContextAwarePanelItem, Zt as EmotionCacheProvider, _ as ADD_PRINTING_CLASS, _t as NAMELESS_COLUMN_PREFIX, an as Ellipsis, at as Toggle, b as downloadHTMLAsImage, bt as renderCellValue, c as Slide, cn as ChevronsUpDown, d as RadioGroupItem, dn as ChevronsDownUp, dt as Table, en as TextWrap, et as contextAwarePanelOwner, f as JsonOutput, fn as ChevronLeft, ft as TableBody, g as InstallPackageButton, gt as TableRow, h as DataTable, ht as TableHeader, it as slotsController, j as getColumnCountForDisplay, jt as TOO_MANY_ROWS, k as prettifyRowColumnCount, kt as INDEX_COLUMN_NAME, l as Switch, ln as ChevronsRight, lt as Fill, m as OutputRenderer, mt as TableHead, n as marimoVersionAtom, nn as Funnel, nt as isCellAwareAtom, o as SLIDE_TYPE_OPTIONS_BY_VALUE, on as Download, p as OutputArea, pn as ArrowDownWideNarrow, pt as TableCell, q as CommandItem, qt as useOverflowDetection, r as showCodeInRunModeAtom, rn as EyeOff, rt as SlotNames, sn as Code, t as useNotebookCodeAvailable, tn as GripHorizontal, tt as contextAwarePanelType, u as RadioGroup, un as ChevronsLeft, ut as Provider$1, v as downloadBlob, vt as generateColumns, w as ColumnName, wt as useIntersectionObserver, x as Progress, xt as ColumnChartContext, y as downloadByURL, yt as inferFieldTypes, z as CompactChipRow, zt as Tabs, __tla as __tla_2 } from "./code-visibility-B_yzWRMv.js";
29
+ import { $ as contextAwarePanelOpen, $t as $fae977aafc393c5c$export$6b862160d295c8e, A as prettifyRowCount, At as SELECT_COLUMN_ID, B as DatePicker, Bt as TabsContent, C as downloadSizeLimitAtom, Ct as DelayMount, D as ErrorState, Dt as loadTableAndRawData, E as EmptyState, Et as getPageIndexForRow, F as ContextMenuSeparator, Ft as Maps, G as CommandEmpty, Gt as ChartLoadingState, H as Combobox, Ht as TabsTrigger, I as ContextMenuTrigger, It as dateToLocalISODate, J as CommandList, Jt as RenderTextWithLinks, K as CommandInput, Kt as LazyVegaEmbed, L as useInternalStateWithSync, Lt as dateToLocalISODateTime, M as ContextMenu, Mt as toFieldTypes, N as ContextMenuContent, Nt as getMimeValues, O as LoadingState, Ot as loadTableData, P as ContextMenuItem, Pt as isNullishFilter, Q as PANEL_TYPES, Qt as $fae977aafc393c5c$export$588937bcd60ade55, R as useSelectList, Rt as dateToLocalISOTime, S as Filenames, St as ColumnChartSpecModel, T as ColumnPreviewContainer, Tt as usePrevious$1, U as ComboboxItem, Ut as ChartErrorState, V as DateRangePicker, Vt as TabsList, W as Command, Wt as ChartInfoState, X as smartMatch, Xt as HtmlOutput, Y as CommandSeparator, Yt as Kbd, Z as ContextAwarePanelItem, Zt as EmotionCacheProvider, _ as ADD_PRINTING_CLASS, _t as NAMELESS_COLUMN_PREFIX, an as Ellipsis, at as Toggle, b as downloadHTMLAsImage, bt as renderCellValue, c as Slide, cn as ChevronsUpDown, d as RadioGroupItem, dn as ChevronsDownUp, dt as Table, en as TextWrap, et as contextAwarePanelOwner, f as JsonOutput, fn as ChevronLeft, ft as TableBody, g as InstallPackageButton, gt as TableRow, h as DataTable, ht as TableHeader, it as slotsController, j as getColumnCountForDisplay, jt as TOO_MANY_ROWS, k as prettifyRowColumnCount, kt as INDEX_COLUMN_NAME, l as Switch, ln as ChevronsRight, lt as Fill, m as OutputRenderer, mt as TableHead, n as marimoVersionAtom, nn as Funnel, nt as isCellAwareAtom, o as SLIDE_TYPE_OPTIONS_BY_VALUE, on as Download, p as OutputArea, pn as ArrowDownWideNarrow, pt as TableCell, q as CommandItem, qt as useOverflowDetection, r as showCodeInRunModeAtom, rn as EyeOff, rt as SlotNames, sn as Code, t as useNotebookCodeAvailable, tn as GripHorizontal, tt as contextAwarePanelType, u as RadioGroup, un as ChevronsLeft, ut as Provider$1, v as downloadBlob, vt as generateColumns, w as ColumnName, wt as useIntersectionObserver, x as Progress, xt as ColumnChartContext, y as downloadByURL, yt as inferFieldTypes, z as CompactChipRow, zt as Tabs, __tla as __tla_2 } from "./code-visibility-BkNk8VeO.js";
30
30
  import { c as Calendar, i as createReducerAndAtoms, n as useOnUnmount, o as ToggleLeft, t as useOnMount } from "./useLifecycle-B3NOEiY5.js";
31
31
  import { t as Check } from "./check-BCaJeT-J.js";
32
32
  import { A as Icon, C as logNever, D as $18f2051aff69b9bf$export$a54013f0d02a8f82, E as $18f2051aff69b9bf$export$43bb16f9c6d9e3f7, F as createCollection, I as X, M as clamp$2, N as usePrevious$2, P as useDirection, R as ChevronDown, S as assertNever, a as SelectGroup, c as SelectSeparator, d as NativeSelect, i as SelectContent, j as Trigger$1, l as SelectTrigger, n as capitalize, o as SelectItem, r as Select, s as SelectLabel, t as Strings, u as SelectValue, w as $a916eb452884faea$export$b7a616150fdb9f44 } from "./strings-J57tzLr3.js";
@@ -8558,7 +8558,7 @@ let __tla = Promise.all([
8558
8558
  };
8559
8559
  }
8560
8560
  };
8561
- var LazyChatbot = import_react.lazy(() => import("./chat-ui-Bf2NICxi.js").then((e) => ({
8561
+ var LazyChatbot = import_react.lazy(() => import("./chat-ui-m1SnDPdw.js").then((e) => ({
8562
8562
  default: e.Chatbot
8563
8563
  }))), messageSchema = array(object({
8564
8564
  id: string(),
@@ -36190,7 +36190,7 @@ ${c}
36190
36190
  function _temp2$2(e) {
36191
36191
  e.target === e.currentTarget && e.key === "Enter" && (e.preventDefault(), e.stopPropagation(), e.currentTarget.click());
36192
36192
  }
36193
- var LazySlidesComponent = import_react.lazy(() => import("./reveal-component-fxfTFY2x.js"));
36193
+ var LazySlidesComponent = import_react.lazy(() => import("./reveal-component-C8gBbSKY.js"));
36194
36194
  const SlidesLayoutRenderer = ({ layout: e, setLayout: r, cells: c, mode: l }) => {
36195
36195
  var _a3;
36196
36196
  let u = useAtomValue(kioskModeAtom), d = l === "read" || u, f = useAtomValue(numColumnsAtom) > 1, [p, m] = (0, import_react.useState)(null), { slideCells: h, skippedIds: g, noOutputIds: _, slideTypes: v, startCellIndex: y } = (0, import_react.useMemo)(() => computeSlideCellsInfo(c, e), [
@@ -9,7 +9,7 @@ import { t as require_compiler_runtime } from "./compiler-runtime-CEbnTgxf.js";
9
9
  import { lt as kioskModeAtom } from "./html-to-image-BJbLjZyG.js";
10
10
  import "./chunk-5FQGJX7Z-BbqSm5gU.js";
11
11
  import { u as createLucideIcon } from "./dist-Dk6PV_d3.js";
12
- import { a as DEFAULT_SLIDE_TYPE, c as Slide, ct as PanelResizeHandle, i as DEFAULT_DECK_TRANSITION, in as Expand, ot as Panel, rn as EyeOff, s as SlideSidebar, sn as Code, st as PanelGroup, t as useNotebookCodeAvailable } from "./code-visibility-B_yzWRMv.js";
12
+ import { a as DEFAULT_SLIDE_TYPE, c as Slide, ct as PanelResizeHandle, i as DEFAULT_DECK_TRANSITION, in as Expand, ot as Panel, rn as EyeOff, s as SlideSidebar, sn as Code, st as PanelGroup, t as useNotebookCodeAvailable } from "./code-visibility-BkNk8VeO.js";
13
13
  import { X as useDebouncedCallback } from "./input-Cn-SZdXY.js";
14
14
  import "./toDate-B4-pUFYh.js";
15
15
  import "./react-dom-BTJzcVJ9.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.23.11-dev27",
3
+ "version": "0.23.11-dev28",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -20,11 +20,14 @@ export const renderUIMessage = ({
20
20
  message,
21
21
  isStreamingReasoning,
22
22
  isLast,
23
+ isActive,
23
24
  addToolApprovalResponse,
24
25
  }: {
25
26
  message: UIMessage;
26
27
  isStreamingReasoning: boolean;
27
28
  isLast: boolean;
29
+ /** Whether the chat is currently streaming/submitting a response. */
30
+ isActive: boolean;
28
31
  addToolApprovalResponse?: ChatAddToolApproveResponseFunction;
29
32
  }) => {
30
33
  return (
@@ -49,6 +52,7 @@ export const renderUIMessage = ({
49
52
  approval={part.approval}
50
53
  onApprove={addToolApprovalResponse}
51
54
  isLive={isLast}
55
+ isActive={isActive}
52
56
  />
53
57
  );
54
58
  }
@@ -102,6 +106,7 @@ export const renderUIMessage = ({
102
106
  approval={part.approval}
103
107
  onApprove={addToolApprovalResponse}
104
108
  isLive={isLast}
109
+ isActive={isActive}
105
110
  />
106
111
  );
107
112
  case "source-document":
@@ -143,6 +143,7 @@ interface ChatMessageProps {
143
143
  onEdit: (index: number, newValue: string) => void;
144
144
  isStreamingReasoning: boolean;
145
145
  isLast: boolean;
146
+ isActive: boolean;
146
147
  addToolApprovalResponse?: ChatAddToolApproveResponseFunction;
147
148
  }
148
149
 
@@ -153,6 +154,7 @@ const ChatMessageDisplay: React.FC<ChatMessageProps> = memo(
153
154
  onEdit,
154
155
  isStreamingReasoning,
155
156
  isLast,
157
+ isActive,
156
158
  addToolApprovalResponse,
157
159
  }) => {
158
160
  const renderUserMessage = (message: UIMessage) => {
@@ -205,6 +207,7 @@ const ChatMessageDisplay: React.FC<ChatMessageProps> = memo(
205
207
  message,
206
208
  isStreamingReasoning,
207
209
  isLast,
210
+ isActive,
208
211
  addToolApprovalResponse,
209
212
  })}
210
213
  </div>
@@ -780,6 +783,7 @@ const ChatPanelBody = () => {
780
783
  onEdit={handleMessageEdit}
781
784
  isStreamingReasoning={isStreamingReasoning}
782
785
  isLast={idx === messages.length - 1}
786
+ isActive={isLoading}
783
787
  addToolApprovalResponse={addToolApprovalResponse}
784
788
  />
785
789
  ))}
@@ -24,6 +24,7 @@ interface ToolCallViewProps {
24
24
  * (the user has moved on).
25
25
  */
26
26
  isLive?: boolean;
27
+ isActive?: boolean;
27
28
  }
28
29
 
29
30
  export const ToolCallView: React.FC<ToolCallViewProps> = ({
@@ -37,6 +38,7 @@ export const ToolCallView: React.FC<ToolCallViewProps> = ({
37
38
  index,
38
39
  className,
39
40
  isLive = true,
41
+ isActive = true,
40
42
  }) => {
41
43
  switch (state) {
42
44
  case "approval-requested":
@@ -61,6 +63,7 @@ export const ToolCallView: React.FC<ToolCallViewProps> = ({
61
63
  input={input}
62
64
  index={index}
63
65
  className={className}
66
+ isActive={isActive}
64
67
  />
65
68
  );
66
69
 
@@ -89,6 +92,7 @@ export const ToolCallView: React.FC<ToolCallViewProps> = ({
89
92
  approval={approval}
90
93
  index={index}
91
94
  className={className}
95
+ isActive={isActive}
92
96
  />
93
97
  );
94
98
 
@@ -1,6 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { BanIcon, CheckCircleIcon, Loader2, WrenchIcon } from "lucide-react";
3
+ import {
4
+ BanIcon,
5
+ CheckCircleIcon,
6
+ CircleSlashIcon,
7
+ Loader2,
8
+ WrenchIcon,
9
+ } from "lucide-react";
4
10
  import React from "react";
5
11
  import {
6
12
  Accordion,
@@ -29,7 +35,19 @@ const STATUS_LABEL: Record<HistoryState, string> = {
29
35
  "output-denied": "Denied",
30
36
  };
31
37
 
32
- const StatusIcon: React.FC<{ state: HistoryState }> = ({ state }) => {
38
+ const PENDING_STATES = new Set<HistoryState>([
39
+ "input-streaming",
40
+ "input-available",
41
+ "approval-responded",
42
+ ]);
43
+
44
+ const StatusIcon: React.FC<{ state: HistoryState; interrupted: boolean }> = ({
45
+ state,
46
+ interrupted,
47
+ }) => {
48
+ if (interrupted) {
49
+ return <CircleSlashIcon className="h-3 w-3 text-muted-foreground" />;
50
+ }
33
51
  switch (state) {
34
52
  case "input-streaming":
35
53
  case "input-available":
@@ -69,6 +87,7 @@ interface ToolHistoryRowProps {
69
87
  approval?: ToolApproval;
70
88
  index?: number;
71
89
  className?: string;
90
+ isActive?: boolean;
72
91
  }
73
92
 
74
93
  export const ToolHistoryRow: React.FC<ToolHistoryRowProps> = ({
@@ -79,7 +98,9 @@ export const ToolHistoryRow: React.FC<ToolHistoryRowProps> = ({
79
98
  approval,
80
99
  index = 0,
81
100
  className,
101
+ isActive = true,
82
102
  }) => {
103
+ const interrupted = !isActive && PENDING_STATES.has(state);
83
104
  return (
84
105
  <Accordion
85
106
  key={`tool-${index}`}
@@ -91,12 +112,12 @@ export const ToolHistoryRow: React.FC<ToolHistoryRowProps> = ({
91
112
  <AccordionTrigger
92
113
  className={cn(
93
114
  "h-6 text-xs border-border shadow-none! ring-0! bg-muted/60 hover:bg-muted py-0 px-2 gap-1 rounded-sm [&[data-state=open]>svg]:rotate-180 hover:no-underline",
94
- getTriggerToneClass(state),
115
+ interrupted ? "text-muted-foreground" : getTriggerToneClass(state),
95
116
  )}
96
117
  >
97
118
  <span className="flex items-center gap-1">
98
- <StatusIcon state={state} />
99
- {STATUS_LABEL[state]}:
119
+ <StatusIcon state={state} interrupted={interrupted} />
120
+ {interrupted ? "Interrupted" : STATUS_LABEL[state]}:
100
121
  <code className="font-mono text-xs">
101
122
  {formatToolName(toolName)}
102
123
  </code>
@@ -445,6 +445,7 @@ export const Chatbot: React.FC<Props> = (props) => {
445
445
  message,
446
446
  isStreamingReasoning: status === "streaming",
447
447
  isLast,
448
+ isActive: isLoading,
448
449
  addToolApprovalResponse: isLast
449
450
  ? addToolApprovalResponse
450
451
  : undefined,