@notebook-intelligence/notebook-intelligence 2.4.1 → 2.5.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/README.md +17 -111
- package/lib/api.d.ts +2 -1
- package/lib/api.js +31 -15
- package/lib/chat-sidebar.d.ts +0 -9
- package/lib/chat-sidebar.js +58 -293
- package/lib/components/checkbox.d.ts +2 -0
- package/lib/components/checkbox.js +11 -0
- package/lib/components/mcp-util.d.ts +2 -0
- package/lib/components/mcp-util.js +37 -0
- package/lib/components/pill.d.ts +2 -0
- package/lib/components/pill.js +5 -0
- package/lib/components/settings-panel.d.ts +11 -0
- package/lib/components/settings-panel.js +374 -0
- package/lib/index.js +26 -21
- package/lib/tokens.d.ts +11 -1
- package/lib/tokens.js +11 -0
- package/package.json +1 -1
- package/src/api.ts +34 -16
- package/src/chat-sidebar.tsx +159 -671
- package/src/components/checkbox.tsx +29 -0
- package/src/components/mcp-util.ts +53 -0
- package/src/components/pill.tsx +15 -0
- package/src/components/settings-panel.tsx +770 -0
- package/src/index.ts +29 -24
- package/src/tokens.ts +12 -1
- package/style/base.css +77 -2
package/lib/chat-sidebar.js
CHANGED
|
@@ -10,14 +10,10 @@ const MarkdownRenderer = memo(OriginalMarkdownRenderer);
|
|
|
10
10
|
import copySvgstr from '../style/icons/copy.svg';
|
|
11
11
|
import copilotSvgstr from '../style/icons/copilot.svg';
|
|
12
12
|
import copilotWarningSvgstr from '../style/icons/copilot-warning.svg';
|
|
13
|
-
import { VscSend, VscStopCircle, VscEye, VscEyeClosed, VscTriangleRight, VscTriangleDown,
|
|
14
|
-
import { MdOutlineCheckBoxOutlineBlank, MdCheckBox } from 'react-icons/md';
|
|
13
|
+
import { VscSend, VscStopCircle, VscEye, VscEyeClosed, VscTriangleRight, VscTriangleDown, VscSettingsGear, VscPassFilled, VscTools, VscTrash } from 'react-icons/vsc';
|
|
15
14
|
import { extractLLMGeneratedCode, isDarkTheme } from './utils';
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
const LITELLM_COMPATIBLE_CHAT_MODEL_ID = 'litellm-compatible-chat-model';
|
|
19
|
-
const OPENAI_COMPATIBLE_INLINE_COMPLETION_MODEL_ID = 'openai-compatible-inline-completion-model';
|
|
20
|
-
const LITELLM_COMPATIBLE_INLINE_COMPLETION_MODEL_ID = 'litellm-compatible-inline-completion-model';
|
|
15
|
+
import { CheckBoxItem } from './components/checkbox';
|
|
16
|
+
import { mcpServerSettingsToEnabledState } from './components/mcp-util';
|
|
21
17
|
export var RunChatCompletionType;
|
|
22
18
|
(function (RunChatCompletionType) {
|
|
23
19
|
RunChatCompletionType[RunChatCompletionType["Chat"] = 0] = "Chat";
|
|
@@ -128,16 +124,6 @@ export class GitHubCopilotLoginDialogBody extends ReactWidget {
|
|
|
128
124
|
return (React.createElement(GitHubCopilotLoginDialogBodyComponent, { onLoggedIn: () => this._onLoggedIn() }));
|
|
129
125
|
}
|
|
130
126
|
}
|
|
131
|
-
export class ConfigurationDialogBody extends ReactWidget {
|
|
132
|
-
constructor(options) {
|
|
133
|
-
super();
|
|
134
|
-
this._onEditMCPConfigClicked = options.onEditMCPConfigClicked;
|
|
135
|
-
this._onSave = options.onSave;
|
|
136
|
-
}
|
|
137
|
-
render() {
|
|
138
|
-
return (React.createElement(ConfigurationDialogBodyComponent, { onEditMCPConfigClicked: this._onEditMCPConfigClicked, onSave: this._onSave }));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
127
|
const answeredForms = new Map();
|
|
142
128
|
function ChatResponseHTMLFrame(props) {
|
|
143
129
|
const iframSrc = useMemo(() => URL.createObjectURL(new Blob([props.source], { type: 'text/html' })), []);
|
|
@@ -329,14 +315,6 @@ async function submitCompletionRequest(request, responseEmitter) {
|
|
|
329
315
|
return NBIAPI.generateCode(request.chatId, request.content, request.prefix || '', request.suffix || '', request.existingCode || '', request.language || 'python', request.filename || 'Untitled.ipynb', responseEmitter);
|
|
330
316
|
}
|
|
331
317
|
}
|
|
332
|
-
function CheckBoxItem(props) {
|
|
333
|
-
const indent = props.indent || 0;
|
|
334
|
-
return (React.createElement("div", { className: `checkbox-item checkbox-item-indent-${indent} ${props.header ? 'checkbox-item-header' : ''}`, title: props.title, onClick: event => props.onClick(event) },
|
|
335
|
-
React.createElement("div", { className: "checkbox-item-toggle" },
|
|
336
|
-
props.checked ? (React.createElement(MdCheckBox, { className: "checkbox-icon" })) : (React.createElement(MdOutlineCheckBoxOutlineBlank, { className: "checkbox-icon" })),
|
|
337
|
-
props.label),
|
|
338
|
-
props.title && (React.createElement("div", { className: "checkbox-item-description" }, props.title))));
|
|
339
|
-
}
|
|
340
318
|
function SidebarComponent(props) {
|
|
341
319
|
const [chatMessages, setChatMessages] = useState([]);
|
|
342
320
|
const [prompt, setPrompt] = useState('');
|
|
@@ -364,7 +342,8 @@ function SidebarComponent(props) {
|
|
|
364
342
|
const [toolSelectionTitle, setToolSelectionTitle] = useState('Tool selection');
|
|
365
343
|
const [selectedToolCount, setSelectedToolCount] = useState(0);
|
|
366
344
|
const [notebookExecuteToolSelected, setNotebookExecuteToolSelected] = useState(false);
|
|
367
|
-
const [
|
|
345
|
+
const [renderCount, setRenderCount] = useState(1);
|
|
346
|
+
const toolConfigRef = useRef({
|
|
368
347
|
builtinToolsets: [
|
|
369
348
|
{ id: BuiltinToolsetType.NotebookEdit, name: 'Notebook edit' },
|
|
370
349
|
{ id: BuiltinToolsetType.NotebookExecute, name: 'Notebook execute' }
|
|
@@ -372,6 +351,8 @@ function SidebarComponent(props) {
|
|
|
372
351
|
mcpServers: [],
|
|
373
352
|
extensions: []
|
|
374
353
|
});
|
|
354
|
+
const mcpServerSettingsRef = useRef(NBIAPI.config.mcpServerSettings);
|
|
355
|
+
const [mcpServerEnabledState, setMCPServerEnabledState] = useState(new Map(mcpServerSettingsToEnabledState(toolConfigRef.current.mcpServers, mcpServerSettingsRef.current)));
|
|
375
356
|
const [showModeTools, setShowModeTools] = useState(false);
|
|
376
357
|
const toolSelectionsInitial = {
|
|
377
358
|
builtinToolsets: [BuiltinToolsetType.NotebookEdit],
|
|
@@ -383,23 +364,30 @@ function SidebarComponent(props) {
|
|
|
383
364
|
mcpServers: {},
|
|
384
365
|
extensions: {}
|
|
385
366
|
};
|
|
386
|
-
const [toolSelections, setToolSelections] = useState(toolSelectionsInitial);
|
|
367
|
+
const [toolSelections, setToolSelections] = useState(structuredClone(toolSelectionsInitial));
|
|
387
368
|
const [hasExtensionTools, setHasExtensionTools] = useState(false);
|
|
388
369
|
const [lastScrollTime, setLastScrollTime] = useState(0);
|
|
389
370
|
const [scrollPending, setScrollPending] = useState(false);
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
371
|
+
useEffect(() => {
|
|
372
|
+
NBIAPI.configChanged.connect(() => {
|
|
373
|
+
toolConfigRef.current = NBIAPI.config.toolConfig;
|
|
374
|
+
mcpServerSettingsRef.current = NBIAPI.config.mcpServerSettings;
|
|
375
|
+
const newMcpServerEnabledState = mcpServerSettingsToEnabledState(toolConfigRef.current.mcpServers, mcpServerSettingsRef.current);
|
|
376
|
+
setMCPServerEnabledState(newMcpServerEnabledState);
|
|
377
|
+
setToolSelections(structuredClone(toolSelectionsInitial));
|
|
378
|
+
setRenderCount(renderCount => renderCount + 1);
|
|
379
|
+
});
|
|
380
|
+
}, []);
|
|
393
381
|
useEffect(() => {
|
|
394
382
|
let hasTools = false;
|
|
395
|
-
for (const extension of
|
|
383
|
+
for (const extension of toolConfigRef.current.extensions) {
|
|
396
384
|
if (extension.toolsets.length > 0) {
|
|
397
385
|
hasTools = true;
|
|
398
386
|
break;
|
|
399
387
|
}
|
|
400
388
|
}
|
|
401
389
|
setHasExtensionTools(hasTools);
|
|
402
|
-
}, [
|
|
390
|
+
}, [toolConfigRef.current]);
|
|
403
391
|
useEffect(() => {
|
|
404
392
|
const builtinToolSelCount = toolSelections.builtinToolsets.length;
|
|
405
393
|
let mcpServerToolSelCount = 0;
|
|
@@ -462,7 +450,7 @@ function SidebarComponent(props) {
|
|
|
462
450
|
if (!(id in toolSelections.mcpServers)) {
|
|
463
451
|
return false;
|
|
464
452
|
}
|
|
465
|
-
const mcpServer =
|
|
453
|
+
const mcpServer = toolConfigRef.current.mcpServers.find(server => server.id === id);
|
|
466
454
|
const selectedServerTools = toolSelections.mcpServers[id];
|
|
467
455
|
for (const tool of mcpServer.tools) {
|
|
468
456
|
if (!selectedServerTools.includes(tool.name)) {
|
|
@@ -478,9 +466,11 @@ function SidebarComponent(props) {
|
|
|
478
466
|
setToolSelections(newConfig);
|
|
479
467
|
}
|
|
480
468
|
else {
|
|
481
|
-
const mcpServer =
|
|
469
|
+
const mcpServer = toolConfigRef.current.mcpServers.find(server => server.id === id);
|
|
482
470
|
const newConfig = { ...toolSelections };
|
|
483
|
-
newConfig.mcpServers[id] = structuredClone(mcpServer.tools
|
|
471
|
+
newConfig.mcpServers[id] = structuredClone(mcpServer.tools
|
|
472
|
+
.filter((tool) => mcpServerEnabledState.get(mcpServer.id).has(tool.name))
|
|
473
|
+
.map((tool) => tool.name));
|
|
484
474
|
setToolSelections(newConfig);
|
|
485
475
|
}
|
|
486
476
|
};
|
|
@@ -513,7 +503,7 @@ function SidebarComponent(props) {
|
|
|
513
503
|
if (!(extensionId in toolSelections.extensions)) {
|
|
514
504
|
return false;
|
|
515
505
|
}
|
|
516
|
-
const extension =
|
|
506
|
+
const extension = toolConfigRef.current.extensions.find(extension => extension.id === extensionId);
|
|
517
507
|
for (const toolset of extension.toolsets) {
|
|
518
508
|
if (!getExtensionToolsetState(extensionId, toolset.id)) {
|
|
519
509
|
return false;
|
|
@@ -528,7 +518,7 @@ function SidebarComponent(props) {
|
|
|
528
518
|
if (!(toolsetId in toolSelections.extensions[extensionId])) {
|
|
529
519
|
return false;
|
|
530
520
|
}
|
|
531
|
-
const extension =
|
|
521
|
+
const extension = toolConfigRef.current.extensions.find(ext => ext.id === extensionId);
|
|
532
522
|
const extensionToolset = extension.toolsets.find((toolset) => toolset.id === toolsetId);
|
|
533
523
|
const selectedToolsetTools = toolSelections.extensions[extensionId][toolsetId];
|
|
534
524
|
for (const tool of extensionToolset.tools) {
|
|
@@ -552,7 +542,7 @@ function SidebarComponent(props) {
|
|
|
552
542
|
}
|
|
553
543
|
else {
|
|
554
544
|
const newConfig = { ...toolSelections };
|
|
555
|
-
const extension =
|
|
545
|
+
const extension = toolConfigRef.current.extensions.find(ext => ext.id === extensionId);
|
|
556
546
|
if (extensionId in newConfig.extensions) {
|
|
557
547
|
delete newConfig.extensions[extensionId];
|
|
558
548
|
}
|
|
@@ -581,7 +571,7 @@ function SidebarComponent(props) {
|
|
|
581
571
|
setToolSelections(newConfig);
|
|
582
572
|
}
|
|
583
573
|
else {
|
|
584
|
-
const extension =
|
|
574
|
+
const extension = toolConfigRef.current.extensions.find(ext => ext.id === extensionId);
|
|
585
575
|
const extensionToolset = extension.toolsets.find((toolset) => toolset.id === toolsetId);
|
|
586
576
|
const newConfig = { ...toolSelections };
|
|
587
577
|
if (!(extensionId in newConfig.extensions)) {
|
|
@@ -707,7 +697,13 @@ function SidebarComponent(props) {
|
|
|
707
697
|
};
|
|
708
698
|
const handleChatToolsButtonClick = async () => {
|
|
709
699
|
if (!showModeTools) {
|
|
710
|
-
NBIAPI.fetchCapabilities()
|
|
700
|
+
NBIAPI.fetchCapabilities().then(() => {
|
|
701
|
+
toolConfigRef.current = NBIAPI.config.toolConfig;
|
|
702
|
+
mcpServerSettingsRef.current = NBIAPI.config.mcpServerSettings;
|
|
703
|
+
const newMcpServerEnabledState = mcpServerSettingsToEnabledState(toolConfigRef.current.mcpServers, mcpServerSettingsRef.current);
|
|
704
|
+
setMCPServerEnabledState(newMcpServerEnabledState);
|
|
705
|
+
setRenderCount(renderCount => renderCount + 1);
|
|
706
|
+
});
|
|
711
707
|
}
|
|
712
708
|
setShowModeTools(!showModeTools);
|
|
713
709
|
};
|
|
@@ -1146,10 +1142,12 @@ function SidebarComponent(props) {
|
|
|
1146
1142
|
};
|
|
1147
1143
|
const [ghLoginRequired, setGHLoginRequired] = useState(getGHLoginRequired());
|
|
1148
1144
|
const [chatEnabled, setChatEnabled] = useState(getChatEnabled());
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1145
|
+
useEffect(() => {
|
|
1146
|
+
NBIAPI.configChanged.connect(() => {
|
|
1147
|
+
setGHLoginRequired(getGHLoginRequired());
|
|
1148
|
+
setChatEnabled(getChatEnabled());
|
|
1149
|
+
});
|
|
1150
|
+
}, []);
|
|
1153
1151
|
useEffect(() => {
|
|
1154
1152
|
setGHLoginRequired(getGHLoginRequired());
|
|
1155
1153
|
setChatEnabled(getChatEnabled());
|
|
@@ -1200,7 +1198,7 @@ function SidebarComponent(props) {
|
|
|
1200
1198
|
setToolSelections(toolSelectionsEmpty);
|
|
1201
1199
|
}
|
|
1202
1200
|
else if (event.target.value === 'agent') {
|
|
1203
|
-
setToolSelections(toolSelectionsInitial);
|
|
1201
|
+
setToolSelections(structuredClone(toolSelectionsInitial));
|
|
1204
1202
|
}
|
|
1205
1203
|
setShowModeTools(false);
|
|
1206
1204
|
setChatMode(event.target.value);
|
|
@@ -1239,15 +1237,24 @@ function SidebarComponent(props) {
|
|
|
1239
1237
|
React.createElement("div", null, "Done"))),
|
|
1240
1238
|
React.createElement("div", { className: "mode-tools-popover-tool-list" },
|
|
1241
1239
|
React.createElement("div", { className: "mode-tools-group-header" }, "Built-in"),
|
|
1242
|
-
React.createElement("div", { className: "mode-tools-group mode-tools-group-built-in" },
|
|
1240
|
+
React.createElement("div", { className: "mode-tools-group mode-tools-group-built-in" }, toolConfigRef.current.builtinToolsets.map((toolset) => (React.createElement(CheckBoxItem, { key: toolset.id, label: toolset.name, checked: getBuiltinToolsetState(toolset.id), header: true, onClick: () => {
|
|
1243
1241
|
setBuiltinToolsetState(toolset.id, !getBuiltinToolsetState(toolset.id));
|
|
1244
1242
|
} })))),
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
React.createElement(
|
|
1248
|
-
|
|
1243
|
+
renderCount > 0 &&
|
|
1244
|
+
mcpServerEnabledState.size > 0 &&
|
|
1245
|
+
toolConfigRef.current.mcpServers.length > 0 && (React.createElement("div", { className: "mode-tools-group-header" }, "MCP Servers")),
|
|
1246
|
+
renderCount > 0 &&
|
|
1247
|
+
toolConfigRef.current.mcpServers
|
|
1248
|
+
.filter(mcpServer => mcpServerEnabledState.has(mcpServer.id))
|
|
1249
|
+
.map((mcpServer, index) => (React.createElement("div", { className: "mode-tools-group" },
|
|
1250
|
+
React.createElement(CheckBoxItem, { label: mcpServer.id, header: true, checked: getMCPServerState(mcpServer.id), onClick: () => onMCPServerClicked(mcpServer.id) }),
|
|
1251
|
+
mcpServer.tools
|
|
1252
|
+
.filter((tool) => mcpServerEnabledState
|
|
1253
|
+
.get(mcpServer.id)
|
|
1254
|
+
.has(tool.name))
|
|
1255
|
+
.map((tool, index) => (React.createElement(CheckBoxItem, { label: tool.name, title: tool.description, indent: 1, checked: getMCPServerToolState(mcpServer.id, tool.name), onClick: () => setMCPServerToolState(mcpServer.id, tool.name, !getMCPServerToolState(mcpServer.id, tool.name)) })))))),
|
|
1249
1256
|
hasExtensionTools && (React.createElement("div", { className: "mode-tools-group-header" }, "Extension tools")),
|
|
1250
|
-
|
|
1257
|
+
toolConfigRef.current.extensions.map((extension, index) => (React.createElement("div", { className: "mode-tools-group" },
|
|
1251
1258
|
React.createElement(CheckBoxItem, { label: `${extension.name} (${extension.id})`, header: true, checked: getExtensionState(extension.id), onClick: () => onExtensionClicked(extension.id) }),
|
|
1252
1259
|
extension.toolsets.map((toolset, index) => (React.createElement(React.Fragment, null,
|
|
1253
1260
|
React.createElement(CheckBoxItem, { label: `${toolset.name} (${toolset.id})`, title: toolset.description, indent: 1, checked: getExtensionToolsetState(extension.id, toolset.id), onClick: () => onExtensionToolsetClicked(extension.id, toolset.id) }),
|
|
@@ -1501,245 +1508,3 @@ function GitHubCopilotLoginDialogBodyComponent(props) {
|
|
|
1501
1508
|
React.createElement("button", { className: "jp-Dialog-button jp-mod-reject jp-mod-styled", onClick: handleLogoutClick },
|
|
1502
1509
|
React.createElement("div", { className: "jp-Dialog-buttonLabel" }, "Cancel activation"))))));
|
|
1503
1510
|
}
|
|
1504
|
-
function ConfigurationDialogBodyComponent(props) {
|
|
1505
|
-
var _a;
|
|
1506
|
-
const nbiConfig = NBIAPI.config;
|
|
1507
|
-
const llmProviders = nbiConfig.llmProviders;
|
|
1508
|
-
const [chatModels, setChatModels] = useState([]);
|
|
1509
|
-
const [inlineCompletionModels, setInlineCompletionModels] = useState([]);
|
|
1510
|
-
const [mcpServerNames, setMcpServerNames] = useState(((_a = nbiConfig.toolConfig.mcpServers) === null || _a === void 0 ? void 0 : _a.map((server) => server.id)) || []);
|
|
1511
|
-
const handleSaveClick = async () => {
|
|
1512
|
-
const config = {
|
|
1513
|
-
default_chat_mode: defaultChatMode,
|
|
1514
|
-
chat_model: {
|
|
1515
|
-
provider: chatModelProvider,
|
|
1516
|
-
model: chatModel,
|
|
1517
|
-
properties: chatModelProperties
|
|
1518
|
-
},
|
|
1519
|
-
inline_completion_model: {
|
|
1520
|
-
provider: inlineCompletionModelProvider,
|
|
1521
|
-
model: inlineCompletionModel,
|
|
1522
|
-
properties: inlineCompletionModelProperties
|
|
1523
|
-
}
|
|
1524
|
-
};
|
|
1525
|
-
if (chatModelProvider === 'github-copilot' ||
|
|
1526
|
-
inlineCompletionModelProvider === 'github-copilot') {
|
|
1527
|
-
config.store_github_access_token = storeGitHubAccessToken;
|
|
1528
|
-
}
|
|
1529
|
-
await NBIAPI.setConfig(config);
|
|
1530
|
-
props.onSave();
|
|
1531
|
-
};
|
|
1532
|
-
const handleRefreshOllamaModelListClick = async () => {
|
|
1533
|
-
await NBIAPI.updateOllamaModelList();
|
|
1534
|
-
updateModelOptionsForProvider(chatModelProvider, 'chat');
|
|
1535
|
-
};
|
|
1536
|
-
const [chatModelProvider, setChatModelProvider] = useState(nbiConfig.chatModel.provider || 'none');
|
|
1537
|
-
const [inlineCompletionModelProvider, setInlineCompletionModelProvider] = useState(nbiConfig.inlineCompletionModel.provider || 'none');
|
|
1538
|
-
const [defaultChatMode, setDefaultChatMode] = useState(nbiConfig.defaultChatMode);
|
|
1539
|
-
const [chatModel, setChatModel] = useState(nbiConfig.chatModel.model);
|
|
1540
|
-
const [chatModelProperties, setChatModelProperties] = useState([]);
|
|
1541
|
-
const [inlineCompletionModelProperties, setInlineCompletionModelProperties] = useState([]);
|
|
1542
|
-
const [inlineCompletionModel, setInlineCompletionModel] = useState(nbiConfig.inlineCompletionModel.model);
|
|
1543
|
-
const [storeGitHubAccessToken, setStoreGitHubAccessToken] = useState(nbiConfig.storeGitHubAccessToken);
|
|
1544
|
-
const updateModelOptionsForProvider = (providerId, modelType) => {
|
|
1545
|
-
if (modelType === 'chat') {
|
|
1546
|
-
setChatModelProvider(providerId);
|
|
1547
|
-
}
|
|
1548
|
-
else {
|
|
1549
|
-
setInlineCompletionModelProvider(providerId);
|
|
1550
|
-
}
|
|
1551
|
-
const models = modelType === 'chat'
|
|
1552
|
-
? nbiConfig.chatModels
|
|
1553
|
-
: nbiConfig.inlineCompletionModels;
|
|
1554
|
-
const selectedModelId = modelType === 'chat'
|
|
1555
|
-
? nbiConfig.chatModel.model
|
|
1556
|
-
: nbiConfig.inlineCompletionModel.model;
|
|
1557
|
-
const providerModels = models.filter((model) => model.provider === providerId);
|
|
1558
|
-
if (modelType === 'chat') {
|
|
1559
|
-
setChatModels(providerModels);
|
|
1560
|
-
}
|
|
1561
|
-
else {
|
|
1562
|
-
setInlineCompletionModels(providerModels);
|
|
1563
|
-
}
|
|
1564
|
-
let selectedModel = providerModels.find((model) => model.id === selectedModelId);
|
|
1565
|
-
if (!selectedModel) {
|
|
1566
|
-
selectedModel = providerModels === null || providerModels === void 0 ? void 0 : providerModels[0];
|
|
1567
|
-
}
|
|
1568
|
-
if (selectedModel) {
|
|
1569
|
-
if (modelType === 'chat') {
|
|
1570
|
-
setChatModel(selectedModel.id);
|
|
1571
|
-
setChatModelProperties(selectedModel.properties);
|
|
1572
|
-
}
|
|
1573
|
-
else {
|
|
1574
|
-
setInlineCompletionModel(selectedModel.id);
|
|
1575
|
-
setInlineCompletionModelProperties(selectedModel.properties);
|
|
1576
|
-
}
|
|
1577
|
-
}
|
|
1578
|
-
else {
|
|
1579
|
-
if (modelType === 'chat') {
|
|
1580
|
-
setChatModelProperties([]);
|
|
1581
|
-
}
|
|
1582
|
-
else {
|
|
1583
|
-
setInlineCompletionModelProperties([]);
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
};
|
|
1587
|
-
const onModelPropertyChange = (modelType, propertyId, value) => {
|
|
1588
|
-
const modelProperties = modelType === 'chat'
|
|
1589
|
-
? chatModelProperties
|
|
1590
|
-
: inlineCompletionModelProperties;
|
|
1591
|
-
const updatedProperties = modelProperties.map((property) => {
|
|
1592
|
-
if (property.id === propertyId) {
|
|
1593
|
-
return { ...property, value };
|
|
1594
|
-
}
|
|
1595
|
-
return property;
|
|
1596
|
-
});
|
|
1597
|
-
if (modelType === 'chat') {
|
|
1598
|
-
setChatModelProperties(updatedProperties);
|
|
1599
|
-
}
|
|
1600
|
-
else {
|
|
1601
|
-
setInlineCompletionModelProperties(updatedProperties);
|
|
1602
|
-
}
|
|
1603
|
-
};
|
|
1604
|
-
const handleReloadMCPServersClick = async () => {
|
|
1605
|
-
var _a;
|
|
1606
|
-
const data = await NBIAPI.reloadMCPServerList();
|
|
1607
|
-
setMcpServerNames(((_a = data.mcpServers) === null || _a === void 0 ? void 0 : _a.map((server) => server.id)) || []);
|
|
1608
|
-
};
|
|
1609
|
-
useEffect(() => {
|
|
1610
|
-
updateModelOptionsForProvider(chatModelProvider, 'chat');
|
|
1611
|
-
updateModelOptionsForProvider(inlineCompletionModelProvider, 'inline-completion');
|
|
1612
|
-
}, []);
|
|
1613
|
-
return (React.createElement("div", { className: "config-dialog" },
|
|
1614
|
-
React.createElement("div", { className: "config-dialog-body" },
|
|
1615
|
-
React.createElement("div", { className: "model-config-section" },
|
|
1616
|
-
React.createElement("div", { className: "model-config-section-header" }, "Default chat mode"),
|
|
1617
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1618
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1619
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1620
|
-
React.createElement("div", null,
|
|
1621
|
-
React.createElement("select", { className: "jp-mod-styled", value: defaultChatMode, onChange: event => setDefaultChatMode(event.target.value) },
|
|
1622
|
-
React.createElement("option", { value: "ask" }, "Ask"),
|
|
1623
|
-
React.createElement("option", { value: "agent" }, "Agent")))),
|
|
1624
|
-
React.createElement("div", { className: "model-config-section-column" }, " ")))),
|
|
1625
|
-
React.createElement("div", { className: "model-config-section" },
|
|
1626
|
-
React.createElement("div", { className: "model-config-section-header" }, "Chat model"),
|
|
1627
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1628
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1629
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1630
|
-
React.createElement("div", null, "Provider"),
|
|
1631
|
-
React.createElement("div", null,
|
|
1632
|
-
React.createElement("select", { className: "jp-mod-styled", onChange: event => updateModelOptionsForProvider(event.target.value, 'chat') },
|
|
1633
|
-
llmProviders.map((provider, index) => (React.createElement("option", { key: index, value: provider.id, selected: provider.id === chatModelProvider }, provider.name))),
|
|
1634
|
-
React.createElement("option", { key: -1, value: "none", selected: chatModelProvider === 'none' ||
|
|
1635
|
-
!llmProviders.find(provider => provider.id === chatModelProvider) }, "None")))),
|
|
1636
|
-
!['openai-compatible', 'litellm-compatible', 'none'].includes(chatModelProvider) &&
|
|
1637
|
-
chatModels.length > 0 && (React.createElement("div", { className: "model-config-section-column" },
|
|
1638
|
-
React.createElement("div", null, "Model"),
|
|
1639
|
-
![
|
|
1640
|
-
OPENAI_COMPATIBLE_CHAT_MODEL_ID,
|
|
1641
|
-
LITELLM_COMPATIBLE_CHAT_MODEL_ID
|
|
1642
|
-
].includes(chatModel) &&
|
|
1643
|
-
chatModels.length > 0 && (React.createElement("div", null,
|
|
1644
|
-
React.createElement("select", { className: "jp-mod-styled", onChange: event => setChatModel(event.target.value) }, chatModels.map((model, index) => (React.createElement("option", { key: index, value: model.id, selected: model.id === chatModel }, model.name))))))))),
|
|
1645
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1646
|
-
React.createElement("div", { className: "model-config-section-column" }, chatModelProvider === 'ollama' && chatModels.length === 0 && (React.createElement("div", { className: "ollama-warning-message" },
|
|
1647
|
-
"No Ollama models found! Make sure",
|
|
1648
|
-
' ',
|
|
1649
|
-
React.createElement("a", { href: "https://ollama.com/", target: "_blank" }, "Ollama"),
|
|
1650
|
-
' ',
|
|
1651
|
-
"is running and models are downloaded to your computer.",
|
|
1652
|
-
' ',
|
|
1653
|
-
React.createElement("a", { href: "javascript:void(0)", onClick: handleRefreshOllamaModelListClick }, "Try again"),
|
|
1654
|
-
' ',
|
|
1655
|
-
"once ready.")))),
|
|
1656
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1657
|
-
React.createElement("div", { className: "model-config-section-column" }, chatModelProperties.map((property, index) => (React.createElement("div", { className: "form-field-row", key: index },
|
|
1658
|
-
React.createElement("div", { className: "form-field-description" },
|
|
1659
|
-
property.name,
|
|
1660
|
-
" ",
|
|
1661
|
-
property.optional ? '(optional)' : ''),
|
|
1662
|
-
React.createElement("input", { name: "chat-model-id-input", placeholder: property.description, className: "jp-mod-styled", spellCheck: false, value: property.value, onChange: event => onModelPropertyChange('chat', property.id, event.target.value) })))))))),
|
|
1663
|
-
React.createElement("div", { className: "model-config-section" },
|
|
1664
|
-
React.createElement("div", { className: "model-config-section-header" }, "Auto-complete model"),
|
|
1665
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1666
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1667
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1668
|
-
React.createElement("div", null, "Provider"),
|
|
1669
|
-
React.createElement("div", null,
|
|
1670
|
-
React.createElement("select", { className: "jp-mod-styled", onChange: event => updateModelOptionsForProvider(event.target.value, 'inline-completion') },
|
|
1671
|
-
llmProviders.map((provider, index) => (React.createElement("option", { key: index, value: provider.id, selected: provider.id === inlineCompletionModelProvider }, provider.name))),
|
|
1672
|
-
React.createElement("option", { key: -1, value: "none", selected: inlineCompletionModelProvider === 'none' ||
|
|
1673
|
-
!llmProviders.find(provider => provider.id === inlineCompletionModelProvider) }, "None")))),
|
|
1674
|
-
!['openai-compatible', 'litellm-compatible', 'none'].includes(inlineCompletionModelProvider) && (React.createElement("div", { className: "model-config-section-column" },
|
|
1675
|
-
React.createElement("div", null, "Model"),
|
|
1676
|
-
![
|
|
1677
|
-
OPENAI_COMPATIBLE_INLINE_COMPLETION_MODEL_ID,
|
|
1678
|
-
LITELLM_COMPATIBLE_INLINE_COMPLETION_MODEL_ID
|
|
1679
|
-
].includes(inlineCompletionModel) && (React.createElement("div", null,
|
|
1680
|
-
React.createElement("select", { className: "jp-mod-styled", onChange: event => setInlineCompletionModel(event.target.value) }, inlineCompletionModels.map((model, index) => (React.createElement("option", { key: index, value: model.id, selected: model.id === inlineCompletionModel }, model.name))))))))),
|
|
1681
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1682
|
-
React.createElement("div", { className: "model-config-section-column" }, inlineCompletionModelProperties.map((property, index) => (React.createElement("div", { className: "form-field-row", key: index },
|
|
1683
|
-
React.createElement("div", { className: "form-field-description" },
|
|
1684
|
-
property.name,
|
|
1685
|
-
" ",
|
|
1686
|
-
property.optional ? '(optional)' : ''),
|
|
1687
|
-
React.createElement("input", { name: "inline-completion-model-id-input", placeholder: property.description, className: "jp-mod-styled", spellCheck: false, value: property.value, onChange: event => onModelPropertyChange('inline-completion', property.id, event.target.value) })))))))),
|
|
1688
|
-
(chatModelProvider === 'github-copilot' ||
|
|
1689
|
-
inlineCompletionModelProvider === 'github-copilot') && (React.createElement("div", { className: "model-config-section" },
|
|
1690
|
-
React.createElement("div", { className: "model-config-section-header access-token-config-header" },
|
|
1691
|
-
"GitHub Copilot login",
|
|
1692
|
-
' ',
|
|
1693
|
-
React.createElement("a", { href: "https://github.com/notebook-intelligence/notebook-intelligence/blob/main/README.md#remembering-github-copilot-login", target: "_blank" },
|
|
1694
|
-
' ',
|
|
1695
|
-
React.createElement(VscWarning, { className: "access-token-warning", title: "Click to learn more about security implications" }))),
|
|
1696
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1697
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1698
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1699
|
-
React.createElement("label", null,
|
|
1700
|
-
React.createElement("input", { type: "checkbox", checked: storeGitHubAccessToken, onChange: event => {
|
|
1701
|
-
setStoreGitHubAccessToken(event.target.checked);
|
|
1702
|
-
} }),
|
|
1703
|
-
"Remember my GitHub Copilot access token")))))),
|
|
1704
|
-
React.createElement("div", { className: "model-config-section" },
|
|
1705
|
-
React.createElement("div", { className: "model-config-section-header" },
|
|
1706
|
-
"MCP Servers (",
|
|
1707
|
-
mcpServerNames.length,
|
|
1708
|
-
") [",
|
|
1709
|
-
React.createElement("a", { href: "javascript:void(0)", onClick: props.onEditMCPConfigClicked }, "edit"),
|
|
1710
|
-
"]"),
|
|
1711
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1712
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1713
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1714
|
-
mcpServerNames.length === 0 && (React.createElement("div", null, "No MCP servers found. Add MCP servers in the configuration file.")),
|
|
1715
|
-
mcpServerNames.length > 0 && (React.createElement("div", null, mcpServerNames.sort().join(', ')))),
|
|
1716
|
-
React.createElement("div", { className: "model-config-section-column", style: { flexGrow: 'initial' } },
|
|
1717
|
-
React.createElement("button", { className: "jp-Dialog-button jp-mod-reject jp-mod-styled", onClick: handleReloadMCPServersClick },
|
|
1718
|
-
React.createElement("div", { className: "jp-Dialog-buttonLabel" }, "Reload")))))),
|
|
1719
|
-
React.createElement("div", { className: "model-config-section" },
|
|
1720
|
-
React.createElement("div", { className: "model-config-section-header" }, "Config file path"),
|
|
1721
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1722
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1723
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1724
|
-
React.createElement("span", { className: "user-code-span", onClick: () => {
|
|
1725
|
-
navigator.clipboard.writeText(path.join(NBIAPI.config.userConfigDir, 'config.json'));
|
|
1726
|
-
return true;
|
|
1727
|
-
} },
|
|
1728
|
-
path.join(NBIAPI.config.userConfigDir, 'config.json'),
|
|
1729
|
-
' ',
|
|
1730
|
-
React.createElement("span", { className: "copy-icon", dangerouslySetInnerHTML: { __html: copySvgstr } }))))),
|
|
1731
|
-
React.createElement("div", { className: "model-config-section-header" }, "MCP config file path"),
|
|
1732
|
-
React.createElement("div", { className: "model-config-section-body" },
|
|
1733
|
-
React.createElement("div", { className: "model-config-section-row" },
|
|
1734
|
-
React.createElement("div", { className: "model-config-section-column" },
|
|
1735
|
-
React.createElement("span", { className: "user-code-span", onClick: () => {
|
|
1736
|
-
navigator.clipboard.writeText(path.join(NBIAPI.config.userConfigDir, 'mcp.json'));
|
|
1737
|
-
return true;
|
|
1738
|
-
} },
|
|
1739
|
-
path.join(NBIAPI.config.userConfigDir, 'mcp.json'),
|
|
1740
|
-
' ',
|
|
1741
|
-
React.createElement("span", { className: "copy-icon", dangerouslySetInnerHTML: { __html: copySvgstr } }))))))),
|
|
1742
|
-
React.createElement("div", { className: "config-dialog-footer" },
|
|
1743
|
-
React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: handleSaveClick },
|
|
1744
|
-
React.createElement("div", { className: "jp-Dialog-buttonLabel" }, "Save")))));
|
|
1745
|
-
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright (c) Mehmet Bektas <mbektasgh@outlook.com>
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { MdOutlineCheckBoxOutlineBlank, MdCheckBox } from 'react-icons/md';
|
|
4
|
+
export function CheckBoxItem(props) {
|
|
5
|
+
const indent = props.indent || 0;
|
|
6
|
+
return (React.createElement("div", { className: `checkbox-item checkbox-item-indent-${indent} ${props.header ? 'checkbox-item-header' : ''}`, title: props.title, onClick: event => props.onClick(event) },
|
|
7
|
+
React.createElement("div", { className: "checkbox-item-toggle" },
|
|
8
|
+
props.checked ? (React.createElement(MdCheckBox, { className: "checkbox-icon" })) : (React.createElement(MdOutlineCheckBoxOutlineBlank, { className: "checkbox-icon" })),
|
|
9
|
+
props.label),
|
|
10
|
+
props.title && (React.createElement("div", { className: "checkbox-item-description" }, props.title))));
|
|
11
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright (c) Mehmet Bektas <mbektasgh@outlook.com>
|
|
2
|
+
export function mcpServerSettingsToEnabledState(mcpServers, mcpServerSettings) {
|
|
3
|
+
const mcpServerEnabledState = new Map();
|
|
4
|
+
for (const server of mcpServers) {
|
|
5
|
+
const mcpServerToolEnabledState = mcpServerSettingsToServerToolEnabledState(mcpServers, mcpServerSettings, server.id);
|
|
6
|
+
if (mcpServerToolEnabledState) {
|
|
7
|
+
mcpServerEnabledState.set(server.id, mcpServerToolEnabledState);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return mcpServerEnabledState;
|
|
11
|
+
}
|
|
12
|
+
export function mcpServerSettingsToServerToolEnabledState(mcpServers, mcpServerSettings, serverId) {
|
|
13
|
+
var _a;
|
|
14
|
+
const server = mcpServers.find((server) => server.id === serverId);
|
|
15
|
+
let mcpServerToolEnabledState = null;
|
|
16
|
+
if (!server) {
|
|
17
|
+
return mcpServerToolEnabledState;
|
|
18
|
+
}
|
|
19
|
+
if (mcpServerSettings[server.id]) {
|
|
20
|
+
const serverSettings = mcpServerSettings[server.id];
|
|
21
|
+
if (!serverSettings.disabled) {
|
|
22
|
+
mcpServerToolEnabledState = new Set();
|
|
23
|
+
for (const tool of server.tools) {
|
|
24
|
+
if (!((_a = serverSettings.disabled_tools) === null || _a === void 0 ? void 0 : _a.includes(tool.name))) {
|
|
25
|
+
mcpServerToolEnabledState.add(tool.name);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
mcpServerToolEnabledState = new Set();
|
|
32
|
+
for (const tool of server.tools) {
|
|
33
|
+
mcpServerToolEnabledState.add(tool.name);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return mcpServerToolEnabledState;
|
|
37
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Copyright (c) Mehmet Bektas <mbektasgh@outlook.com>
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export function PillItem(props) {
|
|
4
|
+
return (React.createElement("div", { className: `pill-item ${props.checked ? 'checked' : ''}`, title: props.title, onClick: event => props.onClick(event) }, props.label));
|
|
5
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ReactWidget } from '@jupyterlab/apputils';
|
|
3
|
+
export declare class SettingsPanel extends ReactWidget {
|
|
4
|
+
constructor(options: {
|
|
5
|
+
onSave: () => void;
|
|
6
|
+
onEditMCPConfigClicked: () => void;
|
|
7
|
+
});
|
|
8
|
+
render(): JSX.Element;
|
|
9
|
+
private _onSave;
|
|
10
|
+
private _onEditMCPConfigClicked;
|
|
11
|
+
}
|