@oceanum/oceanumlab 4.6.0

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 (83) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +116 -0
  3. package/lib/DatameshUI.d.ts +5 -0
  4. package/lib/DatameshUI.js +8 -0
  5. package/lib/DatameshUI.js.map +1 -0
  6. package/lib/DatameshWidget.d.ts +59 -0
  7. package/lib/DatameshWidget.js +573 -0
  8. package/lib/DatameshWidget.js.map +1 -0
  9. package/lib/DatasourceItem.d.ts +12 -0
  10. package/lib/DatasourceItem.js +47 -0
  11. package/lib/DatasourceItem.js.map +1 -0
  12. package/lib/aiLoop.d.ts +60 -0
  13. package/lib/aiLoop.js +85 -0
  14. package/lib/aiLoop.js.map +1 -0
  15. package/lib/chatRouter.d.ts +64 -0
  16. package/lib/chatRouter.js +225 -0
  17. package/lib/chatRouter.js.map +1 -0
  18. package/lib/constants.d.ts +14 -0
  19. package/lib/constants.js +15 -0
  20. package/lib/constants.js.map +1 -0
  21. package/lib/conversationPin.d.ts +68 -0
  22. package/lib/conversationPin.js +120 -0
  23. package/lib/conversationPin.js.map +1 -0
  24. package/lib/handler.d.ts +8 -0
  25. package/lib/handler.js +36 -0
  26. package/lib/handler.js.map +1 -0
  27. package/lib/index.d.ts +16 -0
  28. package/lib/index.js +273 -0
  29. package/lib/index.js.map +1 -0
  30. package/lib/kernelHandoff.d.ts +61 -0
  31. package/lib/kernelHandoff.js +236 -0
  32. package/lib/kernelHandoff.js.map +1 -0
  33. package/lib/notebookContext.d.ts +48 -0
  34. package/lib/notebookContext.js +118 -0
  35. package/lib/notebookContext.js.map +1 -0
  36. package/lib/notebookHost.d.ts +6 -0
  37. package/lib/notebookHost.js +72 -0
  38. package/lib/notebookHost.js.map +1 -0
  39. package/lib/notebookRun.d.ts +37 -0
  40. package/lib/notebookRun.js +70 -0
  41. package/lib/notebookRun.js.map +1 -0
  42. package/lib/progress.d.ts +43 -0
  43. package/lib/progress.js +103 -0
  44. package/lib/progress.js.map +1 -0
  45. package/lib/sse.d.ts +26 -0
  46. package/lib/sse.js +112 -0
  47. package/lib/sse.js.map +1 -0
  48. package/package.json +151 -0
  49. package/schema/datamesh-connect.json +35 -0
  50. package/src/DatameshUI.tsx +15 -0
  51. package/src/DatameshWidget.tsx +909 -0
  52. package/src/DatasourceItem.tsx +124 -0
  53. package/src/__tests__/aiLoop.spec.ts +304 -0
  54. package/src/__tests__/chatRouter.spec.ts +315 -0
  55. package/src/__tests__/conversationPin.spec.ts +236 -0
  56. package/src/__tests__/kernelHandoff.spec.ts +106 -0
  57. package/src/__tests__/notebookContext.spec.ts +97 -0
  58. package/src/__tests__/notebookHost.spec.ts +195 -0
  59. package/src/__tests__/notebookRun.spec.ts +95 -0
  60. package/src/__tests__/notebookSnapshot.spec.ts +62 -0
  61. package/src/__tests__/oceanumlab.spec.ts +9 -0
  62. package/src/__tests__/sse.spec.ts +304 -0
  63. package/src/aiLoop.ts +140 -0
  64. package/src/chatRouter.ts +329 -0
  65. package/src/constants.ts +16 -0
  66. package/src/conversationPin.ts +148 -0
  67. package/src/global.d.ts +5 -0
  68. package/src/handler.ts +46 -0
  69. package/src/index.ts +327 -0
  70. package/src/kernelHandoff.ts +284 -0
  71. package/src/notebookContext.ts +144 -0
  72. package/src/notebookHost.ts +97 -0
  73. package/src/notebookRun.ts +104 -0
  74. package/src/progress.ts +121 -0
  75. package/src/sse.ts +127 -0
  76. package/src/svg.d.ts +4 -0
  77. package/style/base.css +5 -0
  78. package/style/icons/oceanum-dark.svg +1 -0
  79. package/style/icons/oceanum-light.svg +1 -0
  80. package/style/icons/oceanum.png +0 -0
  81. package/style/icons/oceanum.svg +1 -0
  82. package/style/index.css +477 -0
  83. package/style/index.js +1 -0
@@ -0,0 +1,573 @@
1
+ import { Dialog, ReactWidget, UseSignal, showDialog } from '@jupyterlab/apputils';
2
+ import { CodeCell } from '@jupyterlab/cells';
3
+ import { NotebookPanel } from '@jupyterlab/notebook';
4
+ import { CodeCellModel } from '@jupyterlab/cells';
5
+ import { addIcon } from '@jupyterlab/ui-components';
6
+ import { MimeData } from '@lumino/coreutils';
7
+ import { Drag } from '@lumino/dragdrop';
8
+ import { Signal } from '@lumino/signaling';
9
+ import React from 'react';
10
+ import { marked } from 'marked';
11
+ import { DatasourceItem } from './DatasourceItem';
12
+ import { OCEANUM_AI_BACKEND_URL } from './constants';
13
+ import { describeProgress, onProgress } from './progress';
14
+ // Configure marked for safe rendering
15
+ marked.setOptions({
16
+ breaks: true,
17
+ gfm: true
18
+ });
19
+ /**
20
+ * Renders markdown content safely using dangerouslySetInnerHTML.
21
+ */
22
+ function MarkdownContent({ content }) {
23
+ const html = React.useMemo(() => {
24
+ try {
25
+ return marked.parse(content);
26
+ }
27
+ catch (_a) {
28
+ return content;
29
+ }
30
+ }, [content]);
31
+ return (React.createElement("div", { className: "oceanum-ai-chat-content oceanum-ai-markdown", dangerouslySetInnerHTML: { __html: html } }));
32
+ }
33
+ const JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';
34
+ const DRAG_IMAGE = new Image();
35
+ DRAG_IMAGE.src =
36
+ 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iIzAwMDAwMCIgdmlld0JveD0iMCAwIDI1NiAyNTYiPjxwYXRoIGQ9Ik02OS4xMiw5NC4xNSwyOC41LDEyOGw0MC42MiwzMy44NWE4LDgsMCwxLDEtMTAuMjQsMTIuMjlsLTQ4LTQwYTgsOCwwLDAsMSwwLTEyLjI5bDQ4LTQwYTgsOCwwLDAsMSwxMC4yNCwxMi4zWm0xNzYsMjcuNy00OC00MGE4LDgsMCwxLDAtMTAuMjQsMTIuM0wyMjcuNSwxMjhsLTQwLjYyLDMzLjg1YTgsOCwwLDEsMCwxMC4yNCwxMi4yOWw0OC00MGE4LDgsMCwwLDAsMC0xMi4yOVpNMTYyLjczLDMyLjQ4YTgsOCwwLDAsMC0xMC4yNSw0Ljc5bC02NCwxNzZhOCw4LDAsMCwwLDQuNzksMTAuMjZBOC4xNCw4LjE0LDAsMCwwLDk2LDIyNGE4LDgsMCwwLDAsNy41Mi01LjI3bDY0LTE3NkE4LDgsMCwwLDAsMTYyLjczLDMyLjQ4WiI+PC9wYXRoPjwvc3ZnPg==';
37
+ const datameshToken = (notebook) => {
38
+ const datameshTokenInjected = notebook &&
39
+ notebook.widgets.find(cell => {
40
+ if (cell.editor) {
41
+ const line = cell.editor.getLine(0);
42
+ if (line && line.indexOf('DATAMESH_TOKEN=') >= 0) {
43
+ return true;
44
+ }
45
+ }
46
+ });
47
+ if (!datameshTokenInjected) {
48
+ return `DATAMESH_TOKEN='${window.datameshToken}';`;
49
+ }
50
+ else {
51
+ return '';
52
+ }
53
+ };
54
+ const datasourceCode = (datasource, notebook, icell) => {
55
+ const datameshImport = notebook &&
56
+ notebook.widgets.find(cell => {
57
+ if (cell.editor) {
58
+ let found = false;
59
+ for (let i = 0; i < icell; i++) {
60
+ const line = cell.editor.getLine(i);
61
+ if (line &&
62
+ line.indexOf('from oceanum.datamesh import Connector') >= 0) {
63
+ found = true;
64
+ break;
65
+ }
66
+ }
67
+ return found;
68
+ }
69
+ });
70
+ let datasourceStr = (datasource.label || datasource.datasource).replace(/[\s-.]/g, '_');
71
+ const tokenString = window.injectToken ? 'token=DATAMESH_TOKEN' : '';
72
+ if (datasource.variables ||
73
+ datasource.geofilter ||
74
+ datasource.timefilter ||
75
+ datasource.spatialref) {
76
+ datasourceStr += `=datamesh.query(${JSON.stringify(datasource, null, ' ').replace(/null/g, 'None')})`;
77
+ }
78
+ else {
79
+ datasourceStr += `=datamesh.load_datasource('${datasource.datasource}')`;
80
+ }
81
+ if (!datameshImport) {
82
+ datasourceStr =
83
+ 'from oceanum.datamesh import Connector' +
84
+ '\n' +
85
+ '#Put your datamesh token in the Jupyterlab settings, or as argument in the constructor below' +
86
+ '\n' +
87
+ `datamesh=Connector(${tokenString})` +
88
+ '\n' +
89
+ datasourceStr;
90
+ }
91
+ return datasourceStr;
92
+ };
93
+ class DatameshWorkspaceDisplay extends React.Component {
94
+ constructor(props) {
95
+ super(props);
96
+ this.injectToken = (notebookWidget) => {
97
+ var _a;
98
+ const notebookContent = notebookWidget.content;
99
+ const datameshTokenInject = datameshToken(notebookContent);
100
+ //const codeCell=new CodeCellModel({});
101
+ if (datameshTokenInject) {
102
+ // const tokenCell = notebookContent.contentFactory.createCodeCell({
103
+ // model: codeCell,
104
+ // rendermime: notebookContent.rendermime,
105
+ // contentFactory: notebookContent.contentFactory,
106
+ // })
107
+ // tokenCell.model.sharedModel.setSource(datameshTokenInject);
108
+ (_a = notebookContent.model) === null || _a === void 0 ? void 0 : _a.sharedModel.insertCell(0, {
109
+ cell_type: 'code',
110
+ source: datameshTokenInject,
111
+ metadata: {}
112
+ });
113
+ // CodeCell.execute(
114
+ // notebookContent.widgets[0] as CodeCell,
115
+ // notebookWidget.sessionContext
116
+ // );
117
+ }
118
+ };
119
+ // Handle code datasource insert into an editor
120
+ this.insertDatameshConnect = async (datasource) => {
121
+ const widget = this.props.getCurrentWidget();
122
+ if (widget instanceof NotebookPanel) {
123
+ const notebookWidget = widget;
124
+ const notebookContent = notebookWidget.content;
125
+ const notebookCell = notebookContent.activeCell;
126
+ const notebookCellIndex = notebookContent.activeCellIndex;
127
+ const notebookCellEditor = notebookCell.editor;
128
+ const datasourceStr = datasourceCode(datasource, notebookContent, notebookCellIndex);
129
+ if (notebookCellEditor) {
130
+ if (notebookCell instanceof CodeCell) {
131
+ this.verifyLanguageAndInsert(datasourceStr, 'python', notebookCellEditor);
132
+ }
133
+ else {
134
+ notebookCellEditor.replaceSelection(datasourceStr);
135
+ }
136
+ if (window.injectToken) {
137
+ this.injectToken(notebookWidget);
138
+ }
139
+ }
140
+ else {
141
+ this.showErrDialog('Datamesh datasource insert failed: Please select code cell');
142
+ }
143
+ }
144
+ };
145
+ // Handle language compatibility between code datasource and editor
146
+ this.verifyLanguageAndInsert = async (datasourceStr, editorLanguage, editor) => {
147
+ if (editor && editorLanguage && 'python' !== editorLanguage.toLowerCase()) {
148
+ const result = await this.showWarnDialog(editorLanguage);
149
+ if (result.button.accept) {
150
+ editor.replaceSelection(datasourceStr);
151
+ }
152
+ }
153
+ else {
154
+ // Language match or editorLanguage is unavailable
155
+ editor === null || editor === void 0 ? void 0 : editor.replaceSelection(datasourceStr);
156
+ }
157
+ };
158
+ // Display warning dialog when inserting a code datasource incompatible with editor's language
159
+ this.showWarnDialog = async (editorLanguage) => {
160
+ return showDialog({
161
+ title: 'Warning',
162
+ body: `Datamesh connector is incompatible with ${editorLanguage}. Continue?`,
163
+ buttons: [Dialog.cancelButton(), Dialog.okButton()]
164
+ });
165
+ };
166
+ // Display error dialog when inserting a code datasource into unsupported widget (i.e. not an editor)
167
+ this.showErrDialog = (errMsg) => {
168
+ return showDialog({
169
+ title: 'Error',
170
+ body: errMsg,
171
+ buttons: [Dialog.okButton()]
172
+ });
173
+ };
174
+ this._drag = null;
175
+ this._dragData = null;
176
+ this.handleDragMove = this.handleDragMove.bind(this);
177
+ this._evtMouseUp = this._evtMouseUp.bind(this);
178
+ }
179
+ render() {
180
+ return (React.createElement("div", { className: 'datamesh-workspace-display' }, this.props.spec && (React.createElement("div", null,
181
+ React.createElement("span", { className: "datamesh-workspace-name" }, this.props.spec.name),
182
+ React.createElement("hr", null),
183
+ this.props.spec.data.map(datasource => (
184
+ // Render display of a code datasource
185
+ React.createElement("div", { key: datasource.id, "data-item-id": datasource.id, className: 'datasource-item' },
186
+ React.createElement(DatasourceItem, { datasource: datasource, insertDatasource: this.insertDatameshConnect, onMouseDown: (event) => {
187
+ this.handleDragSnippet(event, datasource);
188
+ } }))))))));
189
+ }
190
+ // Initial setup to handle dragging a code datasource
191
+ handleDragSnippet(event, datasource) {
192
+ const { button } = event;
193
+ // do nothing if left mouse button is clicked
194
+ if (button !== 0) {
195
+ return;
196
+ }
197
+ this._dragData = {
198
+ pressX: event.clientX,
199
+ pressY: event.clientY,
200
+ dragImage: DRAG_IMAGE
201
+ };
202
+ const mouseUpListener = (event) => {
203
+ this._evtMouseUp(event, datasource, mouseMoveListener);
204
+ };
205
+ const mouseMoveListener = (event) => {
206
+ this.handleDragMove(event, datasource, mouseMoveListener, mouseUpListener);
207
+ };
208
+ const target = event.target;
209
+ target.addEventListener('mouseup', mouseUpListener, {
210
+ once: true,
211
+ capture: true
212
+ });
213
+ target.addEventListener('mousemove', mouseMoveListener, true);
214
+ // since a browser has its own drag'n'drop support for images and some other elements.
215
+ target.ondragstart = () => false;
216
+ }
217
+ _evtMouseUp(event, datasource, mouseMoveListener) {
218
+ event.preventDefault();
219
+ event.stopPropagation();
220
+ const target = event.target;
221
+ target.removeEventListener('mousemove', mouseMoveListener, true);
222
+ }
223
+ handleDragMove(event, datasource, mouseMoveListener, mouseUpListener) {
224
+ event.preventDefault();
225
+ event.stopPropagation();
226
+ const data = this._dragData;
227
+ if (data &&
228
+ this.shouldStartDrag(data.pressX, data.pressY, event.clientX, event.clientY)) {
229
+ // Create drag image
230
+ const element = document.createElement('div');
231
+ element.innerHTML = datasource.description;
232
+ element.classList.add('datasource-drag-image');
233
+ data.dragImage = element;
234
+ // Remove mouse listeners and start the drag.
235
+ const target = event.target;
236
+ target.removeEventListener('mousemove', mouseMoveListener, true);
237
+ target.removeEventListener('mouseup', mouseUpListener, true);
238
+ void this.startDrag(data.dragImage, datasource, event.clientX, event.clientY);
239
+ }
240
+ }
241
+ /**
242
+ * Detect if a drag event should be started. This is down if the
243
+ * mouse is moved beyond a certain distance (DRAG_THRESHOLD).
244
+ *
245
+ * @param prevX - X Coordinate of the mouse pointer during the mousedown event
246
+ * @param prevY - Y Coordinate of the mouse pointer during the mousedown event
247
+ * @param nextX - Current X Coordinate of the mouse pointer
248
+ * @param nextY - Current Y Coordinate of the mouse pointer
249
+ */
250
+ shouldStartDrag(prevX, prevY, nextX, nextY) {
251
+ const dx = Math.abs(nextX - prevX);
252
+ const dy = Math.abs(nextY - prevY);
253
+ return dx >= 0 || dy >= 5;
254
+ }
255
+ async startDrag(dragImage, datasource, clientX, clientY) {
256
+ const notebookPanel = this.props.getCurrentWidget();
257
+ const notebookContent = notebookPanel.content;
258
+ const codeCell = new CodeCellModel({});
259
+ const cell = notebookContent.contentFactory.createCodeCell({
260
+ model: codeCell,
261
+ rendermime: notebookContent.rendermime,
262
+ contentFactory: notebookContent.contentFactory
263
+ });
264
+ let content = datasourceCode(datasource, notebookContent, 0);
265
+ if (window.injectToken) {
266
+ const notebookPanel = this.props.getCurrentWidget();
267
+ content = datameshToken(notebookPanel.content) + '\n' + content;
268
+ }
269
+ cell.model.sharedModel.setSource(content);
270
+ this._drag = new Drag({
271
+ mimeData: new MimeData(),
272
+ dragImage: dragImage,
273
+ supportedActions: 'copy-move',
274
+ proposedAction: 'copy',
275
+ source: this
276
+ });
277
+ const selected = [cell.model.toJSON()];
278
+ this._drag.mimeData.setData(JUPYTER_CELL_MIME, selected);
279
+ this._drag.mimeData.setData('text/plain', datasource.description);
280
+ return this._drag.start(clientX, clientY).then(() => {
281
+ this._drag = null;
282
+ this._dragData = null;
283
+ });
284
+ }
285
+ }
286
+ /**
287
+ * Shows a message prompting user to configure their Datamesh token.
288
+ * Only renders when no token is set.
289
+ */
290
+ function TokenConfigMessage({ commands }) {
291
+ const [hasToken, setHasToken] = React.useState(!!window.datameshToken);
292
+ React.useEffect(() => {
293
+ const checkToken = () => setHasToken(!!window.datameshToken);
294
+ const interval = setInterval(checkToken, 1000);
295
+ return () => clearInterval(interval);
296
+ }, []);
297
+ if (hasToken) {
298
+ return null;
299
+ }
300
+ return (React.createElement("div", { className: "oceanum-token-config" },
301
+ "Set your",
302
+ ' ',
303
+ React.createElement("a", { onClick: () => commands.execute('settingeditor:open', { query: 'Oceanum' }) }, "Datamesh token"),
304
+ ' ',
305
+ "to enable Oceanum.oi services",
306
+ ' ',
307
+ React.createElement("a", { href: "https://home.oceanum.io/account", target: "_blank", rel: "noopener noreferrer" }, "Get token here")));
308
+ }
309
+ function AIChatPanel({ commands }) {
310
+ const [messages, setMessages] = React.useState([]);
311
+ const [input, setInput] = React.useState('');
312
+ const [loading, setLoading] = React.useState(false);
313
+ const [progress, setProgress] = React.useState(null);
314
+ // What the agent is doing, as the backend reports it. A `/api/chat` call
315
+ // takes around fifty seconds and used to spend all of them showing the same
316
+ // three words, which read as a hang rather than as work.
317
+ React.useEffect(() => onProgress(setProgress), []);
318
+ const [error, setError] = React.useState(null);
319
+ const messagesEndRef = React.useRef(null);
320
+ // Chat history navigation
321
+ const [history, setHistory] = React.useState([]);
322
+ const [historyIndex, setHistoryIndex] = React.useState(-1);
323
+ const [tempInput, setTempInput] = React.useState('');
324
+ // Track the actual token value to detect changes
325
+ const [token, setToken] = React.useState(window.datameshToken || '');
326
+ const hasToken = !!token;
327
+ // Check if code capability is enabled (null = loading/unknown)
328
+ const [codeEnabled, setCodeEnabled] = React.useState(null);
329
+ // Re-check token periodically (settings may change)
330
+ React.useEffect(() => {
331
+ const checkToken = () => {
332
+ const currentToken = window.datameshToken || '';
333
+ if (currentToken !== token) {
334
+ setToken(currentToken);
335
+ }
336
+ };
337
+ const interval = setInterval(checkToken, 1000);
338
+ return () => clearInterval(interval);
339
+ }, [token]);
340
+ // Fetch capabilities when token changes
341
+ React.useEffect(() => {
342
+ if (!token) {
343
+ setCodeEnabled(null);
344
+ return;
345
+ }
346
+ const fetchCapabilities = async () => {
347
+ try {
348
+ const response = await fetch(`${OCEANUM_AI_BACKEND_URL}/api/capabilities`, {
349
+ headers: {
350
+ 'X-Datamesh-Token': token
351
+ }
352
+ });
353
+ if (response.ok) {
354
+ const data = await response.json();
355
+ setCodeEnabled(data.code === true);
356
+ }
357
+ else {
358
+ setCodeEnabled(false);
359
+ }
360
+ }
361
+ catch (_a) {
362
+ setCodeEnabled(false);
363
+ }
364
+ };
365
+ void fetchCapabilities();
366
+ }, [token]);
367
+ // Auto-scroll to bottom when messages change
368
+ React.useEffect(() => {
369
+ var _a;
370
+ (_a = messagesEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: 'smooth' });
371
+ }, [messages, loading]);
372
+ // The notebook this conversation is pinned to: undefined until it starts,
373
+ // null when it has none. See 'oceanum-ai:chat-context' in index.ts.
374
+ const [context, setContext] = React.useState(undefined);
375
+ // Bumped by New chat. A request keeps the value it started with, and drops
376
+ // its result once the value has moved on: the run New chat stopped resolves
377
+ // AFTER the reset -- with "Stopped." or a late answer -- and must neither
378
+ // land in the new conversation nor end `loading` under a newer request.
379
+ const conversation = React.useRef(0);
380
+ const handleSubmit = async () => {
381
+ var _a, _b, _c, _d;
382
+ const prompt = input.trim();
383
+ if (!prompt || loading) {
384
+ return;
385
+ }
386
+ const mine = conversation.current;
387
+ // Add to history
388
+ setHistory(prev => [...prev, prompt]);
389
+ setHistoryIndex(-1);
390
+ setTempInput('');
391
+ setInput('');
392
+ setError(null);
393
+ setMessages(prev => [...prev, { role: 'user', content: prompt }]);
394
+ setProgress(null);
395
+ setLoading(true);
396
+ try {
397
+ // Starts the conversation if this is its first message, and reports
398
+ // its notebook's name either way.
399
+ const pinned = await commands.execute('oceanum-ai:chat-context');
400
+ if (mine !== conversation.current) {
401
+ return;
402
+ }
403
+ setContext((_a = pinned) !== null && _a !== void 0 ? _a : null);
404
+ // Pass current chat history (before adding the new user message)
405
+ // The user message was already added to state, so we use the messages array directly
406
+ const result = await commands.execute('oceanum-ai:submit-prompt', {
407
+ prompt,
408
+ chatHistory: messages
409
+ });
410
+ if (mine !== conversation.current) {
411
+ return;
412
+ }
413
+ // Placing the answer can have put it in a new notebook (the old one was
414
+ // deleted), so the line is read again rather than left as it was.
415
+ const after = await commands.execute('oceanum-ai:chat-context');
416
+ if (mine !== conversation.current) {
417
+ return;
418
+ }
419
+ setContext((_b = after) !== null && _b !== void 0 ? _b : null);
420
+ const explanation = (_c = result) !== null && _c !== void 0 ? _c : '';
421
+ setMessages(prev => [
422
+ ...prev,
423
+ { role: 'assistant', content: explanation }
424
+ ]);
425
+ }
426
+ catch (err) {
427
+ if (mine === conversation.current) {
428
+ setError((_d = err === null || err === void 0 ? void 0 : err.message) !== null && _d !== void 0 ? _d : 'An error occurred');
429
+ }
430
+ }
431
+ finally {
432
+ if (mine === conversation.current) {
433
+ setLoading(false);
434
+ }
435
+ }
436
+ };
437
+ // Clear the conversation and start another, pinned to whichever notebook is
438
+ // the active tab now. The prompt history (up/down arrow) is kept: it is
439
+ // input recall, not conversation.
440
+ const handleNewChat = async () => {
441
+ var _a, _b;
442
+ conversation.current += 1;
443
+ const mine = conversation.current;
444
+ setMessages([]);
445
+ setInput('');
446
+ setError(null);
447
+ setLoading(false);
448
+ // The old run's last phase belongs to the conversation thrown away.
449
+ setProgress(null);
450
+ setHistoryIndex(-1);
451
+ setTempInput('');
452
+ try {
453
+ const pinned = await commands.execute('oceanum-ai:new-chat');
454
+ if (mine === conversation.current) {
455
+ setContext((_a = pinned) !== null && _a !== void 0 ? _a : null);
456
+ }
457
+ }
458
+ catch (err) {
459
+ // The chat commands register once settings have loaded, so a click
460
+ // before that has nothing to reach. Say so, rather than leave the old
461
+ // conversation's "Context:" line under a cleared chat.
462
+ if (mine === conversation.current) {
463
+ setContext(undefined);
464
+ setError((_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : 'Oceanum AI is not ready yet.');
465
+ }
466
+ }
467
+ };
468
+ const handleKeyDown = (e) => {
469
+ if (e.key === 'Enter' && !e.shiftKey) {
470
+ e.preventDefault();
471
+ void handleSubmit();
472
+ return;
473
+ }
474
+ // History navigation with up/down arrows
475
+ if (e.key === 'ArrowUp' && history.length > 0) {
476
+ e.preventDefault();
477
+ if (historyIndex === -1) {
478
+ // Save current input before navigating
479
+ setTempInput(input);
480
+ setHistoryIndex(history.length - 1);
481
+ setInput(history[history.length - 1]);
482
+ }
483
+ else if (historyIndex > 0) {
484
+ setHistoryIndex(historyIndex - 1);
485
+ setInput(history[historyIndex - 1]);
486
+ }
487
+ return;
488
+ }
489
+ if (e.key === 'ArrowDown' && historyIndex !== -1) {
490
+ e.preventDefault();
491
+ if (historyIndex < history.length - 1) {
492
+ setHistoryIndex(historyIndex + 1);
493
+ setInput(history[historyIndex + 1]);
494
+ }
495
+ else {
496
+ // Return to current input
497
+ setHistoryIndex(-1);
498
+ setInput(tempInput);
499
+ }
500
+ return;
501
+ }
502
+ };
503
+ // Hide AI panel if no token or code capability is not enabled
504
+ if (!hasToken || codeEnabled === false) {
505
+ return null;
506
+ }
507
+ return (React.createElement("div", { className: "oceanum-ai-chat" },
508
+ React.createElement("div", { className: "oceanum-ai-chat-header" },
509
+ React.createElement("span", { className: "oceanum-ai-chat-title" }, "Oceanum AI"),
510
+ React.createElement("button", { className: "jp-mod-styled oceanum-ai-chat-new", onClick: () => void handleNewChat(), title: "Clear this conversation and start a new one, with the active notebook as its context" }, "New chat")),
511
+ context !== undefined && (React.createElement("div", { className: "oceanum-ai-chat-context", title: context !== null && context !== void 0 ? context : undefined }, context === null ? 'No notebook in context' : `Context: ${context}`)),
512
+ React.createElement("div", { className: "oceanum-ai-chat-messages" },
513
+ messages.length === 0 && (React.createElement("div", { className: "oceanum-text-empty" },
514
+ "Ask Oceanum AI to query and analyse data from Datamesh.",
515
+ React.createElement("br", null),
516
+ "Answers go into this chat's notebook: the one in the active tab when the chat starts, or a new one.")),
517
+ messages.map((msg, i) => (React.createElement("div", { key: i, className: `oceanum-ai-chat-message oceanum-ai-chat-message--${msg.role}` },
518
+ React.createElement("span", { className: "oceanum-ai-chat-role" }, msg.role === 'user' ? 'You' : 'AI'),
519
+ msg.role === 'user' ? (React.createElement("pre", { className: "oceanum-ai-chat-content" }, msg.content)) : (React.createElement(MarkdownContent, { content: msg.content }))))),
520
+ loading && (React.createElement("div", { className: "oceanum-ai-chat-message oceanum-ai-chat-message--assistant" },
521
+ React.createElement("span", { className: "oceanum-ai-chat-role" }, "AI"),
522
+ React.createElement("span", { className: "oceanum-ai-chat-loading" }, describeProgress(progress)))),
523
+ error && React.createElement("div", { className: "oceanum-ai-chat-error" }, error),
524
+ React.createElement("div", { ref: messagesEndRef })),
525
+ React.createElement("div", { className: "oceanum-ai-chat-input-area" },
526
+ React.createElement("textarea", { className: "oceanum-ai-chat-input", rows: 3, placeholder: "Ask Oceanum AI\u2026 (Enter to send, Shift+Enter for newline)", value: input, onChange: e => setInput(e.target.value), onKeyDown: handleKeyDown, disabled: loading }),
527
+ React.createElement("button", { className: "jp-mod-styled oceanum-ai-chat-send", onClick: () => void (loading
528
+ ? commands.execute('oceanum-ai:stop')
529
+ : handleSubmit()), disabled: !loading && !input.trim(), title: loading ? 'Stop the current response' : undefined }, loading ? 'Stop' : 'Send'))));
530
+ }
531
+ /**
532
+ * A widget for Datamesh Connections.
533
+ */
534
+ export class DatameshConnectWidget extends ReactWidget {
535
+ constructor(props) {
536
+ super();
537
+ this.datameshWorkspaceSpec = null;
538
+ this.props = props;
539
+ this.renderSignal = new Signal(this);
540
+ this.renderDisplay = this.renderDisplay.bind(this);
541
+ window.addEventListener('message', this.receiveIFrameMessage.bind(this), false);
542
+ }
543
+ receiveIFrameMessage(event) {
544
+ if (event.data && event.data.action === 'workspace-modify') {
545
+ this.datameshWorkspaceSpec = {
546
+ id: event.data.id,
547
+ name: event.data.name,
548
+ data: event.data.data
549
+ };
550
+ this.renderSignal.emit(this.datameshWorkspaceSpec);
551
+ }
552
+ }
553
+ renderDisplay(datameshWorkspace) {
554
+ return (React.createElement(React.Fragment, null, this.datameshWorkspaceSpec ? (React.createElement(DatameshWorkspaceDisplay, { spec: datameshWorkspace, openDatameshUI: this.props.openDatameshUI, getCurrentWidget: this.props.getCurrentWidget, shell: this.props.app.shell })) : (React.createElement("div", { className: "oceanum-text-empty" },
555
+ React.createElement("a", { onClick: this.props.openDatameshUI }, "Open"),
556
+ " the Oceanum Datamesh UI to add datasources."))));
557
+ }
558
+ render() {
559
+ return (React.createElement("div", { className: "datamesh-connect" },
560
+ React.createElement("header", { className: "oceanum-sidebar-header" },
561
+ React.createElement(this.props.icon.react, { tag: "span", width: "auto", height: "20px", verticalAlign: "middle" }),
562
+ React.createElement("span", { className: "oceanum-sidebar-title" }, "Oceanum.io")),
563
+ React.createElement("div", { className: "datamesh-workspace-header" },
564
+ React.createElement("span", null, "Datamesh Workspace"),
565
+ React.createElement("div", { className: "open-datamesh-ui", onClick: this.props.openDatameshUI, title: "Open Datamesh UI" }, React.createElement(addIcon.react, { height: "20px", verticalAlign: "middle" }))),
566
+ React.createElement("div", { className: "datamesh-connect-workspace" },
567
+ React.createElement(UseSignal, { signal: this.renderSignal, initialArgs: null }, (_, datameshWorkspace) => this.renderDisplay(datameshWorkspace)),
568
+ React.createElement(TokenConfigMessage, { commands: this.props.commands })),
569
+ React.createElement("div", { className: "datamesh-connect-divider" }),
570
+ React.createElement(AIChatPanel, { commands: this.props.commands })));
571
+ }
572
+ }
573
+ //# sourceMappingURL=DatameshWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatameshWidget.js","sourceRoot":"","sources":["../src/DatameshWidget.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import '../style/index.css';
3
+ import { IDatasource } from './DatameshWidget';
4
+ export interface IDatasourceItemProps {
5
+ datasource: IDatasource;
6
+ insertDatasource: (datasource: IDatasource) => void;
7
+ onMouseDown: (e: React.MouseEvent<HTMLSpanElement, MouseEvent>, datasource: IDatasource) => void;
8
+ }
9
+ /**
10
+ * A React component for expandable containers.
11
+ */
12
+ export declare const DatasourceItem: React.FC<IDatasourceItemProps>;