@marimo-team/islands 0.25.1-dev26 → 0.25.1-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.
Files changed (170) hide show
  1. package/dist/{ErrorBoundary-pWWhtr0s.js → ErrorBoundary-CE6-1WC1.js} +1 -1
  2. package/dist/{code-visibility-Ba_KMLhg.js → code-visibility--u2Q2Zfx.js} +1 -1
  3. package/dist/{common-Cqwp2VSj.js → common-hHL7iKzA.js} +1 -1
  4. package/dist/{data-grid-overlay-editor-CpH8-A59.js → data-grid-overlay-editor-v7VZO5up.js} +1 -1
  5. package/dist/{feedback-button-CJxD9fy8.js → feedback-button-C3Ya1IXo.js} +2 -2
  6. package/dist/{glide-data-editor-cm-NQofk.js → glide-data-editor-BKOLh2Tv.js} +3 -3
  7. package/dist/{globals-BquX8N9R.js → globals-DOJr_y24.js} +1 -1
  8. package/dist/main.js +6 -6
  9. package/dist/{number-overlay-editor-3AkAzj7F.js → number-overlay-editor-DkEFJYK7.js} +1 -1
  10. package/dist/{reveal-component-rC5k5pu3.js → reveal-component-rbEv9ppg.js} +2 -2
  11. package/dist/style.css +1 -1
  12. package/package.json +1 -1
  13. package/src/__mocks__/common.ts +3 -3
  14. package/src/__tests__/CellStatus.test.tsx +1 -1
  15. package/src/__tests__/setup.ts +7 -7
  16. package/src/components/app-config/ai-config.tsx +2 -0
  17. package/src/components/chat/chat-panel.tsx +19 -8
  18. package/src/components/data-table/column-summary/chart-spec-model.tsx +4 -4
  19. package/src/components/dependency-graph/elements.ts +2 -2
  20. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +107 -0
  21. package/src/components/editor/actions/pair-with-agent.tsx +119 -0
  22. package/src/components/editor/actions/useNotebookActions.tsx +2 -1
  23. package/src/components/editor/ai/add-cell-with-ai.tsx +2 -0
  24. package/src/components/editor/ai/staged-cell-submission.ts +2 -2
  25. package/src/components/editor/ai/transport/chat-transport.tsx +1 -1
  26. package/src/components/editor/connections/database/as-code.ts +44 -44
  27. package/src/components/editor/connections/storage/as-code.ts +3 -3
  28. package/src/components/editor/file-tree/requesting-tree.tsx +16 -13
  29. package/src/components/editor/navigation/clipboard.ts +2 -2
  30. package/src/components/editor/output/ansi-reduce.ts +13 -13
  31. package/src/components/slides/__tests__/minimap-actions.test.tsx +7 -7
  32. package/src/components/slides/__tests__/minimap.test.ts +12 -12
  33. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +8 -8
  34. package/src/core/ai/context/__tests__/registry.test.ts +31 -28
  35. package/src/core/ai/context/providers/cell-output.ts +8 -8
  36. package/src/core/ai/context/providers/datasource.ts +10 -7
  37. package/src/core/ai/context/providers/error.ts +7 -7
  38. package/src/core/ai/context/providers/file.ts +8 -8
  39. package/src/core/ai/context/providers/tables.ts +7 -7
  40. package/src/core/ai/context/providers/variable.ts +7 -7
  41. package/src/core/ai/context/registry.ts +18 -18
  42. package/src/core/ai/ids/ids.ts +5 -5
  43. package/src/core/ai/model-registry.ts +12 -9
  44. package/src/core/ai/staged-cells.ts +6 -6
  45. package/src/core/ai/tools/base.ts +6 -6
  46. package/src/core/ai/tools/edit-notebook-tool.ts +6 -6
  47. package/src/core/ai/tools/registry.ts +4 -4
  48. package/src/core/ai/tools/run-cells-tool.ts +7 -7
  49. package/src/core/ai/tools/sample-tool.ts +6 -6
  50. package/src/core/codemirror/cells/debugger-decorations.ts +13 -7
  51. package/src/core/codemirror/cells/line-timing-decorations.ts +9 -9
  52. package/src/core/codemirror/cells/traceback-decorations.ts +7 -4
  53. package/src/core/codemirror/code-lens/extension.ts +13 -13
  54. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +6 -6
  55. package/src/core/codemirror/copilot/__tests__/transport.test.ts +12 -12
  56. package/src/core/codemirror/copilot/language-server.ts +13 -13
  57. package/src/core/codemirror/copilot/transport.ts +1 -1
  58. package/src/core/codemirror/find-replace/search-highlight.ts +5 -5
  59. package/src/core/codemirror/go-to-definition/underline.ts +3 -3
  60. package/src/core/codemirror/keymaps/vim.ts +3 -3
  61. package/src/core/codemirror/language/languages/markdown.ts +8 -8
  62. package/src/core/codemirror/language/languages/python.ts +7 -7
  63. package/src/core/codemirror/language/languages/sql/completion-builder.ts +5 -5
  64. package/src/core/codemirror/language/languages/sql/completion-store.ts +4 -4
  65. package/src/core/codemirror/language/languages/sql/sql.ts +21 -21
  66. package/src/core/codemirror/lsp/__tests__/transports.test.ts +10 -10
  67. package/src/core/codemirror/lsp/federated-lsp.ts +29 -27
  68. package/src/core/codemirror/lsp/notebook-lsp.ts +21 -21
  69. package/src/core/codemirror/misc/__tests__/dnd.test.ts +10 -10
  70. package/src/core/codemirror/misc/__tests__/paste.test.ts +7 -4
  71. package/src/core/codemirror/reactive-references/extension.ts +3 -3
  72. package/src/core/codemirror/rtc/loro/awareness.ts +12 -12
  73. package/src/core/codemirror/rtc/loro/sync.ts +5 -5
  74. package/src/core/codemirror/vim/cursor-visibility.ts +3 -3
  75. package/src/core/dom/ui-element.ts +5 -5
  76. package/src/core/dom/uiregistry.ts +10 -10
  77. package/src/core/hotkeys/hotkeys.ts +9 -9
  78. package/src/core/islands/__tests__/bridge.test.ts +4 -4
  79. package/src/core/islands/__tests__/test-utils.tsx +4 -4
  80. package/src/core/islands/bridge.ts +85 -82
  81. package/src/core/islands/components/web-components.tsx +7 -7
  82. package/src/core/islands/worker/__tests__/controller.test.ts +1 -1
  83. package/src/core/islands/worker/controller.ts +6 -3
  84. package/src/core/islands/worker-factory.ts +2 -2
  85. package/src/core/kernel/RuntimeState.ts +4 -4
  86. package/src/core/lsp/__tests__/transport.test.ts +19 -19
  87. package/src/core/lsp/transport.ts +5 -5
  88. package/src/core/network/CachingRequestRegistry.ts +2 -2
  89. package/src/core/network/DeferredRequestRegistry.ts +4 -4
  90. package/src/core/runtime/runtime.ts +25 -20
  91. package/src/core/static/virtual-file-tracker.ts +5 -5
  92. package/src/core/wasm/__tests__/bridge.test.ts +2 -2
  93. package/src/core/wasm/bridge.ts +130 -126
  94. package/src/core/wasm/router.ts +5 -5
  95. package/src/core/wasm/store.ts +4 -4
  96. package/src/core/wasm/worker/bootstrap.ts +8 -5
  97. package/src/core/wasm/worker/message-buffer.ts +3 -3
  98. package/src/core/websocket/transports/__tests__/ws.test.ts +8 -8
  99. package/src/core/websocket/transports/basic.ts +15 -8
  100. package/src/core/websocket/transports/sse.ts +7 -7
  101. package/src/core/websocket/transports/transport.ts +3 -3
  102. package/src/core/websocket/transports/ws.ts +9 -7
  103. package/src/hooks/__tests__/useOverflowDetection.test.tsx +5 -5
  104. package/src/hooks/__tests__/useResizeObserver.test.tsx +12 -12
  105. package/src/plugins/core/registerReactComponent.tsx +5 -5
  106. package/src/plugins/core/sidebar-element.tsx +2 -2
  107. package/src/plugins/impl/ButtonPlugin.tsx +3 -3
  108. package/src/plugins/impl/CheckboxPlugin.tsx +3 -3
  109. package/src/plugins/impl/CodeEditorPlugin.tsx +3 -3
  110. package/src/plugins/impl/DatePickerPlugin.tsx +3 -3
  111. package/src/plugins/impl/DateRangePlugin.tsx +3 -3
  112. package/src/plugins/impl/DateTimePickerPlugin.tsx +3 -3
  113. package/src/plugins/impl/DictPlugin.tsx +3 -3
  114. package/src/plugins/impl/DropdownPlugin.tsx +3 -3
  115. package/src/plugins/impl/FileUploadPlugin.tsx +3 -3
  116. package/src/plugins/impl/MatrixPlugin.tsx +4 -4
  117. package/src/plugins/impl/MicrophonePlugin.tsx +3 -3
  118. package/src/plugins/impl/MultiselectPlugin.tsx +3 -3
  119. package/src/plugins/impl/NumberPlugin.tsx +3 -3
  120. package/src/plugins/impl/RadioPlugin.tsx +3 -3
  121. package/src/plugins/impl/RangeSliderPlugin.tsx +3 -3
  122. package/src/plugins/impl/RefreshPlugin.tsx +3 -3
  123. package/src/plugins/impl/SliderPlugin.tsx +3 -3
  124. package/src/plugins/impl/SwitchPlugin.tsx +3 -3
  125. package/src/plugins/impl/TabsPlugin.tsx +3 -3
  126. package/src/plugins/impl/TextAreaPlugin.tsx +3 -3
  127. package/src/plugins/impl/TextInputPlugin.tsx +3 -3
  128. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +2 -2
  129. package/src/plugins/impl/anywidget/model.ts +10 -10
  130. package/src/plugins/impl/anywidget/registry.ts +12 -9
  131. package/src/plugins/impl/anywidget/runtime.ts +11 -9
  132. package/src/plugins/impl/anywidget/widget-binding.ts +6 -6
  133. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +3 -3
  134. package/src/plugins/impl/matplotlib/__tests__/matplotlib-renderer.test.ts +2 -2
  135. package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +2 -2
  136. package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +10 -10
  137. package/src/plugins/impl/panel/utils.ts +5 -5
  138. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +3 -3
  139. package/src/plugins/impl/vega/VegaPlugin.tsx +3 -3
  140. package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +7 -7
  141. package/src/plugins/layout/AccordionPlugin.tsx +3 -3
  142. package/src/plugins/layout/CalloutPlugin.tsx +3 -3
  143. package/src/plugins/layout/ImageComparisonPlugin.tsx +5 -3
  144. package/src/plugins/layout/JsonOutputPlugin.tsx +3 -3
  145. package/src/plugins/layout/MimeRenderPlugin.tsx +3 -3
  146. package/src/plugins/layout/NavigationMenuPlugin.tsx +3 -3
  147. package/src/plugins/layout/OutlinePlugin.tsx +3 -3
  148. package/src/plugins/layout/ProgressPlugin.tsx +3 -3
  149. package/src/plugins/layout/RoutesPlugin.tsx +3 -3
  150. package/src/plugins/layout/StatPlugin.tsx +3 -3
  151. package/src/plugins/layout/TexPlugin.tsx +3 -3
  152. package/src/plugins/layout/carousel/CarouselPlugin.tsx +4 -4
  153. package/src/plugins/layout/mermaid/MermaidPlugin.tsx +3 -3
  154. package/src/utils/Deferred.ts +6 -6
  155. package/src/utils/async-capture-tracker.ts +10 -7
  156. package/src/utils/errors.ts +5 -5
  157. package/src/utils/id-tree.tsx +83 -80
  158. package/src/utils/lru.ts +1 -1
  159. package/src/utils/multi-map.ts +14 -12
  160. package/src/utils/paths.ts +6 -6
  161. package/src/utils/pluralize.ts +3 -3
  162. package/src/utils/progress.ts +6 -6
  163. package/src/utils/python-poet/poet.ts +14 -14
  164. package/src/utils/routes.ts +4 -2
  165. package/src/utils/semaphore.ts +6 -6
  166. package/src/utils/storage/storage.ts +6 -6
  167. package/src/utils/storage/typed.ts +16 -12
  168. package/src/utils/time.ts +9 -9
  169. package/src/utils/timed-cache.ts +4 -4
  170. package/src/utils/tracer.ts +9 -6
@@ -36,7 +36,7 @@ abstract class CodeGenerator<T extends DatabaseConnection["type"]> {
36
36
  protected orm: ConnectionLibrary;
37
37
  protected secrets: SecretContainer;
38
38
 
39
- constructor(
39
+ public constructor(
40
40
  connection: Extract<DatabaseConnection, { type: T }>,
41
41
  orm: ConnectionLibrary,
42
42
  secrets: SecretContainer,
@@ -46,7 +46,7 @@ abstract class CodeGenerator<T extends DatabaseConnection["type"]> {
46
46
  this.secrets = secrets;
47
47
  }
48
48
 
49
- get imports(): Set<string> {
49
+ public get imports(): Set<string> {
50
50
  const imports = new Set<string>(this.generateImports());
51
51
  switch (this.orm) {
52
52
  case "sqlalchemy":
@@ -67,7 +67,7 @@ abstract class CodeGenerator<T extends DatabaseConnection["type"]> {
67
67
 
68
68
  protected abstract generateImports(): string[];
69
69
 
70
- abstract generateConnectionCode(): string;
70
+ public abstract generateConnectionCode(): string;
71
71
  }
72
72
 
73
73
  const makePrivate = (name: string) => `_${name}`;
@@ -75,14 +75,14 @@ const makePrivate = (name: string) => `_${name}`;
75
75
  class SecretContainer {
76
76
  private secrets: Record<string, string> = {};
77
77
 
78
- get imports(): Set<string> {
78
+ public get imports(): Set<string> {
79
79
  if (Object.keys(this.secrets).length === 0) {
80
80
  return new Set<string>();
81
81
  }
82
82
  return new Set<string>(["import os"]);
83
83
  }
84
84
 
85
- print(
85
+ public print(
86
86
  varName: string,
87
87
  secretKeyOrValue: string | number | boolean,
88
88
  defaultValue?: string | undefined,
@@ -119,7 +119,7 @@ class SecretContainer {
119
119
  return `"${secretKeyOrValue}"`;
120
120
  }
121
121
 
122
- printInFString(
122
+ public printInFString(
123
123
  varName: string,
124
124
  secretKeyOrValue: string | number | undefined | boolean,
125
125
  defaultValue?: string | undefined,
@@ -171,7 +171,7 @@ class SecretContainer {
171
171
  * f"db://sample:access_token@sample.com"
172
172
  * ```
173
173
  */
174
- printPassword(
174
+ public printPassword(
175
175
  password: string | undefined,
176
176
  passwordPlaceholder: string,
177
177
  inFString: boolean,
@@ -187,11 +187,11 @@ class SecretContainer {
187
187
  : printMethod(variableName || "password", passwordPlaceholder, password);
188
188
  }
189
189
 
190
- getSecrets(): Record<string, string> {
190
+ public getSecrets(): Record<string, string> {
191
191
  return this.secrets;
192
192
  }
193
193
 
194
- formatSecrets(): string {
194
+ public formatSecrets(): string {
195
195
  if (Object.keys(this.secrets).length === 0) {
196
196
  return "";
197
197
  }
@@ -203,11 +203,11 @@ class SecretContainer {
203
203
  }
204
204
 
205
205
  class PostgresGenerator extends CodeGenerator<"postgres"> {
206
- generateImports(): string[] {
206
+ public generateImports(): string[] {
207
207
  return [];
208
208
  }
209
209
 
210
- generateConnectionCode(): string {
210
+ public generateConnectionCode(): string {
211
211
  const ssl = this.connection.ssl
212
212
  ? ", connect_args={'sslmode': 'require'}"
213
213
  : "";
@@ -235,11 +235,11 @@ class PostgresGenerator extends CodeGenerator<"postgres"> {
235
235
  }
236
236
 
237
237
  class MySQLGenerator extends CodeGenerator<"mysql"> {
238
- generateImports(): string[] {
238
+ public generateImports(): string[] {
239
239
  return [];
240
240
  }
241
241
 
242
- generateConnectionCode(): string {
242
+ public generateConnectionCode(): string {
243
243
  const ssl = this.connection.ssl
244
244
  ? ", connect_args={'ssl': {'ssl-mode': 'preferred'}}"
245
245
  : "";
@@ -267,11 +267,11 @@ class MySQLGenerator extends CodeGenerator<"mysql"> {
267
267
  }
268
268
 
269
269
  class SQLiteGenerator extends CodeGenerator<"sqlite"> {
270
- generateImports(): string[] {
270
+ public generateImports(): string[] {
271
271
  return [];
272
272
  }
273
273
 
274
- generateConnectionCode(): string {
274
+ public generateConnectionCode(): string {
275
275
  const database = this.connection.database
276
276
  ? this.secrets.printInFString("database", this.connection.database)
277
277
  : "";
@@ -289,11 +289,11 @@ class SQLiteGenerator extends CodeGenerator<"sqlite"> {
289
289
  }
290
290
 
291
291
  class SnowflakeGenerator extends CodeGenerator<"snowflake"> {
292
- generateImports(): string[] {
292
+ public generateImports(): string[] {
293
293
  return ["from snowflake.sqlalchemy import URL"];
294
294
  }
295
295
 
296
- generateConnectionCode(): string {
296
+ public generateConnectionCode(): string {
297
297
  const { authType, account, database, warehouse, schema, role } =
298
298
  this.connection;
299
299
  const baseParams: Record<string, string | undefined> = {
@@ -422,11 +422,11 @@ class BigQueryGenerator extends CodeGenerator<"bigquery"> {
422
422
  );
423
423
  }
424
424
 
425
- generateImports(): string[] {
425
+ public generateImports(): string[] {
426
426
  return this.credential.kind === "path" ? [] : ["import json"];
427
427
  }
428
428
 
429
- generateConnectionCode(): string {
429
+ public generateConnectionCode(): string {
430
430
  const project = this.secrets.printInFString(
431
431
  "project",
432
432
  this.connection.project,
@@ -451,11 +451,11 @@ class BigQueryGenerator extends CodeGenerator<"bigquery"> {
451
451
  }
452
452
 
453
453
  class DuckDBGenerator extends CodeGenerator<"duckdb"> {
454
- generateImports(): string[] {
454
+ public generateImports(): string[] {
455
455
  return [];
456
456
  }
457
457
 
458
- generateConnectionCode(): string {
458
+ public generateConnectionCode(): string {
459
459
  const database = this.secrets.printInFString(
460
460
  "database",
461
461
  this.connection.database || ":memory:",
@@ -469,11 +469,11 @@ class DuckDBGenerator extends CodeGenerator<"duckdb"> {
469
469
  }
470
470
 
471
471
  class MotherDuckGenerator extends CodeGenerator<"motherduck"> {
472
- generateImports(): string[] {
472
+ public generateImports(): string[] {
473
473
  return [];
474
474
  }
475
475
 
476
- generateConnectionCode(): string {
476
+ public generateConnectionCode(): string {
477
477
  const database = this.secrets.printInFString(
478
478
  "database",
479
479
  this.connection.database,
@@ -497,11 +497,11 @@ class MotherDuckGenerator extends CodeGenerator<"motherduck"> {
497
497
  }
498
498
 
499
499
  class ClickHouseGenerator extends CodeGenerator<"clickhouse_connect"> {
500
- generateImports(): string[] {
500
+ public generateImports(): string[] {
501
501
  return ["import clickhouse_connect"];
502
502
  }
503
503
 
504
- generateConnectionCode(): string {
504
+ public generateConnectionCode(): string {
505
505
  const password = this.secrets.printPassword(
506
506
  this.connection.password,
507
507
  "CLICKHOUSE_PASSWORD",
@@ -530,11 +530,11 @@ ${formatUrlParams(params, (inner) => ` ${inner}`)},
530
530
  }
531
531
 
532
532
  class TimeplusGenerator extends CodeGenerator<"timeplus"> {
533
- generateImports(): string[] {
533
+ public generateImports(): string[] {
534
534
  return [];
535
535
  }
536
536
 
537
- generateConnectionCode(): string {
537
+ public generateConnectionCode(): string {
538
538
  const password = this.secrets.printPassword(
539
539
  this.connection.password,
540
540
  "TIMEPLUS_PASSWORD",
@@ -555,11 +555,11 @@ class TimeplusGenerator extends CodeGenerator<"timeplus"> {
555
555
  }
556
556
 
557
557
  class ChDBGenerator extends CodeGenerator<"chdb"> {
558
- generateImports(): string[] {
558
+ public generateImports(): string[] {
559
559
  return ["import chdb"];
560
560
  }
561
561
 
562
- generateConnectionCode(): string {
562
+ public generateConnectionCode(): string {
563
563
  const database =
564
564
  this.secrets.print("database", this.connection.database) || '""';
565
565
 
@@ -570,13 +570,13 @@ class ChDBGenerator extends CodeGenerator<"chdb"> {
570
570
  }
571
571
 
572
572
  class TrinoGenerator extends CodeGenerator<"trino"> {
573
- generateImports(): string[] {
573
+ public generateImports(): string[] {
574
574
  return this.connection.async_support
575
575
  ? ["import aiotrino"]
576
576
  : ["import trino.sqlalchemy"];
577
577
  }
578
578
 
579
- generateConnectionCode(): string {
579
+ public generateConnectionCode(): string {
580
580
  const trinoExtension = this.connection.async_support ? "aiotrino" : "trino";
581
581
  const schema = this.connection.schema ? `/${this.connection.schema}` : "";
582
582
 
@@ -614,7 +614,7 @@ class PyIcebergGenerator extends CodeGenerator<"iceberg"> {
614
614
  );
615
615
  }
616
616
 
617
- generateImports(): string[] {
617
+ public generateImports(): string[] {
618
618
  if (Object.keys(this.getCatalogOptions()).length === 0) {
619
619
  return ["from pyiceberg.catalog import load_catalog"];
620
620
  }
@@ -635,7 +635,7 @@ class PyIcebergGenerator extends CodeGenerator<"iceberg"> {
635
635
  }
636
636
  }
637
637
 
638
- generateConnectionCode(): string {
638
+ public generateConnectionCode(): string {
639
639
  const name = `"${this.connection.name}"`;
640
640
  const options = this.getCatalogOptions();
641
641
  if (Object.keys(options).length === 0) {
@@ -705,12 +705,12 @@ class PyIcebergGenerator extends CodeGenerator<"iceberg"> {
705
705
  }
706
706
 
707
707
  class DataFusionGenerator extends CodeGenerator<"datafusion"> {
708
- generateImports(): string[] {
708
+ public generateImports(): string[] {
709
709
  // To trigger installation of ibis-datafusion
710
710
  return ["from datafusion import SessionContext"];
711
711
  }
712
712
 
713
- generateConnectionCode(): string {
713
+ public generateConnectionCode(): string {
714
714
  if (this.connection.sessionContext) {
715
715
  return dedent(`
716
716
  ctx = SessionContext()
@@ -727,11 +727,11 @@ class DataFusionGenerator extends CodeGenerator<"datafusion"> {
727
727
  }
728
728
 
729
729
  class PySparkGenerator extends CodeGenerator<"pyspark"> {
730
- generateImports(): string[] {
730
+ public generateImports(): string[] {
731
731
  return ["from pyspark.sql import SparkSession"];
732
732
  }
733
733
 
734
- generateConnectionCode(): string {
734
+ public generateConnectionCode(): string {
735
735
  if (this.connection.host || this.connection.port) {
736
736
  const host = this.secrets.printInFString("host", this.connection.host);
737
737
  const port = this.secrets.printInFString("port", this.connection.port);
@@ -747,11 +747,11 @@ class PySparkGenerator extends CodeGenerator<"pyspark"> {
747
747
  }
748
748
 
749
749
  class RedshiftGenerator extends CodeGenerator<"redshift"> {
750
- generateImports(): string[] {
750
+ public generateImports(): string[] {
751
751
  return ["import redshift_connector"];
752
752
  }
753
753
 
754
- generateConnectionCode(): string {
754
+ public generateConnectionCode(): string {
755
755
  const host = this.secrets.print("host", this.connection.host);
756
756
  const port = this.secrets.print("port", this.connection.port);
757
757
  const database = this.secrets.print("database", this.connection.database);
@@ -819,11 +819,11 @@ ${formatUrlParams(params, (inner) => ` ${inner}`)},
819
819
  }
820
820
 
821
821
  class DatabricksGenerator extends CodeGenerator<"databricks"> {
822
- generateImports(): string[] {
822
+ public generateImports(): string[] {
823
823
  return [];
824
824
  }
825
825
 
826
- generateConnectionCode(): string {
826
+ public generateConnectionCode(): string {
827
827
  const useFString = this.orm !== "ibis";
828
828
 
829
829
  const accessToken = this.secrets.printPassword(
@@ -883,14 +883,14 @@ class DatabricksGenerator extends CodeGenerator<"databricks"> {
883
883
  }
884
884
 
885
885
  class SupabaseGenerator extends CodeGenerator<"supabase"> {
886
- generateImports(): string[] {
886
+ public generateImports(): string[] {
887
887
  if (this.connection.disable_client_pooling) {
888
888
  return ["from sqlalchemy.pool import NullPool"];
889
889
  }
890
890
  return [];
891
891
  }
892
892
 
893
- generateConnectionCode(): string {
893
+ public generateConnectionCode(): string {
894
894
  const password = this.secrets.printPassword(
895
895
  this.connection.password,
896
896
  "SUPABASE_PASSWORD",
@@ -921,7 +921,7 @@ class SupabaseGenerator extends CodeGenerator<"supabase"> {
921
921
  class CodeGeneratorFactory {
922
922
  public secrets = new SecretContainer();
923
923
 
924
- createGenerator(
924
+ public createGenerator(
925
925
  connection: DatabaseConnection,
926
926
  orm: ConnectionLibrary,
927
927
  ): CodeGenerator<DatabaseConnection["type"]> {
@@ -26,14 +26,14 @@ export const StorageLibraryDisplayNames: Record<StorageLibrary, string> = {
26
26
  class SecretContainer {
27
27
  private secrets: Record<string, string> = {};
28
28
 
29
- get imports(): Set<string> {
29
+ public get imports(): Set<string> {
30
30
  if (Object.keys(this.secrets).length === 0) {
31
31
  return new Set<string>();
32
32
  }
33
33
  return new Set<string>(["import os"]);
34
34
  }
35
35
 
36
- print(varName: string, value: string | undefined): string {
36
+ public print(varName: string, value: string | undefined): string {
37
37
  if (value === undefined || value === "") {
38
38
  return "";
39
39
  }
@@ -46,7 +46,7 @@ class SecretContainer {
46
46
  return `"${escapePythonString(value)}"`;
47
47
  }
48
48
 
49
- formatSecrets(): string {
49
+ public formatSecrets(): string {
50
50
  if (Object.keys(this.secrets).length === 0) {
51
51
  return "";
52
52
  }
@@ -55,7 +55,7 @@ export class RequestingTree {
55
55
  renameFileOrFolder: EditRequests["sendRenameFileOrFolder"];
56
56
  };
57
57
 
58
- constructor(callbacks: {
58
+ public constructor(callbacks: {
59
59
  getRoots: EditRequests["getFileRoots"];
60
60
  listFiles: EditRequests["sendListFiles"];
61
61
  createFileOrFolder: EditRequests["sendCreateFileOrFolder"];
@@ -71,7 +71,7 @@ export class RequestingTree {
71
71
  private onChange: (data: FileTreeNode[]) => void = Functions.NOOP;
72
72
  private path = new PathBuilder("/");
73
73
 
74
- initialize = async (
74
+ public initialize = async (
75
75
  onChange: (data: FileTreeNode[]) => void,
76
76
  ): Promise<void> => {
77
77
  this.onChange = onChange;
@@ -102,7 +102,7 @@ export class RequestingTree {
102
102
  this.emitChange();
103
103
  };
104
104
 
105
- expand(id: string): Promise<boolean> {
105
+ public expand(id: string): Promise<boolean> {
106
106
  return this.requestDirectory(id);
107
107
  }
108
108
 
@@ -149,11 +149,11 @@ export class RequestingTree {
149
149
  }
150
150
  }
151
151
 
152
- getRoots(): readonly FileRoot[] {
152
+ public getRoots(): readonly FileRoot[] {
153
153
  return this.roots;
154
154
  }
155
155
 
156
- async reveal(node: FileTreeNode): Promise<boolean> {
156
+ public async reveal(node: FileTreeNode): Promise<boolean> {
157
157
  const relative = relativePath(node.path as FilePath, node.rootPath);
158
158
  if (relative === null) {
159
159
  return false;
@@ -190,7 +190,7 @@ export class RequestingTree {
190
190
  return true;
191
191
  }
192
192
 
193
- async copy(id: string, newName: string): Promise<void> {
193
+ public async copy(id: string, newName: string): Promise<void> {
194
194
  const node = this.getMutableNode(id);
195
195
  if (!node) {
196
196
  return;
@@ -206,7 +206,7 @@ export class RequestingTree {
206
206
  }
207
207
  }
208
208
 
209
- async rename(id: string, name: string): Promise<void> {
209
+ public async rename(id: string, name: string): Promise<void> {
210
210
  const node = this.getMutableNode(id);
211
211
  if (!node) {
212
212
  return;
@@ -222,7 +222,7 @@ export class RequestingTree {
222
222
  }
223
223
  }
224
224
 
225
- async move(fromIds: string[], parentId: string | null): Promise<void> {
225
+ public async move(fromIds: string[], parentId: string | null): Promise<void> {
226
226
  const targetParentId = parentId ?? this.getPrimaryRootId();
227
227
  const parent = this.delegate.find(targetParentId);
228
228
  if (!parent?.data.isDirectory) {
@@ -253,7 +253,7 @@ export class RequestingTree {
253
253
  await this.refreshPaths([...refreshPaths]);
254
254
  }
255
255
 
256
- async createFile({
256
+ public async createFile({
257
257
  name,
258
258
  parentId,
259
259
  type = "file",
@@ -278,7 +278,10 @@ export class RequestingTree {
278
278
  }
279
279
  }
280
280
 
281
- async createFolder(name: string, parentId: string | null): Promise<void> {
281
+ public async createFolder(
282
+ name: string,
283
+ parentId: string | null,
284
+ ): Promise<void> {
282
285
  const parent = this.getParentNode(parentId);
283
286
  if (!parent) {
284
287
  return;
@@ -295,7 +298,7 @@ export class RequestingTree {
295
298
  }
296
299
  }
297
300
 
298
- async delete(id: string): Promise<void> {
301
+ public async delete(id: string): Promise<void> {
299
302
  const node = this.getMutableNode(id);
300
303
  if (!node) {
301
304
  return;
@@ -309,7 +312,7 @@ export class RequestingTree {
309
312
  }
310
313
  }
311
314
 
312
- refreshAll = async (ids: string[]): Promise<void> => {
315
+ public refreshAll = async (ids: string[]): Promise<void> => {
313
316
  const paths = [
314
317
  ...this.roots.map((root) => root.path),
315
318
  ...ids
@@ -325,7 +328,7 @@ export class RequestingTree {
325
328
  );
326
329
  };
327
330
 
328
- refreshPath = async (path: FilePath): Promise<void> => {
331
+ public refreshPath = async (path: FilePath): Promise<void> => {
329
332
  await this.refreshPaths([path]);
330
333
  };
331
334
 
@@ -257,7 +257,7 @@ const toastPasteFailed = () => {
257
257
  class ClipboardItemBuilder {
258
258
  private items: Record<string, string | Blob> = {};
259
259
 
260
- add(mimeType: string, value: string | object) {
260
+ public add(mimeType: string, value: string | object) {
261
261
  // Skip if the browser doesn't support the mime type
262
262
  if (!ClipboardItem.supports(mimeType)) {
263
263
  Logger.warn(`ClipboardItem does not support ${mimeType}`);
@@ -275,7 +275,7 @@ class ClipboardItemBuilder {
275
275
  return this;
276
276
  }
277
277
 
278
- build() {
278
+ public build() {
279
279
  return new ClipboardItem(this.items);
280
280
  }
281
281
  }
@@ -42,7 +42,7 @@ export class TerminalBuffer {
42
42
  }
43
43
 
44
44
  /** Write a visible character at the current cursor position. */
45
- writeChar(ch: string) {
45
+ public writeChar(ch: string) {
46
46
  this.ensureLine(this.cursor.row);
47
47
  const line = this.lines[this.cursor.row];
48
48
  const padded = line.padEnd(this.cursor.col, " ");
@@ -52,7 +52,7 @@ export class TerminalBuffer {
52
52
  }
53
53
 
54
54
  /** Write a string of visible characters at the current cursor position (optimized batch write). */
55
- writeString(str: string) {
55
+ public writeString(str: string) {
56
56
  if (str.length === 0) {
57
57
  return;
58
58
  }
@@ -67,7 +67,7 @@ export class TerminalBuffer {
67
67
  }
68
68
 
69
69
  /** Handle simple control characters (\n, \r, \t, \b, \v). */
70
- control(ch: string) {
70
+ public control(ch: string) {
71
71
  switch (ch) {
72
72
  case "\n":
73
73
  this.cursor.row++;
@@ -95,7 +95,7 @@ export class TerminalBuffer {
95
95
  * Supports cursor movement and line erasing.
96
96
  * For other sequences (like color codes), preserve them by writing to the buffer.
97
97
  */
98
- handleEscape(seq: string) {
98
+ public handleEscape(seq: string) {
99
99
  const match = TerminalBuffer.ESCAPE_REGEX.exec(seq);
100
100
  if (!match) {
101
101
  // If it doesn't match the cursor movement pattern, it might be:
@@ -172,7 +172,7 @@ export class TerminalBuffer {
172
172
  }
173
173
 
174
174
  /** Return the final rendered buffer as a single string. */
175
- render(): string {
175
+ public render(): string {
176
176
  return this.lines.join("\n");
177
177
  }
178
178
  }
@@ -187,7 +187,7 @@ export class AnsiParser {
187
187
  "gu",
188
188
  );
189
189
 
190
- parse(input: string): { type: "text" | "escape"; value: string }[] {
190
+ public parse(input: string): { type: "text" | "escape"; value: string }[] {
191
191
  const tokens: { type: "text" | "escape"; value: string }[] = [];
192
192
  let lastIndex = 0;
193
193
 
@@ -221,7 +221,7 @@ export class AnsiReducer {
221
221
  * Process the entire input string (replaces any previous state).
222
222
  * Use this for one-time processing or when starting fresh.
223
223
  */
224
- reduce(input: string): string {
224
+ public reduce(input: string): string {
225
225
  this.reset();
226
226
  this.append(input);
227
227
  return this.render();
@@ -231,7 +231,7 @@ export class AnsiReducer {
231
231
  * Append new input to the existing buffer (for streaming/incremental updates).
232
232
  * This is efficient for streaming scenarios - only processes the new chunk.
233
233
  */
234
- append(input: string): void {
234
+ public append(input: string): void {
235
235
  const tokens = this.parser.parse(input);
236
236
 
237
237
  // Fast path: if only one text token (no ANSI codes), handle directly
@@ -260,14 +260,14 @@ export class AnsiReducer {
260
260
  * Reset the buffer and cursor to initial state.
261
261
  * Use this when you want to start processing fresh input.
262
262
  */
263
- reset(): void {
263
+ public reset(): void {
264
264
  this.buffer = new TerminalBuffer();
265
265
  }
266
266
 
267
267
  /**
268
268
  * Get the current rendered output without processing new input.
269
269
  */
270
- render(): string {
270
+ public render(): string {
271
271
  return this.buffer.render();
272
272
  }
273
273
 
@@ -375,7 +375,7 @@ export class StatefulOutputMessage implements OutputMessage {
375
375
  return this._data;
376
376
  }
377
377
 
378
- static create(message: StringOutputMessage): StatefulOutputMessage {
378
+ public static create(message: StringOutputMessage): StatefulOutputMessage {
379
379
  const ansiReducer = new AnsiReducer();
380
380
  ansiReducer.append(message.data);
381
381
  return new StatefulOutputMessage(
@@ -399,7 +399,7 @@ export class StatefulOutputMessage implements OutputMessage {
399
399
  this._data = this.ansiReducer.render();
400
400
  }
401
401
 
402
- appendData(chunk: string): StatefulOutputMessage {
402
+ public appendData(chunk: string): StatefulOutputMessage {
403
403
  this.ansiReducer.append(chunk);
404
404
  return new StatefulOutputMessage(
405
405
  this.mimetype,
@@ -409,7 +409,7 @@ export class StatefulOutputMessage implements OutputMessage {
409
409
  );
410
410
  }
411
411
 
412
- toJSON(): StringOutputMessage {
412
+ public toJSON(): StringOutputMessage {
413
413
  return {
414
414
  mimetype: this.mimetype,
415
415
  channel: this.channel,
@@ -46,21 +46,21 @@ beforeAll(() => {
46
46
  };
47
47
  }
48
48
  global.IntersectionObserver ??= class {
49
- observe() {
49
+ public observe() {
50
50
  /* noop */
51
51
  }
52
- unobserve() {
52
+ public unobserve() {
53
53
  /* noop */
54
54
  }
55
- disconnect() {
55
+ public disconnect() {
56
56
  /* noop */
57
57
  }
58
- takeRecords() {
58
+ public takeRecords() {
59
59
  return [];
60
60
  }
61
- root = null;
62
- rootMargin = "";
63
- thresholds = [];
61
+ public root = null;
62
+ public rootMargin = "";
63
+ public thresholds = [];
64
64
  } as unknown as typeof IntersectionObserver;
65
65
  });
66
66
 
@@ -42,28 +42,28 @@ describe("useVisibleCellIds", () => {
42
42
  mutationObserveSpy = vi.fn();
43
43
 
44
44
  global.IntersectionObserver = class MockIntersectionObserver {
45
- constructor(
45
+ public constructor(
46
46
  callback: IntersectionObserverCallback,
47
47
  _options?: IntersectionObserverInit,
48
48
  ) {
49
49
  intersectionCallback = callback;
50
50
  }
51
- observe = observeSpy;
52
- unobserve = vi.fn();
53
- disconnect = intersectionDisconnectSpy;
54
- root = null;
55
- rootMargin = "";
56
- thresholds = [0];
57
- takeRecords = vi.fn(() => []);
51
+ public observe = observeSpy;
52
+ public unobserve = vi.fn();
53
+ public disconnect = intersectionDisconnectSpy;
54
+ public root = null;
55
+ public rootMargin = "";
56
+ public thresholds = [0];
57
+ public takeRecords = vi.fn(() => []);
58
58
  } as unknown as typeof IntersectionObserver;
59
59
 
60
60
  global.MutationObserver = class MockMutationObserver {
61
- constructor(callback: MutationCallback) {
61
+ public constructor(callback: MutationCallback) {
62
62
  mutationCallback = callback;
63
63
  }
64
- observe = mutationObserveSpy;
65
- disconnect = mutationDisconnectSpy;
66
- takeRecords = vi.fn(() => []);
64
+ public observe = mutationObserveSpy;
65
+ public disconnect = mutationDisconnectSpy;
66
+ public takeRecords = vi.fn(() => []);
67
67
  } as unknown as typeof MutationObserver;
68
68
  });
69
69