@notebook-intelligence/notebook-intelligence 4.0.0 → 4.1.1

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.
@@ -14,7 +14,7 @@ import { VscSend, VscStopCircle, VscEye, VscEyeClosed, VscTriangleRight, VscTria
14
14
  import { extractLLMGeneratedCode, isDarkTheme } from './utils';
15
15
  import { CheckBoxItem } from './components/checkbox';
16
16
  import { mcpServerSettingsToEnabledState } from './components/mcp-util';
17
- import claudeSvg from '../style/claude.svg';
17
+ import claudeSvgStr from '../style/icons/claude.svg';
18
18
  import { AskUserQuestion } from './components/ask-user-question';
19
19
  export var RunChatCompletionType;
20
20
  (function (RunChatCompletionType) {
@@ -726,6 +726,8 @@ function SidebarComponent(props) {
726
726
  prefixes.push(`/${command}`);
727
727
  }
728
728
  }
729
+ prefixes.push('/enter-plan-mode');
730
+ prefixes.push('/exit-plan-mode');
729
731
  }
730
732
  else {
731
733
  if (chatMode === 'ask') {
@@ -1171,6 +1173,7 @@ function SidebarComponent(props) {
1171
1173
  }
1172
1174
  const messageId = UUID.uuid4();
1173
1175
  request.messageId = messageId;
1176
+ request.content = message;
1174
1177
  const newList = [
1175
1178
  ...chatMessages,
1176
1179
  {
@@ -1198,16 +1201,28 @@ function SidebarComponent(props) {
1198
1201
  if (!delta) {
1199
1202
  return;
1200
1203
  }
1201
- const responseMessage = (_e = (_d = (_c = response.data['choices']) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d['delta']) === null || _e === void 0 ? void 0 : _e['content'];
1202
- if (!responseMessage) {
1203
- return;
1204
+ if (delta['nbiContent']) {
1205
+ const nbiContent = delta['nbiContent'];
1206
+ contents.push({
1207
+ id: UUID.uuid4(),
1208
+ type: nbiContent.type,
1209
+ content: nbiContent.content,
1210
+ contentDetail: nbiContent.detail,
1211
+ created: new Date(response.created)
1212
+ });
1213
+ }
1214
+ else {
1215
+ const responseMessage = (_e = (_d = (_c = response.data['choices']) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d['delta']) === null || _e === void 0 ? void 0 : _e['content'];
1216
+ if (!responseMessage) {
1217
+ return;
1218
+ }
1219
+ contents.push({
1220
+ id: response.id,
1221
+ type: ResponseStreamDataType.MarkdownPart,
1222
+ content: responseMessage,
1223
+ created: new Date(response.created)
1224
+ });
1204
1225
  }
1205
- contents.push({
1206
- id: response.id,
1207
- type: ResponseStreamDataType.MarkdownPart,
1208
- content: responseMessage,
1209
- created: new Date(response.created)
1210
- });
1211
1226
  }
1212
1227
  else if (response.type === BackendMessageType.StreamEnd) {
1213
1228
  setCopilotRequestInProgress(false);
@@ -1344,7 +1359,7 @@ function SidebarComponent(props) {
1344
1359
  : toolSelectionTitle },
1345
1360
  React.createElement(VscTools, null),
1346
1361
  selectedToolCount > 0 && React.createElement(React.Fragment, null, selectedToolCount))),
1347
- NBIAPI.config.isInClaudeCodeMode && (React.createElement("span", { title: "Claude mode", className: "claude-icon", dangerouslySetInnerHTML: { __html: claudeSvg } }))),
1362
+ NBIAPI.config.isInClaudeCodeMode && (React.createElement("span", { title: "Claude mode", className: "claude-icon", dangerouslySetInnerHTML: { __html: claudeSvgStr } }))),
1348
1363
  React.createElement("div", null,
1349
1364
  React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled send-button", onClick: () => handleSubmitStopChatButtonClick(), disabled: prompt.length === 0 && !copilotRequestInProgress }, copilotRequestInProgress ? React.createElement(VscStopCircle, null) : React.createElement(VscSend, null)))),
1350
1365
  showPopover && prefixSuggestions.length > 0 && (React.createElement("div", { className: "user-input-autocomplete" }, prefixSuggestions.map((prefix, index) => (React.createElement("div", { key: `key-${index}`, className: `user-input-autocomplete-item ${index === selectedPrefixSuggestionIndex ? 'selected' : ''}`, "data-value": prefix, onClick: event => prefixSuggestionSelected(event) }, prefix))))),
@@ -40,10 +40,11 @@ export function AskUserQuestion(props) {
40
40
  React.createElement("div", { className: "ask-user-question-options" }, question.options.map((option) => {
41
41
  var _a, _b;
42
42
  return (React.createElement("div", { className: "ask-user-question-option", key: option.label },
43
- React.createElement("div", null,
43
+ React.createElement("div", { className: "ask-user-question-option-input-container" },
44
44
  React.createElement("input", { id: option.label, type: "checkbox", checked: (_b = (_a = selectedAnswers[question.question]) === null || _a === void 0 ? void 0 : _a.includes(option.label)) !== null && _b !== void 0 ? _b : false, onChange: () => onOptionSelected(question, option) }),
45
- React.createElement("label", { htmlFor: option.label }, option.label)),
46
- React.createElement("div", { className: "ask-user-question-option-description" }, option.description)));
45
+ React.createElement("label", { htmlFor: option.label, className: "ask-user-question-option-label-container" },
46
+ React.createElement("div", { className: "ask-user-question-option-label" }, option.label),
47
+ React.createElement("div", { className: "ask-user-question-option-description" }, option.description)))));
47
48
  })))))),
48
49
  React.createElement("div", { className: "ask-user-question-footer" },
49
50
  React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: () => {
@@ -4,11 +4,11 @@ import { ReactWidget } from '@jupyterlab/apputils';
4
4
  import { VscWarning } from 'react-icons/vsc';
5
5
  import * as path from 'path';
6
6
  import copySvgstr from '../../style/icons/copy.svg';
7
+ import claudeSvgStr from '../../style/icons/claude.svg';
7
8
  import { ClaudeModelType, ClaudeToolType, NBIAPI } from '../api';
8
9
  import { CheckBoxItem } from './checkbox';
9
10
  import { PillItem } from './pill';
10
11
  import { mcpServerSettingsToEnabledState } from './mcp-util';
11
- import claudeSvg from '../../style/claude.svg';
12
12
  const OPENAI_COMPATIBLE_CHAT_MODEL_ID = 'openai-compatible-chat-model';
13
13
  const LITELLM_COMPATIBLE_CHAT_MODEL_ID = 'litellm-compatible-chat-model';
14
14
  const OPENAI_COMPATIBLE_INLINE_COMPLETION_MODEL_ID = 'openai-compatible-inline-completion-model';
@@ -47,7 +47,7 @@ function SettingsPanelTabsComponent(props) {
47
47
  setActiveTab('claude');
48
48
  props.onTabSelected('claude');
49
49
  } },
50
- React.createElement("span", { className: "claude-icon", dangerouslySetInnerHTML: { __html: claudeSvg } }),
50
+ React.createElement("span", { className: "claude-icon", dangerouslySetInnerHTML: { __html: claudeSvgStr } }),
51
51
  "Claude"),
52
52
  React.createElement("div", { className: `nbi-settings-panel-tab ${activeTab === 'mcp-servers' ? 'active' : ''}`, onClick: () => {
53
53
  setActiveTab('mcp-servers');
package/lib/index.js CHANGED
@@ -14,12 +14,14 @@ import { LabIcon } from '@jupyterlab/ui-components';
14
14
  import { Menu, Panel, Widget } from '@lumino/widgets';
15
15
  import { CommandRegistry } from '@lumino/commands';
16
16
  import { IStatusBar } from '@jupyterlab/statusbar';
17
+ import stripAnsi from 'strip-ansi';
17
18
  import { ChatSidebar, FormInputDialogBody, GitHubCopilotLoginDialogBody, GitHubCopilotStatusBarItem, InlinePromptWidget, RunChatCompletionType } from './chat-sidebar';
18
19
  import { NBIAPI, GitHubCopilotLoginStatus } from './api';
19
20
  import { BackendMessageType, GITHUB_COPILOT_PROVIDER_ID, INotebookIntelligence, RequestDataType, TelemetryEventType } from './tokens';
20
21
  import sparklesSvgstr from '../style/icons/sparkles.svg';
21
22
  import copilotSvgstr from '../style/icons/copilot.svg';
22
23
  import sparklesWarningSvgstr from '../style/icons/sparkles-warning.svg';
24
+ import claudeSvgstr from '../style/icons/claude.svg';
23
25
  import { applyCodeToSelectionInEditor, cellOutputAsText, compareSelections, extractLLMGeneratedCode, getSelectionInEditor, getTokenCount, getWholeNotebookContent, isSelectionEmpty, markdownToComment, waitForDuration } from './utils';
24
26
  import { UUID } from '@lumino/coreutils';
25
27
  import * as path from 'path';
@@ -66,6 +68,10 @@ const sparkleIcon = new LabIcon({
66
68
  name: 'notebook-intelligence:sparkles-icon',
67
69
  svgstr: sparklesSvgstr
68
70
  });
71
+ const claudeIcon = new LabIcon({
72
+ name: 'notebook-intelligence:claude-icon',
73
+ svgstr: claudeSvgstr
74
+ });
69
75
  const sparkleWarningIcon = new LabIcon({
70
76
  name: 'notebook-intelligence:sparkles-warning-icon',
71
77
  svgstr: sparklesWarningSvgstr
@@ -338,9 +344,11 @@ class NBIInlineCompletionProvider {
338
344
  return '@notebook-intelligence/notebook-intelligence';
339
345
  }
340
346
  get icon() {
341
- return NBIAPI.config.usingGitHubCopilotModel
342
- ? githubCopilotIcon
343
- : sparkleIcon;
347
+ return NBIAPI.config.isInClaudeCodeMode
348
+ ? claudeIcon
349
+ : NBIAPI.config.usingGitHubCopilotModel
350
+ ? githubCopilotIcon
351
+ : sparkleIcon;
344
352
  }
345
353
  }
346
354
  class TelemetryEmitter {
@@ -743,19 +751,33 @@ const plugin = {
743
751
  cwd: args.cwd || ActiveDocumentWatcher.currentDirectory
744
752
  });
745
753
  const session = (_a = terminal === null || terminal === void 0 ? void 0 : terminal.content) === null || _a === void 0 ? void 0 : _a.session;
746
- session.messageReceived.connect((sender, message) => {
747
- console.log('Message received in Jupyter terminal:', message);
748
- });
749
- if (session) {
754
+ if (!session) {
755
+ return 'Failed to execute command in Jupyter terminal';
756
+ }
757
+ return new Promise((resolve, reject) => {
758
+ let lastMessageReceivedTime = Date.now();
759
+ let lastMessageCheckInterval = null;
760
+ const messageCheckTimeout = 5000;
761
+ const messageCheckInterval = 1000;
762
+ let output = '';
763
+ session.messageReceived.connect((sender, message) => {
764
+ const content = stripAnsi(message.content.join(''));
765
+ output += content;
766
+ lastMessageReceivedTime = Date.now();
767
+ });
750
768
  session.send({
751
769
  type: 'stdin',
752
770
  content: [command + '\n'] // Add newline to execute the command
753
771
  });
754
- return 'Command executed in Jupyter terminal';
755
- }
756
- else {
757
- return 'Failed to execute command in Jupyter terminal';
758
- }
772
+ // wait for the messageCheckInterval and if no message received, return the output.
773
+ // otherwise wait for the next message.
774
+ lastMessageCheckInterval = setInterval(() => {
775
+ if (Date.now() - lastMessageReceivedTime > messageCheckTimeout) {
776
+ clearInterval(lastMessageCheckInterval);
777
+ resolve(`Command executed in Jupyter terminal, output: ${output}`);
778
+ }
779
+ }, messageCheckInterval);
780
+ });
759
781
  }
760
782
  });
761
783
  const isNewEmptyNotebook = (model) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notebook-intelligence/notebook-intelligence",
3
- "version": "4.0.0",
3
+ "version": "4.1.1",
4
4
  "description": "AI coding assistant for JupyterLab",
5
5
  "keywords": [
6
6
  "AI",
@@ -72,6 +72,7 @@
72
72
  "react-markdown": "^9.0.1",
73
73
  "react-syntax-highlighter": "^15.4.4",
74
74
  "remark-gfm": "4.0.0",
75
+ "strip-ansi": "7.0.1",
75
76
  "tiktoken": "1.0.18"
76
77
  },
77
78
  "devDependencies": {
@@ -55,7 +55,7 @@ import {
55
55
  import { extractLLMGeneratedCode, isDarkTheme } from './utils';
56
56
  import { CheckBoxItem } from './components/checkbox';
57
57
  import { mcpServerSettingsToEnabledState } from './components/mcp-util';
58
- import claudeSvg from '../style/claude.svg';
58
+ import claudeSvgStr from '../style/icons/claude.svg';
59
59
  import { AskUserQuestion } from './components/ask-user-question';
60
60
 
61
61
  export enum RunChatCompletionType {
@@ -1222,6 +1222,8 @@ function SidebarComponent(props: any) {
1222
1222
  prefixes.push(`/${command}`);
1223
1223
  }
1224
1224
  }
1225
+ prefixes.push('/enter-plan-mode');
1226
+ prefixes.push('/exit-plan-mode');
1225
1227
  } else {
1226
1228
  if (chatMode === 'ask') {
1227
1229
  const chatParticipants = NBIAPI.config.chatParticipants;
@@ -1743,6 +1745,7 @@ function SidebarComponent(props: any) {
1743
1745
  }
1744
1746
  const messageId = UUID.uuid4();
1745
1747
  request.messageId = messageId;
1748
+ request.content = message;
1746
1749
  const newList = [
1747
1750
  ...chatMessages,
1748
1751
  {
@@ -1773,17 +1776,28 @@ function SidebarComponent(props: any) {
1773
1776
  return;
1774
1777
  }
1775
1778
 
1776
- const responseMessage =
1777
- response.data['choices']?.[0]?.['delta']?.['content'];
1778
- if (!responseMessage) {
1779
- return;
1779
+ if (delta['nbiContent']) {
1780
+ const nbiContent = delta['nbiContent'];
1781
+ contents.push({
1782
+ id: UUID.uuid4(),
1783
+ type: nbiContent.type,
1784
+ content: nbiContent.content,
1785
+ contentDetail: nbiContent.detail,
1786
+ created: new Date(response.created)
1787
+ });
1788
+ } else {
1789
+ const responseMessage =
1790
+ response.data['choices']?.[0]?.['delta']?.['content'];
1791
+ if (!responseMessage) {
1792
+ return;
1793
+ }
1794
+ contents.push({
1795
+ id: response.id,
1796
+ type: ResponseStreamDataType.MarkdownPart,
1797
+ content: responseMessage,
1798
+ created: new Date(response.created)
1799
+ });
1780
1800
  }
1781
- contents.push({
1782
- id: response.id,
1783
- type: ResponseStreamDataType.MarkdownPart,
1784
- content: responseMessage,
1785
- created: new Date(response.created)
1786
- });
1787
1801
  } else if (response.type === BackendMessageType.StreamEnd) {
1788
1802
  setCopilotRequestInProgress(false);
1789
1803
  }
@@ -2061,7 +2075,7 @@ function SidebarComponent(props: any) {
2061
2075
  <span
2062
2076
  title="Claude mode"
2063
2077
  className="claude-icon"
2064
- dangerouslySetInnerHTML={{ __html: claudeSvg }}
2078
+ dangerouslySetInnerHTML={{ __html: claudeSvgStr }}
2065
2079
  ></span>
2066
2080
  )}
2067
2081
  </div>
@@ -52,7 +52,7 @@ export function AskUserQuestion(props: any) {
52
52
  <div className="ask-user-question-options">
53
53
  {question.options.map((option: any) => (
54
54
  <div className="ask-user-question-option" key={option.label}>
55
- <div>
55
+ <div className="ask-user-question-option-input-container">
56
56
  <input
57
57
  id={option.label}
58
58
  type="checkbox"
@@ -63,10 +63,17 @@ export function AskUserQuestion(props: any) {
63
63
  }
64
64
  onChange={() => onOptionSelected(question, option)}
65
65
  />
66
- <label htmlFor={option.label}>{option.label}</label>
67
- </div>
68
- <div className="ask-user-question-option-description">
69
- {option.description}
66
+ <label
67
+ htmlFor={option.label}
68
+ className="ask-user-question-option-label-container"
69
+ >
70
+ <div className="ask-user-question-option-label">
71
+ {option.label}
72
+ </div>
73
+ <div className="ask-user-question-option-description">
74
+ {option.description}
75
+ </div>
76
+ </label>
70
77
  </div>
71
78
  </div>
72
79
  ))}
@@ -6,11 +6,11 @@ import { VscWarning } from 'react-icons/vsc';
6
6
  import * as path from 'path';
7
7
 
8
8
  import copySvgstr from '../../style/icons/copy.svg';
9
+ import claudeSvgStr from '../../style/icons/claude.svg';
9
10
  import { ClaudeModelType, ClaudeToolType, NBIAPI } from '../api';
10
11
  import { CheckBoxItem } from './checkbox';
11
12
  import { PillItem } from './pill';
12
13
  import { mcpServerSettingsToEnabledState } from './mcp-util';
13
- import claudeSvg from '../../style/claude.svg';
14
14
 
15
15
  const OPENAI_COMPATIBLE_CHAT_MODEL_ID = 'openai-compatible-chat-model';
16
16
  const LITELLM_COMPATIBLE_CHAT_MODEL_ID = 'litellm-compatible-chat-model';
@@ -103,7 +103,7 @@ function SettingsPanelTabsComponent(props: any) {
103
103
  >
104
104
  <span
105
105
  className="claude-icon"
106
- dangerouslySetInnerHTML={{ __html: claudeSvg }}
106
+ dangerouslySetInnerHTML={{ __html: claudeSvgStr }}
107
107
  ></span>
108
108
  Claude
109
109
  </div>
package/src/index.ts CHANGED
@@ -41,7 +41,7 @@ import { LabIcon } from '@jupyterlab/ui-components';
41
41
  import { Menu, Panel, Widget } from '@lumino/widgets';
42
42
  import { CommandRegistry } from '@lumino/commands';
43
43
  import { IStatusBar } from '@jupyterlab/statusbar';
44
-
44
+ import stripAnsi from 'strip-ansi';
45
45
  import {
46
46
  ChatSidebar,
47
47
  FormInputDialogBody,
@@ -66,6 +66,7 @@ import {
66
66
  import sparklesSvgstr from '../style/icons/sparkles.svg';
67
67
  import copilotSvgstr from '../style/icons/copilot.svg';
68
68
  import sparklesWarningSvgstr from '../style/icons/sparkles-warning.svg';
69
+ import claudeSvgstr from '../style/icons/claude.svg';
69
70
 
70
71
  import {
71
72
  applyCodeToSelectionInEditor,
@@ -147,6 +148,11 @@ const sparkleIcon = new LabIcon({
147
148
  svgstr: sparklesSvgstr
148
149
  });
149
150
 
151
+ const claudeIcon = new LabIcon({
152
+ name: 'notebook-intelligence:claude-icon',
153
+ svgstr: claudeSvgstr
154
+ });
155
+
150
156
  const sparkleWarningIcon = new LabIcon({
151
157
  name: 'notebook-intelligence:sparkles-warning-icon',
152
158
  svgstr: sparklesWarningSvgstr
@@ -485,9 +491,11 @@ class NBIInlineCompletionProvider
485
491
  }
486
492
 
487
493
  get icon(): LabIcon.ILabIcon {
488
- return NBIAPI.config.usingGitHubCopilotModel
489
- ? githubCopilotIcon
490
- : sparkleIcon;
494
+ return NBIAPI.config.isInClaudeCodeMode
495
+ ? claudeIcon
496
+ : NBIAPI.config.usingGitHubCopilotModel
497
+ ? githubCopilotIcon
498
+ : sparkleIcon;
491
499
  }
492
500
 
493
501
  private _lastRequestInfo: {
@@ -988,20 +996,38 @@ const plugin: JupyterFrontEndPlugin<INotebookIntelligence> = {
988
996
 
989
997
  const session: ITerminalConnection = terminal?.content?.session;
990
998
 
991
- session.messageReceived.connect((sender, message) => {
992
- console.log('Message received in Jupyter terminal:', message);
993
- });
999
+ if (!session) {
1000
+ return 'Failed to execute command in Jupyter terminal';
1001
+ }
1002
+
1003
+ return new Promise<string>((resolve, reject) => {
1004
+ let lastMessageReceivedTime = Date.now();
1005
+ let lastMessageCheckInterval: NodeJS.Timeout | null = null;
1006
+ const messageCheckTimeout = 5000;
1007
+ const messageCheckInterval = 1000;
1008
+ let output = '';
1009
+ session.messageReceived.connect((sender, message) => {
1010
+ const content = stripAnsi(message.content.join(''));
1011
+ output += content;
1012
+ lastMessageReceivedTime = Date.now();
1013
+ });
994
1014
 
995
- if (session) {
996
1015
  session.send({
997
1016
  type: 'stdin',
998
1017
  content: [command + '\n'] // Add newline to execute the command
999
1018
  });
1000
1019
 
1001
- return 'Command executed in Jupyter terminal';
1002
- } else {
1003
- return 'Failed to execute command in Jupyter terminal';
1004
- }
1020
+ // wait for the messageCheckInterval and if no message received, return the output.
1021
+ // otherwise wait for the next message.
1022
+ lastMessageCheckInterval = setInterval(() => {
1023
+ if (Date.now() - lastMessageReceivedTime > messageCheckTimeout) {
1024
+ clearInterval(lastMessageCheckInterval);
1025
+ resolve(
1026
+ `Command executed in Jupyter terminal, output: ${output}`
1027
+ );
1028
+ }
1029
+ }, messageCheckInterval);
1030
+ });
1005
1031
  }
1006
1032
  });
1007
1033
 
package/style/base.css CHANGED
@@ -1011,8 +1011,29 @@ svg.access-token-warning {
1011
1011
  flex-direction: column;
1012
1012
  }
1013
1013
 
1014
+ .ask-user-question-option-input-container {
1015
+ display: flex;
1016
+ flex-direction: row;
1017
+ align-items: center;
1018
+ gap: 5px;
1019
+ }
1020
+
1021
+ .ask-user-question-option-input-container input {
1022
+ transform: scale(1.25);
1023
+ }
1024
+
1025
+ .ask-user-question-option-label-container {
1026
+ width: calc(100% - 15px);
1027
+ margin-left: 2px;
1028
+ display: flex;
1029
+ flex-direction: column;
1030
+ }
1031
+
1032
+ .ask-user-question-option-label {
1033
+ font-weight: bold;
1034
+ }
1035
+
1014
1036
  .ask-user-question-option-description {
1015
- padding-left: 5px;
1016
1037
  color: var(--jp-ui-font-color2);
1017
1038
  padding-bottom: 4px;
1018
1039
  overflow: hidden;
@@ -0,0 +1 @@
1
+ <svg width="16" height="16" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg"><g id="g314"><path id="path147" fill="currentColor" stroke="none" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/></g></svg>
package/style/claude.svg DELETED
@@ -1 +0,0 @@
1
- <svg width="1200" height="1200" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg"><g id="g314"><path id="path147" fill="currentColor" stroke="none" d="M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z"/></g></svg>