@notebook-intelligence/notebook-intelligence 2.4.2 → 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.
@@ -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, VscWarning, VscSettingsGear, VscPassFilled, VscTools, VscTrash } from 'react-icons/vsc';
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 * as path from 'path';
17
- const OPENAI_COMPATIBLE_CHAT_MODEL_ID = 'openai-compatible-chat-model';
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 [toolConfig, setToolConfig] = useState({
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
- NBIAPI.configChanged.connect(() => {
391
- setToolConfig(NBIAPI.config.toolConfig);
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 toolConfig.extensions) {
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
- }, [toolConfig]);
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 = toolConfig.mcpServers.find(server => server.id === id);
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 = toolConfig.mcpServers.find(server => server.id === id);
469
+ const mcpServer = toolConfigRef.current.mcpServers.find(server => server.id === id);
482
470
  const newConfig = { ...toolSelections };
483
- newConfig.mcpServers[id] = structuredClone(mcpServer.tools.map((tool) => tool.name));
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 = toolConfig.extensions.find(extension => extension.id === extensionId);
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 = toolConfig.extensions.find(ext => ext.id === extensionId);
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 = toolConfig.extensions.find(ext => ext.id === extensionId);
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 = toolConfig.extensions.find(ext => ext.id === extensionId);
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
- NBIAPI.configChanged.connect(() => {
1150
- setGHLoginRequired(getGHLoginRequired());
1151
- setChatEnabled(getChatEnabled());
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" }, toolConfig.builtinToolsets.map((toolset) => (React.createElement(CheckBoxItem, { key: toolset.id, label: toolset.name, checked: getBuiltinToolsetState(toolset.id), header: true, onClick: () => {
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
- toolConfig.mcpServers.length > 0 && (React.createElement("div", { className: "mode-tools-group-header" }, "MCP Servers")),
1246
- toolConfig.mcpServers.map((mcpServer, index) => (React.createElement("div", { className: "mode-tools-group" },
1247
- React.createElement(CheckBoxItem, { label: mcpServer.id, header: true, checked: getMCPServerState(mcpServer.id), onClick: () => onMCPServerClicked(mcpServer.id) }),
1248
- mcpServer.tools.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)) })))))),
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
- toolConfig.extensions.map((extension, index) => (React.createElement("div", { className: "mode-tools-group" },
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,2 @@
1
+ import React from 'react';
2
+ export declare function CheckBoxItem(props: any): React.JSX.Element;
@@ -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,2 @@
1
+ export declare function mcpServerSettingsToEnabledState(mcpServers: any, mcpServerSettings: any): Map<string, Set<string>>;
2
+ export declare function mcpServerSettingsToServerToolEnabledState(mcpServers: any, mcpServerSettings: any, serverId: string): Set<string>;
@@ -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,2 @@
1
+ import React from 'react';
2
+ export declare function PillItem(props: any): React.JSX.Element;
@@ -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
+ }