@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.
- package/LICENSE +29 -0
- package/README.md +116 -0
- package/lib/DatameshUI.d.ts +5 -0
- package/lib/DatameshUI.js +8 -0
- package/lib/DatameshUI.js.map +1 -0
- package/lib/DatameshWidget.d.ts +59 -0
- package/lib/DatameshWidget.js +573 -0
- package/lib/DatameshWidget.js.map +1 -0
- package/lib/DatasourceItem.d.ts +12 -0
- package/lib/DatasourceItem.js +47 -0
- package/lib/DatasourceItem.js.map +1 -0
- package/lib/aiLoop.d.ts +60 -0
- package/lib/aiLoop.js +85 -0
- package/lib/aiLoop.js.map +1 -0
- package/lib/chatRouter.d.ts +64 -0
- package/lib/chatRouter.js +225 -0
- package/lib/chatRouter.js.map +1 -0
- package/lib/constants.d.ts +14 -0
- package/lib/constants.js +15 -0
- package/lib/constants.js.map +1 -0
- package/lib/conversationPin.d.ts +68 -0
- package/lib/conversationPin.js +120 -0
- package/lib/conversationPin.js.map +1 -0
- package/lib/handler.d.ts +8 -0
- package/lib/handler.js +36 -0
- package/lib/handler.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.js +273 -0
- package/lib/index.js.map +1 -0
- package/lib/kernelHandoff.d.ts +61 -0
- package/lib/kernelHandoff.js +236 -0
- package/lib/kernelHandoff.js.map +1 -0
- package/lib/notebookContext.d.ts +48 -0
- package/lib/notebookContext.js +118 -0
- package/lib/notebookContext.js.map +1 -0
- package/lib/notebookHost.d.ts +6 -0
- package/lib/notebookHost.js +72 -0
- package/lib/notebookHost.js.map +1 -0
- package/lib/notebookRun.d.ts +37 -0
- package/lib/notebookRun.js +70 -0
- package/lib/notebookRun.js.map +1 -0
- package/lib/progress.d.ts +43 -0
- package/lib/progress.js +103 -0
- package/lib/progress.js.map +1 -0
- package/lib/sse.d.ts +26 -0
- package/lib/sse.js +112 -0
- package/lib/sse.js.map +1 -0
- package/package.json +151 -0
- package/schema/datamesh-connect.json +35 -0
- package/src/DatameshUI.tsx +15 -0
- package/src/DatameshWidget.tsx +909 -0
- package/src/DatasourceItem.tsx +124 -0
- package/src/__tests__/aiLoop.spec.ts +304 -0
- package/src/__tests__/chatRouter.spec.ts +315 -0
- package/src/__tests__/conversationPin.spec.ts +236 -0
- package/src/__tests__/kernelHandoff.spec.ts +106 -0
- package/src/__tests__/notebookContext.spec.ts +97 -0
- package/src/__tests__/notebookHost.spec.ts +195 -0
- package/src/__tests__/notebookRun.spec.ts +95 -0
- package/src/__tests__/notebookSnapshot.spec.ts +62 -0
- package/src/__tests__/oceanumlab.spec.ts +9 -0
- package/src/__tests__/sse.spec.ts +304 -0
- package/src/aiLoop.ts +140 -0
- package/src/chatRouter.ts +329 -0
- package/src/constants.ts +16 -0
- package/src/conversationPin.ts +148 -0
- package/src/global.d.ts +5 -0
- package/src/handler.ts +46 -0
- package/src/index.ts +327 -0
- package/src/kernelHandoff.ts +284 -0
- package/src/notebookContext.ts +144 -0
- package/src/notebookHost.ts +97 -0
- package/src/notebookRun.ts +104 -0
- package/src/progress.ts +121 -0
- package/src/sse.ts +127 -0
- package/src/svg.d.ts +4 -0
- package/style/base.css +5 -0
- package/style/icons/oceanum-dark.svg +1 -0
- package/style/icons/oceanum-light.svg +1 -0
- package/style/icons/oceanum.png +0 -0
- package/style/icons/oceanum.svg +1 -0
- package/style/index.css +477 -0
- 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>;
|