@notebook-intelligence/notebook-intelligence 4.1.2 → 4.2.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.
package/lib/api.js CHANGED
@@ -5,7 +5,7 @@ import { requestAPI } from './handler';
5
5
  import { URLExt } from '@jupyterlab/coreutils';
6
6
  import { UUID } from '@lumino/coreutils';
7
7
  import { Signal } from '@lumino/signaling';
8
- import { GITHUB_COPILOT_PROVIDER_ID, RequestDataType, BackendMessageType } from './tokens';
8
+ import { GITHUB_COPILOT_PROVIDER_ID, RequestDataType, BackendMessageType, AssistantMode } from './tokens';
9
9
  export var GitHubCopilotLoginStatus;
10
10
  (function (GitHubCopilotLoginStatus) {
11
11
  GitHubCopilotLoginStatus["NotLoggedIn"] = "NOT_LOGGED_IN";
@@ -360,6 +360,13 @@ class NBIAPI {
360
360
  }));
361
361
  }
362
362
  static async emitTelemetryEvent(event) {
363
+ const assistantMode = this.config.isInClaudeCodeMode
364
+ ? AssistantMode.Claude
365
+ : AssistantMode.Default;
366
+ event.data = {
367
+ ...(event.data || {}),
368
+ assistantMode
369
+ };
363
370
  return new Promise((resolve, reject) => {
364
371
  requestAPI('emit-telemetry-event', {
365
372
  method: 'POST',
@@ -327,6 +327,11 @@ function ChatResponse(props) {
327
327
  runCommand('notebook-intelligence:chat-user-input', item.content.confirmArgs);
328
328
  } },
329
329
  React.createElement("div", { className: "jp-Dialog-buttonLabel" }, item.content.confirmLabel)),
330
+ item.content.confirmSessionArgs ? (React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: () => {
331
+ markFormConfirmed(item.id);
332
+ runCommand('notebook-intelligence:chat-user-input', item.content.confirmSessionArgs);
333
+ } },
334
+ React.createElement("div", { className: "jp-Dialog-buttonLabel" }, item.content.confirmSessionLabel))) : null,
330
335
  React.createElement("button", { className: "jp-Dialog-button jp-mod-reject jp-mod-styled", onClick: () => {
331
336
  markFormCanceled(item.id);
332
337
  runCommand('notebook-intelligence:chat-user-input', item.content.cancelArgs);
@@ -1319,7 +1324,7 @@ function SidebarComponent(props) {
1319
1324
  "Chat is disabled as you don't have a model configured.",
1320
1325
  React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: handleConfigurationClick },
1321
1326
  React.createElement("div", { className: "jp-Dialog-buttonLabel" }, "Configure models")))),
1322
- ghLoginRequired && (React.createElement("div", { className: "sidebar-login-info" },
1327
+ !NBIAPI.config.isInClaudeCodeMode && ghLoginRequired && (React.createElement("div", { className: "sidebar-login-info" },
1323
1328
  React.createElement("div", null, "You are not logged in to GitHub Copilot. Please login now to activate chat."),
1324
1329
  React.createElement("div", { className: "sidebar-login-buttons" },
1325
1330
  React.createElement("button", { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: handleLoginClick },
@@ -431,7 +431,7 @@ function SettingsPanelComponentClaude(props) {
431
431
  settingSources,
432
432
  tools
433
433
  ]);
434
- return (React.createElement("div", { className: "config-dialog" },
434
+ return (React.createElement("div", { className: "config-dialog claude-mode-config-dialog" },
435
435
  React.createElement("div", { className: "config-dialog-body" },
436
436
  React.createElement("div", { className: "model-config-section" },
437
437
  React.createElement("div", { className: "model-config-section-header" }, "Enable Claude mode"),
package/lib/index.js CHANGED
@@ -760,11 +760,12 @@ const plugin = {
760
760
  const messageCheckTimeout = 5000;
761
761
  const messageCheckInterval = 1000;
762
762
  let output = '';
763
- session.messageReceived.connect((sender, message) => {
763
+ const messageReceivedHandler = (sender, message) => {
764
764
  const content = stripAnsi(message.content.join(''));
765
765
  output += content;
766
766
  lastMessageReceivedTime = Date.now();
767
- });
767
+ };
768
+ session.messageReceived.connect(messageReceivedHandler);
768
769
  session.send({
769
770
  type: 'stdin',
770
771
  content: [command + '\n'] // Add newline to execute the command
@@ -774,6 +775,7 @@ const plugin = {
774
775
  lastMessageCheckInterval = setInterval(() => {
775
776
  if (Date.now() - lastMessageReceivedTime > messageCheckTimeout) {
776
777
  clearInterval(lastMessageCheckInterval);
778
+ session.messageReceived.disconnect(messageReceivedHandler);
777
779
  resolve(`Command executed in Jupyter terminal, output: ${output}`);
778
780
  }
779
781
  }, messageCheckInterval);
package/lib/tokens.d.ts CHANGED
@@ -96,6 +96,10 @@ export declare enum BuiltinToolsetType {
96
96
  }
97
97
  export declare const GITHUB_COPILOT_PROVIDER_ID = "github-copilot";
98
98
  export declare const CLAUDE_CODE_CHAT_PARTICIPANT_ID = "claude-code";
99
+ export declare enum AssistantMode {
100
+ Default = "default",
101
+ Claude = "claude"
102
+ }
99
103
  export declare enum TelemetryEventType {
100
104
  InlineCompletionRequest = "inline-completion-request",
101
105
  ExplainThisRequest = "explain-this-request",
package/lib/tokens.js CHANGED
@@ -61,6 +61,11 @@ export var BuiltinToolsetType;
61
61
  })(BuiltinToolsetType || (BuiltinToolsetType = {}));
62
62
  export const GITHUB_COPILOT_PROVIDER_ID = 'github-copilot';
63
63
  export const CLAUDE_CODE_CHAT_PARTICIPANT_ID = 'claude-code';
64
+ export var AssistantMode;
65
+ (function (AssistantMode) {
66
+ AssistantMode["Default"] = "default";
67
+ AssistantMode["Claude"] = "claude";
68
+ })(AssistantMode || (AssistantMode = {}));
64
69
  export var TelemetryEventType;
65
70
  (function (TelemetryEventType) {
66
71
  TelemetryEventType["InlineCompletionRequest"] = "inline-completion-request";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notebook-intelligence/notebook-intelligence",
3
- "version": "4.1.2",
3
+ "version": "4.2.1",
4
4
  "description": "AI coding assistant for JupyterLab",
5
5
  "keywords": [
6
6
  "AI",
package/src/api.ts CHANGED
@@ -13,7 +13,8 @@ import {
13
13
  ITelemetryEvent,
14
14
  IToolSelections,
15
15
  RequestDataType,
16
- BackendMessageType
16
+ BackendMessageType,
17
+ AssistantMode
17
18
  } from './tokens';
18
19
 
19
20
  export enum GitHubCopilotLoginStatus {
@@ -497,6 +498,15 @@ export class NBIAPI {
497
498
  }
498
499
 
499
500
  static async emitTelemetryEvent(event: ITelemetryEvent): Promise<void> {
501
+ const assistantMode = this.config.isInClaudeCodeMode
502
+ ? AssistantMode.Claude
503
+ : AssistantMode.Default;
504
+
505
+ event.data = {
506
+ ...(event.data || {}),
507
+ assistantMode
508
+ };
509
+
500
510
  return new Promise<void>((resolve, reject) => {
501
511
  requestAPI<any>('emit-telemetry-event', {
502
512
  method: 'POST',
@@ -613,6 +613,22 @@ function ChatResponse(props: any) {
613
613
  {item.content.confirmLabel}
614
614
  </div>
615
615
  </button>
616
+ {item.content.confirmSessionArgs ? (
617
+ <button
618
+ className="jp-Dialog-button jp-mod-accept jp-mod-styled"
619
+ onClick={() => {
620
+ markFormConfirmed(item.id);
621
+ runCommand(
622
+ 'notebook-intelligence:chat-user-input',
623
+ item.content.confirmSessionArgs
624
+ );
625
+ }}
626
+ >
627
+ <div className="jp-Dialog-buttonLabel">
628
+ {item.content.confirmSessionLabel}
629
+ </div>
630
+ </button>
631
+ ) : null}
616
632
  <button
617
633
  className="jp-Dialog-button jp-mod-reject jp-mod-styled"
618
634
  onClick={() => {
@@ -1937,7 +1953,7 @@ function SidebarComponent(props: any) {
1937
1953
  </button>
1938
1954
  </div>
1939
1955
  )}
1940
- {ghLoginRequired && (
1956
+ {!NBIAPI.config.isInClaudeCodeMode && ghLoginRequired && (
1941
1957
  <div className="sidebar-login-info">
1942
1958
  <div>
1943
1959
  You are not logged in to GitHub Copilot. Please login now to
@@ -877,7 +877,7 @@ function SettingsPanelComponentClaude(props: any) {
877
877
  ]);
878
878
 
879
879
  return (
880
- <div className="config-dialog">
880
+ <div className="config-dialog claude-mode-config-dialog">
881
881
  <div className="config-dialog-body">
882
882
  <div className="model-config-section">
883
883
  <div className="model-config-section-header">Enable Claude mode</div>
package/src/index.ts CHANGED
@@ -1006,11 +1006,12 @@ const plugin: JupyterFrontEndPlugin<INotebookIntelligence> = {
1006
1006
  const messageCheckTimeout = 5000;
1007
1007
  const messageCheckInterval = 1000;
1008
1008
  let output = '';
1009
- session.messageReceived.connect((sender, message) => {
1009
+ const messageReceivedHandler = (sender: any, message: any) => {
1010
1010
  const content = stripAnsi(message.content.join(''));
1011
1011
  output += content;
1012
1012
  lastMessageReceivedTime = Date.now();
1013
- });
1013
+ };
1014
+ session.messageReceived.connect(messageReceivedHandler);
1014
1015
 
1015
1016
  session.send({
1016
1017
  type: 'stdin',
@@ -1022,6 +1023,7 @@ const plugin: JupyterFrontEndPlugin<INotebookIntelligence> = {
1022
1023
  lastMessageCheckInterval = setInterval(() => {
1023
1024
  if (Date.now() - lastMessageReceivedTime > messageCheckTimeout) {
1024
1025
  clearInterval(lastMessageCheckInterval);
1026
+ session.messageReceived.disconnect(messageReceivedHandler);
1025
1027
  resolve(
1026
1028
  `Command executed in Jupyter terminal, output: ${output}`
1027
1029
  );
package/src/tokens.ts CHANGED
@@ -112,6 +112,11 @@ export enum BuiltinToolsetType {
112
112
  export const GITHUB_COPILOT_PROVIDER_ID = 'github-copilot';
113
113
  export const CLAUDE_CODE_CHAT_PARTICIPANT_ID = 'claude-code';
114
114
 
115
+ export enum AssistantMode {
116
+ Default = 'default',
117
+ Claude = 'claude'
118
+ }
119
+
115
120
  export enum TelemetryEventType {
116
121
  InlineCompletionRequest = 'inline-completion-request',
117
122
  ExplainThisRequest = 'explain-this-request',
package/style/base.css CHANGED
@@ -1044,3 +1044,7 @@ svg.access-token-warning {
1044
1044
  .ask-user-question-footer {
1045
1045
  padding: 0 0 5px 10px;
1046
1046
  }
1047
+
1048
+ .claude-mode-config-dialog .form-field-description {
1049
+ color: var(--jp-ui-font-color1);
1050
+ }