@marimo-team/frontend 0.25.1-dev27 → 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.
- package/package.json +1 -1
- package/src/__mocks__/common.ts +3 -3
- package/src/__tests__/CellStatus.test.tsx +1 -1
- package/src/__tests__/setup.ts +7 -7
- package/src/components/data-table/column-summary/chart-spec-model.tsx +4 -4
- package/src/components/dependency-graph/elements.ts +2 -2
- package/src/components/editor/ai/staged-cell-submission.ts +2 -2
- package/src/components/editor/ai/transport/chat-transport.tsx +1 -1
- package/src/components/editor/connections/database/as-code.ts +44 -44
- package/src/components/editor/connections/storage/as-code.ts +3 -3
- package/src/components/editor/file-tree/requesting-tree.tsx +16 -13
- package/src/components/editor/navigation/clipboard.ts +2 -2
- package/src/components/editor/output/ansi-reduce.ts +13 -13
- package/src/components/slides/__tests__/minimap-actions.test.tsx +7 -7
- package/src/components/slides/__tests__/minimap.test.ts +12 -12
- package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +8 -8
- package/src/core/ai/context/__tests__/registry.test.ts +31 -28
- package/src/core/ai/context/providers/cell-output.ts +8 -8
- package/src/core/ai/context/providers/datasource.ts +10 -7
- package/src/core/ai/context/providers/error.ts +7 -7
- package/src/core/ai/context/providers/file.ts +8 -8
- package/src/core/ai/context/providers/tables.ts +7 -7
- package/src/core/ai/context/providers/variable.ts +7 -7
- package/src/core/ai/context/registry.ts +18 -18
- package/src/core/ai/ids/ids.ts +5 -5
- package/src/core/ai/model-registry.ts +12 -9
- package/src/core/ai/staged-cells.ts +6 -6
- package/src/core/ai/tools/base.ts +6 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +6 -6
- package/src/core/ai/tools/registry.ts +4 -4
- package/src/core/ai/tools/run-cells-tool.ts +7 -7
- package/src/core/ai/tools/sample-tool.ts +6 -6
- package/src/core/codemirror/cells/debugger-decorations.ts +13 -7
- package/src/core/codemirror/cells/line-timing-decorations.ts +9 -9
- package/src/core/codemirror/cells/traceback-decorations.ts +7 -4
- package/src/core/codemirror/code-lens/extension.ts +13 -13
- package/src/core/codemirror/copilot/__tests__/language-server.test.ts +6 -6
- package/src/core/codemirror/copilot/__tests__/transport.test.ts +12 -12
- package/src/core/codemirror/copilot/language-server.ts +13 -13
- package/src/core/codemirror/copilot/transport.ts +1 -1
- package/src/core/codemirror/find-replace/search-highlight.ts +5 -5
- package/src/core/codemirror/go-to-definition/underline.ts +3 -3
- package/src/core/codemirror/keymaps/vim.ts +3 -3
- package/src/core/codemirror/language/languages/markdown.ts +8 -8
- package/src/core/codemirror/language/languages/python.ts +7 -7
- package/src/core/codemirror/language/languages/sql/completion-builder.ts +5 -5
- package/src/core/codemirror/language/languages/sql/completion-store.ts +4 -4
- package/src/core/codemirror/language/languages/sql/sql.ts +21 -21
- package/src/core/codemirror/lsp/__tests__/transports.test.ts +10 -10
- package/src/core/codemirror/lsp/federated-lsp.ts +29 -27
- package/src/core/codemirror/lsp/notebook-lsp.ts +21 -21
- package/src/core/codemirror/misc/__tests__/dnd.test.ts +10 -10
- package/src/core/codemirror/misc/__tests__/paste.test.ts +7 -4
- package/src/core/codemirror/reactive-references/extension.ts +3 -3
- package/src/core/codemirror/rtc/loro/awareness.ts +12 -12
- package/src/core/codemirror/rtc/loro/sync.ts +5 -5
- package/src/core/codemirror/vim/cursor-visibility.ts +3 -3
- package/src/core/dom/ui-element.ts +5 -5
- package/src/core/dom/uiregistry.ts +10 -10
- package/src/core/hotkeys/hotkeys.ts +9 -9
- package/src/core/islands/__tests__/bridge.test.ts +4 -4
- package/src/core/islands/__tests__/test-utils.tsx +4 -4
- package/src/core/islands/bridge.ts +85 -82
- package/src/core/islands/components/web-components.tsx +7 -7
- package/src/core/islands/worker/__tests__/controller.test.ts +1 -1
- package/src/core/islands/worker/controller.ts +6 -3
- package/src/core/islands/worker-factory.ts +2 -2
- package/src/core/kernel/RuntimeState.ts +4 -4
- package/src/core/lsp/__tests__/transport.test.ts +19 -19
- package/src/core/lsp/transport.ts +5 -5
- package/src/core/network/CachingRequestRegistry.ts +2 -2
- package/src/core/network/DeferredRequestRegistry.ts +4 -4
- package/src/core/runtime/runtime.ts +25 -20
- package/src/core/static/virtual-file-tracker.ts +5 -5
- package/src/core/wasm/__tests__/bridge.test.ts +2 -2
- package/src/core/wasm/bridge.ts +130 -126
- package/src/core/wasm/router.ts +5 -5
- package/src/core/wasm/store.ts +4 -4
- package/src/core/wasm/worker/bootstrap.ts +8 -5
- package/src/core/wasm/worker/message-buffer.ts +3 -3
- package/src/core/websocket/transports/__tests__/ws.test.ts +8 -8
- package/src/core/websocket/transports/basic.ts +15 -8
- package/src/core/websocket/transports/sse.ts +7 -7
- package/src/core/websocket/transports/transport.ts +3 -3
- package/src/core/websocket/transports/ws.ts +9 -7
- package/src/hooks/__tests__/useOverflowDetection.test.tsx +5 -5
- package/src/hooks/__tests__/useResizeObserver.test.tsx +12 -12
- package/src/plugins/core/registerReactComponent.tsx +5 -5
- package/src/plugins/core/sidebar-element.tsx +2 -2
- package/src/plugins/impl/ButtonPlugin.tsx +3 -3
- package/src/plugins/impl/CheckboxPlugin.tsx +3 -3
- package/src/plugins/impl/CodeEditorPlugin.tsx +3 -3
- package/src/plugins/impl/DatePickerPlugin.tsx +3 -3
- package/src/plugins/impl/DateRangePlugin.tsx +3 -3
- package/src/plugins/impl/DateTimePickerPlugin.tsx +3 -3
- package/src/plugins/impl/DictPlugin.tsx +3 -3
- package/src/plugins/impl/DropdownPlugin.tsx +3 -3
- package/src/plugins/impl/FileUploadPlugin.tsx +3 -3
- package/src/plugins/impl/MatrixPlugin.tsx +4 -4
- package/src/plugins/impl/MicrophonePlugin.tsx +3 -3
- package/src/plugins/impl/MultiselectPlugin.tsx +3 -3
- package/src/plugins/impl/NumberPlugin.tsx +3 -3
- package/src/plugins/impl/RadioPlugin.tsx +3 -3
- package/src/plugins/impl/RangeSliderPlugin.tsx +3 -3
- package/src/plugins/impl/RefreshPlugin.tsx +3 -3
- package/src/plugins/impl/SliderPlugin.tsx +3 -3
- package/src/plugins/impl/SwitchPlugin.tsx +3 -3
- package/src/plugins/impl/TabsPlugin.tsx +3 -3
- package/src/plugins/impl/TextAreaPlugin.tsx +3 -3
- package/src/plugins/impl/TextInputPlugin.tsx +3 -3
- package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +2 -2
- package/src/plugins/impl/anywidget/model.ts +10 -10
- package/src/plugins/impl/anywidget/registry.ts +12 -9
- package/src/plugins/impl/anywidget/runtime.ts +11 -9
- package/src/plugins/impl/anywidget/widget-binding.ts +6 -6
- package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +3 -3
- package/src/plugins/impl/matplotlib/__tests__/matplotlib-renderer.test.ts +2 -2
- package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +2 -2
- package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +10 -10
- package/src/plugins/impl/panel/utils.ts +5 -5
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +3 -3
- package/src/plugins/impl/vega/VegaPlugin.tsx +3 -3
- package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +7 -7
- package/src/plugins/layout/AccordionPlugin.tsx +3 -3
- package/src/plugins/layout/CalloutPlugin.tsx +3 -3
- package/src/plugins/layout/ImageComparisonPlugin.tsx +5 -3
- package/src/plugins/layout/JsonOutputPlugin.tsx +3 -3
- package/src/plugins/layout/MimeRenderPlugin.tsx +3 -3
- package/src/plugins/layout/NavigationMenuPlugin.tsx +3 -3
- package/src/plugins/layout/OutlinePlugin.tsx +3 -3
- package/src/plugins/layout/ProgressPlugin.tsx +3 -3
- package/src/plugins/layout/RoutesPlugin.tsx +3 -3
- package/src/plugins/layout/StatPlugin.tsx +3 -3
- package/src/plugins/layout/TexPlugin.tsx +3 -3
- package/src/plugins/layout/carousel/CarouselPlugin.tsx +4 -4
- package/src/plugins/layout/mermaid/MermaidPlugin.tsx +3 -3
- package/src/utils/Deferred.ts +6 -6
- package/src/utils/async-capture-tracker.ts +10 -7
- package/src/utils/errors.ts +5 -5
- package/src/utils/id-tree.tsx +83 -80
- package/src/utils/lru.ts +1 -1
- package/src/utils/multi-map.ts +14 -12
- package/src/utils/paths.ts +6 -6
- package/src/utils/pluralize.ts +3 -3
- package/src/utils/progress.ts +6 -6
- package/src/utils/python-poet/poet.ts +14 -14
- package/src/utils/routes.ts +4 -2
- package/src/utils/semaphore.ts +6 -6
- package/src/utils/storage/storage.ts +6 -6
- package/src/utils/storage/typed.ts +16 -12
- package/src/utils/time.ts +9 -9
- package/src/utils/timed-cache.ts +4 -4
- package/src/utils/tracer.ts +9 -6
|
@@ -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
|
|
|
@@ -76,12 +76,12 @@ describe("SlideScrollContainer", () => {
|
|
|
76
76
|
vi.stubGlobal(
|
|
77
77
|
"ResizeObserver",
|
|
78
78
|
class MockResizeObserver {
|
|
79
|
-
callback: ResizeObserverCallback;
|
|
80
|
-
observe = vi.fn();
|
|
81
|
-
unobserve = vi.fn();
|
|
82
|
-
disconnect = vi.fn();
|
|
79
|
+
public callback: ResizeObserverCallback;
|
|
80
|
+
public observe = vi.fn();
|
|
81
|
+
public unobserve = vi.fn();
|
|
82
|
+
public disconnect = vi.fn();
|
|
83
83
|
|
|
84
|
-
constructor(callback: ResizeObserverCallback) {
|
|
84
|
+
public constructor(callback: ResizeObserverCallback) {
|
|
85
85
|
this.callback = callback;
|
|
86
86
|
resizeObservers.push(this);
|
|
87
87
|
}
|
|
@@ -90,9 +90,9 @@ describe("SlideScrollContainer", () => {
|
|
|
90
90
|
vi.stubGlobal(
|
|
91
91
|
"MutationObserver",
|
|
92
92
|
class MockMutationObserver {
|
|
93
|
-
observe = vi.fn();
|
|
94
|
-
disconnect = vi.fn();
|
|
95
|
-
takeRecords = vi.fn(() => []);
|
|
93
|
+
public observe = vi.fn();
|
|
94
|
+
public disconnect = vi.fn();
|
|
95
|
+
public takeRecords = vi.fn(() => []);
|
|
96
96
|
},
|
|
97
97
|
);
|
|
98
98
|
});
|
|
@@ -44,9 +44,9 @@ const mockAttachment2: FileUIPart = {
|
|
|
44
44
|
|
|
45
45
|
// Concrete implementation of AIContextProvider for testing
|
|
46
46
|
class MockContextProvider extends AIContextProvider<MockContextItem> {
|
|
47
|
-
readonly title = "Mock Items";
|
|
48
|
-
readonly mentionPrefix = "@";
|
|
49
|
-
readonly contextType = "mock";
|
|
47
|
+
public readonly title = "Mock Items";
|
|
48
|
+
public readonly mentionPrefix = "@";
|
|
49
|
+
public readonly contextType = "mock";
|
|
50
50
|
|
|
51
51
|
private items: MockContextItem[] = [
|
|
52
52
|
{
|
|
@@ -72,57 +72,60 @@ class MockContextProvider extends AIContextProvider<MockContextItem> {
|
|
|
72
72
|
},
|
|
73
73
|
];
|
|
74
74
|
|
|
75
|
-
getItems(): MockContextItem[] {
|
|
75
|
+
public getItems(): MockContextItem[] {
|
|
76
76
|
return this.items;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
formatContext(item: MockContextItem): string {
|
|
79
|
+
public formatContext(item: MockContextItem): string {
|
|
80
80
|
return `Mock: ${item.name} (${item.data.value})`;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
formatCompletion(item: MockContextItem): Completion {
|
|
83
|
+
public formatCompletion(item: MockContextItem): Completion {
|
|
84
84
|
return this.createBasicCompletion(item);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// Method to add items for testing
|
|
88
|
-
addItem(item: MockContextItem): void {
|
|
88
|
+
public addItem(item: MockContextItem): void {
|
|
89
89
|
this.items.push(item);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
// Method to clear items for testing
|
|
93
|
-
clearItems(): void {
|
|
93
|
+
public clearItems(): void {
|
|
94
94
|
this.items = [];
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
// Test provider that supports attachments
|
|
99
99
|
class AttachmentContextProvider extends AIContextProvider<MockContextItem> {
|
|
100
|
-
readonly title = "Attachment Items";
|
|
101
|
-
readonly mentionPrefix = "@";
|
|
102
|
-
readonly contextType = "attachment";
|
|
100
|
+
public readonly title = "Attachment Items";
|
|
101
|
+
public readonly mentionPrefix = "@";
|
|
102
|
+
public readonly contextType = "attachment";
|
|
103
103
|
|
|
104
104
|
private items: MockContextItem[];
|
|
105
105
|
private attachments: FileUIPart[];
|
|
106
106
|
|
|
107
|
-
constructor(
|
|
107
|
+
public constructor(
|
|
108
|
+
items: MockContextItem[] = [],
|
|
109
|
+
attachments: FileUIPart[] = [],
|
|
110
|
+
) {
|
|
108
111
|
super();
|
|
109
112
|
this.items = items;
|
|
110
113
|
this.attachments = attachments;
|
|
111
114
|
}
|
|
112
115
|
|
|
113
|
-
getItems(): MockContextItem[] {
|
|
116
|
+
public getItems(): MockContextItem[] {
|
|
114
117
|
return this.items;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
|
-
formatContext(item: MockContextItem): string {
|
|
120
|
+
public formatContext(item: MockContextItem): string {
|
|
118
121
|
return `Attachment: ${item.name} (${item.data.value})`;
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
formatCompletion(item: MockContextItem): Completion {
|
|
124
|
+
public formatCompletion(item: MockContextItem): Completion {
|
|
122
125
|
return this.createBasicCompletion(item);
|
|
123
126
|
}
|
|
124
127
|
|
|
125
|
-
override async getAttachments(
|
|
128
|
+
public override async getAttachments(
|
|
126
129
|
items: MockContextItem[],
|
|
127
130
|
): Promise<FileUIPart[]> {
|
|
128
131
|
// Return attachments for items that need them
|
|
@@ -142,9 +145,9 @@ interface FileContextItem extends AIContextItem {
|
|
|
142
145
|
|
|
143
146
|
// Another mock provider with different prefix and type
|
|
144
147
|
class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
145
|
-
readonly title = "Files";
|
|
146
|
-
readonly mentionPrefix = "@";
|
|
147
|
-
readonly contextType = "file";
|
|
148
|
+
public readonly title = "Files";
|
|
149
|
+
public readonly mentionPrefix = "@";
|
|
150
|
+
public readonly contextType = "file";
|
|
148
151
|
|
|
149
152
|
private items: FileContextItem[] = [
|
|
150
153
|
{
|
|
@@ -163,26 +166,26 @@ class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
|
163
166
|
},
|
|
164
167
|
];
|
|
165
168
|
|
|
166
|
-
getItems(): FileContextItem[] {
|
|
169
|
+
public getItems(): FileContextItem[] {
|
|
167
170
|
return this.items;
|
|
168
171
|
}
|
|
169
172
|
|
|
170
|
-
formatCompletion(item: FileContextItem): Completion {
|
|
173
|
+
public formatCompletion(item: FileContextItem): Completion {
|
|
171
174
|
return this.createBasicCompletion(item);
|
|
172
175
|
}
|
|
173
176
|
|
|
174
|
-
formatContext(item: FileContextItem): string {
|
|
177
|
+
public formatContext(item: FileContextItem): string {
|
|
175
178
|
return `File: ${item.uri}\nDescription: ${item.description}`;
|
|
176
179
|
}
|
|
177
180
|
}
|
|
178
181
|
|
|
179
182
|
// Second mock provider with the same context type as MockContextProvider
|
|
180
183
|
class SecondaryMockProvider extends AIContextProvider<MockContextItem> {
|
|
181
|
-
readonly title = "Secondary Mock Items";
|
|
182
|
-
readonly mentionPrefix = "@";
|
|
183
|
-
readonly contextType = "mock";
|
|
184
|
+
public readonly title = "Secondary Mock Items";
|
|
185
|
+
public readonly mentionPrefix = "@";
|
|
186
|
+
public readonly contextType = "mock";
|
|
184
187
|
|
|
185
|
-
getItems(): MockContextItem[] {
|
|
188
|
+
public getItems(): MockContextItem[] {
|
|
186
189
|
return [
|
|
187
190
|
{
|
|
188
191
|
type: "mock",
|
|
@@ -194,11 +197,11 @@ class SecondaryMockProvider extends AIContextProvider<MockContextItem> {
|
|
|
194
197
|
];
|
|
195
198
|
}
|
|
196
199
|
|
|
197
|
-
formatContext(item: MockContextItem): string {
|
|
200
|
+
public formatContext(item: MockContextItem): string {
|
|
198
201
|
return `Secondary: ${item.name}`;
|
|
199
202
|
}
|
|
200
203
|
|
|
201
|
-
formatCompletion(item: MockContextItem): Completion {
|
|
204
|
+
public formatCompletion(item: MockContextItem): Completion {
|
|
202
205
|
return this.createBasicCompletion(item);
|
|
203
206
|
}
|
|
204
207
|
}
|
|
@@ -80,16 +80,16 @@ function isMediaMimetype(
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
export class CellOutputContextProvider extends AIContextProvider<CellOutputContextItem> {
|
|
83
|
-
readonly title = "Cell Outputs";
|
|
84
|
-
readonly mentionPrefix = "@";
|
|
85
|
-
readonly contextType = "cell-output";
|
|
83
|
+
public readonly title = "Cell Outputs";
|
|
84
|
+
public readonly mentionPrefix = "@";
|
|
85
|
+
public readonly contextType = "cell-output";
|
|
86
86
|
private store: JotaiStore;
|
|
87
|
-
constructor(store: JotaiStore) {
|
|
87
|
+
public constructor(store: JotaiStore) {
|
|
88
88
|
super();
|
|
89
89
|
this.store = store;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
getItems(): CellOutputContextItem[] {
|
|
92
|
+
public getItems(): CellOutputContextItem[] {
|
|
93
93
|
const notebook = this.store.get(notebookAtom);
|
|
94
94
|
const items: CellOutputContextItem[] = [];
|
|
95
95
|
|
|
@@ -116,7 +116,7 @@ export class CellOutputContextProvider extends AIContextProvider<CellOutputConte
|
|
|
116
116
|
return items;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
formatCompletion(item: CellOutputContextItem): Completion {
|
|
119
|
+
public formatCompletion(item: CellOutputContextItem): Completion {
|
|
120
120
|
const { cellOutput: data, cellName, cellCode } = item.data;
|
|
121
121
|
|
|
122
122
|
return {
|
|
@@ -224,7 +224,7 @@ export class CellOutputContextProvider extends AIContextProvider<CellOutputConte
|
|
|
224
224
|
};
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
formatContext(item: CellOutputContextItem): string {
|
|
227
|
+
public formatContext(item: CellOutputContextItem): string {
|
|
228
228
|
const { cellOutput: data, cellName, cellId, cellCode } = item.data;
|
|
229
229
|
|
|
230
230
|
const contextData = {
|
|
@@ -253,7 +253,7 @@ export class CellOutputContextProvider extends AIContextProvider<CellOutputConte
|
|
|
253
253
|
}
|
|
254
254
|
|
|
255
255
|
/** Get attachments for cell output items that have shouldDownloadImage=true */
|
|
256
|
-
override async getAttachments(
|
|
256
|
+
public override async getAttachments(
|
|
257
257
|
items: CellOutputContextItem[],
|
|
258
258
|
): Promise<FileUIPart[]> {
|
|
259
259
|
const cellId = items[0].data.cellId;
|
|
@@ -46,13 +46,16 @@ export interface DatasourceContextItem extends AIContextItem {
|
|
|
46
46
|
const CONTEXT_TYPE = "datasource";
|
|
47
47
|
|
|
48
48
|
export class DatasourceContextProvider extends AIContextProvider<DatasourceContextItem> {
|
|
49
|
-
readonly title = "Datasource";
|
|
50
|
-
readonly mentionPrefix = "@";
|
|
51
|
-
readonly contextType = CONTEXT_TYPE;
|
|
49
|
+
public readonly title = "Datasource";
|
|
50
|
+
public readonly mentionPrefix = "@";
|
|
51
|
+
public readonly contextType = CONTEXT_TYPE;
|
|
52
52
|
private connectionsMap: ConnectionsMap;
|
|
53
53
|
private dataframes: DataTable[];
|
|
54
54
|
|
|
55
|
-
constructor(
|
|
55
|
+
public constructor(
|
|
56
|
+
connectionsMap: ConnectionsMap,
|
|
57
|
+
tablesMap: DatasetTablesMap,
|
|
58
|
+
) {
|
|
56
59
|
super();
|
|
57
60
|
this.connectionsMap = connectionsMap;
|
|
58
61
|
this.dataframes = [...tablesMap.values()].filter(
|
|
@@ -60,7 +63,7 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
60
63
|
);
|
|
61
64
|
}
|
|
62
65
|
|
|
63
|
-
getItems(): DatasourceContextItem[] {
|
|
66
|
+
public getItems(): DatasourceContextItem[] {
|
|
64
67
|
return [...this.connectionsMap.values()]
|
|
65
68
|
.map((connection): DatasourceContextItem | null => {
|
|
66
69
|
let description = "Database schema.";
|
|
@@ -92,7 +95,7 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
92
95
|
.filter(Boolean);
|
|
93
96
|
}
|
|
94
97
|
|
|
95
|
-
formatContext(item: DatasourceContextItem): string {
|
|
98
|
+
public formatContext(item: DatasourceContextItem): string {
|
|
96
99
|
const data = item.data;
|
|
97
100
|
// Remove certain fields that are not needed in the context
|
|
98
101
|
const { name, display_name, source, ...filteredDatasource } =
|
|
@@ -117,7 +120,7 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
117
120
|
});
|
|
118
121
|
}
|
|
119
122
|
|
|
120
|
-
formatCompletion(item: DatasourceContextItem): Completion {
|
|
123
|
+
public formatCompletion(item: DatasourceContextItem): Completion {
|
|
121
124
|
const datasource = item.data;
|
|
122
125
|
|
|
123
126
|
const dataConnection = datasource.connection;
|
|
@@ -95,17 +95,17 @@ function errorContextName(entry: CellErrorEntry): string {
|
|
|
95
95
|
|
|
96
96
|
const errorsTxt = new PluralWord("error", "errors");
|
|
97
97
|
export class ErrorContextProvider extends AIContextProvider<ErrorContextItem> {
|
|
98
|
-
readonly title = "Errors";
|
|
99
|
-
readonly mentionPrefix = "@";
|
|
100
|
-
readonly contextType = "error";
|
|
98
|
+
public readonly title = "Errors";
|
|
99
|
+
public readonly mentionPrefix = "@";
|
|
100
|
+
public readonly contextType = "error";
|
|
101
101
|
private store: JotaiStore;
|
|
102
102
|
|
|
103
|
-
constructor(store: JotaiStore) {
|
|
103
|
+
public constructor(store: JotaiStore) {
|
|
104
104
|
super();
|
|
105
105
|
this.store = store;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
getItems(): ErrorContextItem[] {
|
|
108
|
+
public getItems(): ErrorContextItem[] {
|
|
109
109
|
const errors = getCellErrorEntries(this.store);
|
|
110
110
|
|
|
111
111
|
if (errors.length === 0) {
|
|
@@ -141,7 +141,7 @@ export class ErrorContextProvider extends AIContextProvider<ErrorContextItem> {
|
|
|
141
141
|
return items;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
formatCompletion(item: ErrorContextItem): Completion {
|
|
144
|
+
public formatCompletion(item: ErrorContextItem): Completion {
|
|
145
145
|
if (item.data.type === "all-errors") {
|
|
146
146
|
const errorCount = item.data.errors.length;
|
|
147
147
|
return {
|
|
@@ -201,7 +201,7 @@ export class ErrorContextProvider extends AIContextProvider<ErrorContextItem> {
|
|
|
201
201
|
};
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
formatContext(item: ErrorContextItem): string {
|
|
204
|
+
public formatContext(item: ErrorContextItem): string {
|
|
205
205
|
const entries =
|
|
206
206
|
item.data.type === "all-errors" ? item.data.errors : [item.data.error];
|
|
207
207
|
|
|
@@ -38,14 +38,14 @@ const DEFAULT_FILE_SEARCH_CONFIG: FileSearchConfig = {
|
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
export class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
41
|
-
readonly title = "Files";
|
|
42
|
-
readonly mentionPrefix = "#";
|
|
43
|
-
readonly contextType = "file";
|
|
41
|
+
public readonly title = "Files";
|
|
42
|
+
public readonly mentionPrefix = "#";
|
|
43
|
+
public readonly contextType = "file";
|
|
44
44
|
|
|
45
45
|
private apiRequests: EditRequests & RunRequests;
|
|
46
46
|
private config: FileSearchConfig;
|
|
47
47
|
|
|
48
|
-
constructor(
|
|
48
|
+
public constructor(
|
|
49
49
|
apiRequests: EditRequests & RunRequests,
|
|
50
50
|
config: FileSearchConfig = DEFAULT_FILE_SEARCH_CONFIG,
|
|
51
51
|
) {
|
|
@@ -58,7 +58,7 @@ export class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
|
58
58
|
* Create a dynamic completion source for file mentions
|
|
59
59
|
* This bypasses the standard registry system to enable dynamic searching
|
|
60
60
|
*/
|
|
61
|
-
createCompletionSource(): CompletionSource {
|
|
61
|
+
public createCompletionSource(): CompletionSource {
|
|
62
62
|
return async (
|
|
63
63
|
context: CompletionContext,
|
|
64
64
|
): Promise<CompletionResult | null> => {
|
|
@@ -176,13 +176,13 @@ export class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
getItems(): FileContextItem[] {
|
|
179
|
+
public getItems(): FileContextItem[] {
|
|
180
180
|
// Files are fetched dynamically, so return empty array
|
|
181
181
|
// This provider relies on dynamic fetching via createCompletionSource()
|
|
182
182
|
return [];
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
formatCompletion(item: FileContextItem): Completion {
|
|
185
|
+
public formatCompletion(item: FileContextItem): Completion {
|
|
186
186
|
const { data, name } = item;
|
|
187
187
|
const icon = data.isDirectory ? "📁" : "📄";
|
|
188
188
|
|
|
@@ -254,7 +254,7 @@ export class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
|
254
254
|
};
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
-
formatContext(item: FileContextItem): string {
|
|
257
|
+
public formatContext(item: FileContextItem): string {
|
|
258
258
|
const { data, name } = item;
|
|
259
259
|
return contextToXml({
|
|
260
260
|
type: this.contextType,
|
|
@@ -17,16 +17,16 @@ export interface TableContextItem extends AIContextItem {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export class TableContextProvider extends AIContextProvider<TableContextItem> {
|
|
20
|
-
readonly title = "Tables";
|
|
21
|
-
readonly mentionPrefix = "@";
|
|
22
|
-
readonly contextType = "data";
|
|
20
|
+
public readonly title = "Tables";
|
|
21
|
+
public readonly mentionPrefix = "@";
|
|
22
|
+
public readonly contextType = "data";
|
|
23
23
|
private tablesMap: DatasetTablesMap;
|
|
24
|
-
constructor(tablesMap: DatasetTablesMap) {
|
|
24
|
+
public constructor(tablesMap: DatasetTablesMap) {
|
|
25
25
|
super();
|
|
26
26
|
this.tablesMap = tablesMap;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
getItems(): TableContextItem[] {
|
|
29
|
+
public getItems(): TableContextItem[] {
|
|
30
30
|
return [...this.tablesMap.entries()].map(([tableName, table]) => ({
|
|
31
31
|
uri: this.asURI(tableName),
|
|
32
32
|
name: tableName,
|
|
@@ -36,7 +36,7 @@ export class TableContextProvider extends AIContextProvider<TableContextItem> {
|
|
|
36
36
|
}));
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
formatContext(item: TableContextItem): string {
|
|
39
|
+
public formatContext(item: TableContextItem): string {
|
|
40
40
|
const { data } = item;
|
|
41
41
|
const { columns, source, num_rows, num_columns, name, variable_name } =
|
|
42
42
|
data;
|
|
@@ -90,7 +90,7 @@ export class TableContextProvider extends AIContextProvider<TableContextItem> {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
formatCompletion(item: TableContextItem): Completion {
|
|
93
|
+
public formatCompletion(item: TableContextItem): Completion {
|
|
94
94
|
const tableName = item.data.name;
|
|
95
95
|
const table = item.data;
|
|
96
96
|
return {
|
|
@@ -16,20 +16,20 @@ export interface VariableContextItem extends AIContextItem {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export class VariableContextProvider extends AIContextProvider<VariableContextItem> {
|
|
19
|
-
readonly title = "Variables";
|
|
20
|
-
readonly mentionPrefix = "@";
|
|
21
|
-
readonly contextType = "variable";
|
|
19
|
+
public readonly title = "Variables";
|
|
20
|
+
public readonly mentionPrefix = "@";
|
|
21
|
+
public readonly contextType = "variable";
|
|
22
22
|
|
|
23
23
|
private variables: Variables;
|
|
24
24
|
private tablesMap: DatasetTablesMap;
|
|
25
25
|
|
|
26
|
-
constructor(variables: Variables, tablesMap: DatasetTablesMap) {
|
|
26
|
+
public constructor(variables: Variables, tablesMap: DatasetTablesMap) {
|
|
27
27
|
super();
|
|
28
28
|
this.variables = variables;
|
|
29
29
|
this.tablesMap = tablesMap;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
getItems(): VariableContextItem[] {
|
|
32
|
+
public getItems(): VariableContextItem[] {
|
|
33
33
|
const ignore = new Set(this.tablesMap.keys());
|
|
34
34
|
|
|
35
35
|
return Object.entries(this.variables).flatMap(([name, variable]) => {
|
|
@@ -51,7 +51,7 @@ export class VariableContextProvider extends AIContextProvider<VariableContextIt
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
formatCompletion(item: VariableContextItem): Completion {
|
|
54
|
+
public formatCompletion(item: VariableContextItem): Completion {
|
|
55
55
|
const { data } = item;
|
|
56
56
|
const { variable } = data;
|
|
57
57
|
return {
|
|
@@ -66,7 +66,7 @@ export class VariableContextProvider extends AIContextProvider<VariableContextIt
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
formatContext(item: VariableContextItem): string {
|
|
69
|
+
public formatContext(item: VariableContextItem): string {
|
|
70
70
|
const { data } = item;
|
|
71
71
|
const { variable } = data;
|
|
72
72
|
return contextToXml({
|