@jupyterlite/ai 0.8.0 → 0.9.0-a0

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.
Files changed (162) hide show
  1. package/lib/agent.d.ts +233 -0
  2. package/lib/agent.js +604 -0
  3. package/lib/chat-model.d.ts +195 -0
  4. package/lib/chat-model.js +590 -0
  5. package/lib/completion/completion-provider.d.ts +83 -0
  6. package/lib/completion/completion-provider.js +209 -0
  7. package/lib/completion/index.d.ts +1 -0
  8. package/lib/completion/index.js +1 -0
  9. package/lib/components/clear-button.d.ts +18 -0
  10. package/lib/components/clear-button.js +31 -0
  11. package/lib/components/index.d.ts +3 -0
  12. package/lib/components/index.js +3 -0
  13. package/lib/components/model-select.d.ts +19 -0
  14. package/lib/components/model-select.js +154 -0
  15. package/lib/components/stop-button.d.ts +3 -3
  16. package/lib/components/stop-button.js +8 -9
  17. package/lib/components/token-usage-display.d.ts +45 -0
  18. package/lib/components/token-usage-display.js +74 -0
  19. package/lib/components/tool-select.d.ts +27 -0
  20. package/lib/components/tool-select.js +130 -0
  21. package/lib/icons.d.ts +3 -1
  22. package/lib/icons.js +10 -13
  23. package/lib/index.d.ts +4 -5
  24. package/lib/index.js +322 -167
  25. package/lib/mcp/browser.d.ts +68 -0
  26. package/lib/mcp/browser.js +132 -0
  27. package/lib/models/settings-model.d.ts +69 -0
  28. package/lib/models/settings-model.js +295 -0
  29. package/lib/providers/built-in-providers.d.ts +9 -0
  30. package/lib/providers/built-in-providers.js +192 -0
  31. package/lib/providers/models.d.ts +37 -0
  32. package/lib/providers/models.js +28 -0
  33. package/lib/providers/provider-registry.d.ts +94 -0
  34. package/lib/providers/provider-registry.js +155 -0
  35. package/lib/tokens.d.ts +157 -86
  36. package/lib/tokens.js +16 -12
  37. package/lib/tools/commands.d.ts +11 -0
  38. package/lib/tools/commands.js +126 -0
  39. package/lib/tools/file.d.ts +27 -0
  40. package/lib/tools/file.js +262 -0
  41. package/lib/tools/notebook.d.ts +40 -0
  42. package/lib/tools/notebook.js +762 -0
  43. package/lib/tools/tool-registry.d.ts +35 -0
  44. package/lib/tools/tool-registry.js +55 -0
  45. package/lib/widgets/ai-settings.d.ts +39 -0
  46. package/lib/widgets/ai-settings.js +506 -0
  47. package/lib/widgets/chat-wrapper.d.ts +144 -0
  48. package/lib/widgets/chat-wrapper.js +390 -0
  49. package/lib/widgets/provider-config-dialog.d.ts +13 -0
  50. package/lib/widgets/provider-config-dialog.js +104 -0
  51. package/package.json +150 -41
  52. package/schema/settings-model.json +153 -0
  53. package/src/agent.ts +800 -0
  54. package/src/chat-model.ts +770 -0
  55. package/src/completion/completion-provider.ts +308 -0
  56. package/src/completion/index.ts +1 -0
  57. package/src/components/clear-button.tsx +56 -0
  58. package/src/components/index.ts +3 -0
  59. package/src/components/model-select.tsx +245 -0
  60. package/src/components/stop-button.tsx +11 -11
  61. package/src/components/token-usage-display.tsx +130 -0
  62. package/src/components/tool-select.tsx +218 -0
  63. package/src/icons.ts +12 -14
  64. package/src/index.ts +468 -238
  65. package/src/mcp/browser.ts +213 -0
  66. package/src/models/settings-model.ts +409 -0
  67. package/src/providers/built-in-providers.ts +216 -0
  68. package/src/providers/models.ts +79 -0
  69. package/src/providers/provider-registry.ts +189 -0
  70. package/src/tokens.ts +203 -90
  71. package/src/tools/commands.ts +151 -0
  72. package/src/tools/file.ts +307 -0
  73. package/src/tools/notebook.ts +964 -0
  74. package/src/tools/tool-registry.ts +63 -0
  75. package/src/types.d.ts +4 -0
  76. package/src/widgets/ai-settings.tsx +1100 -0
  77. package/src/widgets/chat-wrapper.tsx +543 -0
  78. package/src/widgets/provider-config-dialog.tsx +256 -0
  79. package/style/base.css +335 -14
  80. package/style/icons/jupyternaut-lite.svg +1 -1
  81. package/lib/base-completer.d.ts +0 -49
  82. package/lib/base-completer.js +0 -14
  83. package/lib/chat-handler.d.ts +0 -56
  84. package/lib/chat-handler.js +0 -201
  85. package/lib/completion-provider.d.ts +0 -34
  86. package/lib/completion-provider.js +0 -32
  87. package/lib/default-prompts.d.ts +0 -2
  88. package/lib/default-prompts.js +0 -31
  89. package/lib/default-providers/Anthropic/completer.d.ts +0 -12
  90. package/lib/default-providers/Anthropic/completer.js +0 -46
  91. package/lib/default-providers/Anthropic/settings-schema.json +0 -70
  92. package/lib/default-providers/ChromeAI/completer.d.ts +0 -12
  93. package/lib/default-providers/ChromeAI/completer.js +0 -56
  94. package/lib/default-providers/ChromeAI/instructions.d.ts +0 -6
  95. package/lib/default-providers/ChromeAI/instructions.js +0 -42
  96. package/lib/default-providers/ChromeAI/settings-schema.json +0 -18
  97. package/lib/default-providers/Gemini/completer.d.ts +0 -12
  98. package/lib/default-providers/Gemini/completer.js +0 -48
  99. package/lib/default-providers/Gemini/instructions.d.ts +0 -2
  100. package/lib/default-providers/Gemini/instructions.js +0 -9
  101. package/lib/default-providers/Gemini/settings-schema.json +0 -64
  102. package/lib/default-providers/MistralAI/completer.d.ts +0 -13
  103. package/lib/default-providers/MistralAI/completer.js +0 -52
  104. package/lib/default-providers/MistralAI/instructions.d.ts +0 -2
  105. package/lib/default-providers/MistralAI/instructions.js +0 -18
  106. package/lib/default-providers/MistralAI/settings-schema.json +0 -75
  107. package/lib/default-providers/Ollama/completer.d.ts +0 -12
  108. package/lib/default-providers/Ollama/completer.js +0 -43
  109. package/lib/default-providers/Ollama/instructions.d.ts +0 -2
  110. package/lib/default-providers/Ollama/instructions.js +0 -70
  111. package/lib/default-providers/Ollama/settings-schema.json +0 -143
  112. package/lib/default-providers/OpenAI/completer.d.ts +0 -12
  113. package/lib/default-providers/OpenAI/completer.js +0 -43
  114. package/lib/default-providers/OpenAI/settings-schema.json +0 -628
  115. package/lib/default-providers/WebLLM/completer.d.ts +0 -21
  116. package/lib/default-providers/WebLLM/completer.js +0 -127
  117. package/lib/default-providers/WebLLM/instructions.d.ts +0 -6
  118. package/lib/default-providers/WebLLM/instructions.js +0 -32
  119. package/lib/default-providers/WebLLM/settings-schema.json +0 -19
  120. package/lib/default-providers/index.d.ts +0 -2
  121. package/lib/default-providers/index.js +0 -179
  122. package/lib/provider.d.ts +0 -144
  123. package/lib/provider.js +0 -412
  124. package/lib/settings/base.json +0 -7
  125. package/lib/settings/index.d.ts +0 -3
  126. package/lib/settings/index.js +0 -3
  127. package/lib/settings/panel.d.ts +0 -226
  128. package/lib/settings/panel.js +0 -510
  129. package/lib/settings/textarea.d.ts +0 -2
  130. package/lib/settings/textarea.js +0 -18
  131. package/lib/settings/utils.d.ts +0 -2
  132. package/lib/settings/utils.js +0 -4
  133. package/lib/types/ai-model.d.ts +0 -24
  134. package/lib/types/ai-model.js +0 -5
  135. package/schema/chat.json +0 -28
  136. package/schema/provider-registry.json +0 -29
  137. package/schema/system-prompts.json +0 -22
  138. package/src/base-completer.ts +0 -75
  139. package/src/chat-handler.ts +0 -262
  140. package/src/completion-provider.ts +0 -64
  141. package/src/default-prompts.ts +0 -33
  142. package/src/default-providers/Anthropic/completer.ts +0 -59
  143. package/src/default-providers/ChromeAI/completer.ts +0 -73
  144. package/src/default-providers/ChromeAI/instructions.ts +0 -45
  145. package/src/default-providers/Gemini/completer.ts +0 -61
  146. package/src/default-providers/Gemini/instructions.ts +0 -9
  147. package/src/default-providers/MistralAI/completer.ts +0 -69
  148. package/src/default-providers/MistralAI/instructions.ts +0 -18
  149. package/src/default-providers/Ollama/completer.ts +0 -54
  150. package/src/default-providers/Ollama/instructions.ts +0 -70
  151. package/src/default-providers/OpenAI/completer.ts +0 -54
  152. package/src/default-providers/WebLLM/completer.ts +0 -151
  153. package/src/default-providers/WebLLM/instructions.ts +0 -33
  154. package/src/default-providers/index.ts +0 -211
  155. package/src/global.d.ts +0 -9
  156. package/src/provider.ts +0 -514
  157. package/src/settings/index.ts +0 -3
  158. package/src/settings/panel.tsx +0 -773
  159. package/src/settings/textarea.tsx +0 -33
  160. package/src/settings/utils.ts +0 -5
  161. package/src/types/ai-model.ts +0 -37
  162. package/src/types/service-worker.d.ts +0 -6
@@ -0,0 +1,307 @@
1
+ import { CommandRegistry } from '@lumino/commands';
2
+ import { IDocumentManager } from '@jupyterlab/docmanager';
3
+
4
+ import { tool } from '@openai/agents';
5
+
6
+ import { z } from 'zod';
7
+
8
+ import { ITool } from '../tokens';
9
+
10
+ /**
11
+ * Create a tool for creating new files of various types
12
+ */
13
+ export function createNewFileTool(docManager: IDocumentManager): ITool {
14
+ return tool({
15
+ name: 'create_file',
16
+ description:
17
+ 'Create a new file of specified type (text, python, markdown, json, etc.)',
18
+ parameters: z.object({
19
+ fileName: z.string().describe('Name of the file to create'),
20
+ fileType: z
21
+ .enum([
22
+ 'text',
23
+ 'python',
24
+ 'markdown',
25
+ 'json',
26
+ 'javascript',
27
+ 'typescript'
28
+ ])
29
+ .default('text')
30
+ .describe('Type of file to create'),
31
+ content: z
32
+ .string()
33
+ .optional()
34
+ .nullable()
35
+ .describe('Initial content for the file (optional)'),
36
+ cwd: z
37
+ .string()
38
+ .optional()
39
+ .nullable()
40
+ .describe('Directory where to create the file (optional)')
41
+ }),
42
+ execute: async (input: {
43
+ fileName: string;
44
+ fileType?:
45
+ | 'text'
46
+ | 'python'
47
+ | 'markdown'
48
+ | 'json'
49
+ | 'javascript'
50
+ | 'typescript';
51
+ content?: string | null;
52
+ cwd?: string | null;
53
+ }) => {
54
+ const { fileName, content = '', cwd, fileType = 'text' } = input;
55
+
56
+ try {
57
+ // Determine file extension based on type
58
+ const extensions: Record<string, string> = {
59
+ python: 'py',
60
+ markdown: 'md',
61
+ json: 'json',
62
+ text: 'txt',
63
+ javascript: 'js',
64
+ typescript: 'ts'
65
+ };
66
+
67
+ const ext = extensions[fileType] || 'txt';
68
+
69
+ // If fileName already has an extension, use it as-is, otherwise add the extension
70
+ const fullFileName = fileName.includes('.')
71
+ ? fileName
72
+ : `${fileName}.${ext}`;
73
+
74
+ // For Python files, ensure .py extension if fileType is python
75
+ const finalFileName =
76
+ fileType === 'python' &&
77
+ !fileName.endsWith('.py') &&
78
+ !fileName.includes('.')
79
+ ? `${fileName}.py`
80
+ : fullFileName;
81
+
82
+ const fullPath = cwd ? `${cwd}/${finalFileName}` : finalFileName;
83
+
84
+ // Create file with content using document manager
85
+ const model = await docManager.services.contents.newUntitled({
86
+ path: cwd || '',
87
+ type: 'file',
88
+ ext
89
+ });
90
+
91
+ // Rename to desired name if needed
92
+ let finalPath = model.path;
93
+ if (model.name !== finalFileName) {
94
+ const renamed = await docManager.services.contents.rename(
95
+ model.path,
96
+ fullPath
97
+ );
98
+ finalPath = renamed.path;
99
+ }
100
+
101
+ // Set content if provided
102
+ if (content) {
103
+ await docManager.services.contents.save(finalPath, {
104
+ type: 'file',
105
+ format: 'text',
106
+ content
107
+ });
108
+ }
109
+
110
+ // Open the newly created file
111
+ let opened = false;
112
+ if (!docManager.findWidget(finalPath)) {
113
+ docManager.openOrReveal(finalPath);
114
+ opened = true;
115
+ }
116
+
117
+ return {
118
+ success: true,
119
+ message: `${fileType} file '${finalFileName}' created and opened successfully`,
120
+ fileName: finalFileName,
121
+ filePath: finalPath,
122
+ fileType,
123
+ hasContent: !!content,
124
+ opened
125
+ };
126
+ } catch (error) {
127
+ return {
128
+ success: false,
129
+ error: `Failed to create file: ${(error as Error).message}`
130
+ };
131
+ }
132
+ }
133
+ });
134
+ }
135
+
136
+ /**
137
+ * Create a tool for opening files
138
+ */
139
+ export function createOpenFileTool(docManager: IDocumentManager): ITool {
140
+ return tool({
141
+ name: 'open_file',
142
+ description: 'Open a file in the editor',
143
+ parameters: z.object({
144
+ filePath: z.string().describe('Path to the file to open')
145
+ }),
146
+ execute: async (input: { filePath: string }) => {
147
+ const { filePath } = input;
148
+
149
+ try {
150
+ const widget = docManager.openOrReveal(filePath);
151
+
152
+ if (!widget) {
153
+ return {
154
+ success: false,
155
+ error: `Failed to open file: ${filePath}`
156
+ };
157
+ }
158
+
159
+ return {
160
+ success: true,
161
+ message: `File '${filePath}' opened successfully`,
162
+ filePath,
163
+ widgetId: widget.id
164
+ };
165
+ } catch (error) {
166
+ return {
167
+ success: false,
168
+ error: `Failed to open file: ${(error as Error).message}`
169
+ };
170
+ }
171
+ }
172
+ });
173
+ }
174
+
175
+ /**
176
+ * Create a tool for deleting files
177
+ */
178
+ export function createDeleteFileTool(docManager: IDocumentManager): ITool {
179
+ return tool({
180
+ name: 'delete_file',
181
+ description: 'Delete a file from the file system',
182
+ parameters: z.object({
183
+ filePath: z.string().describe('Path to the file to delete')
184
+ }),
185
+ execute: async (input: { filePath: string }) => {
186
+ const { filePath } = input;
187
+
188
+ try {
189
+ await docManager.services.contents.delete(filePath);
190
+
191
+ return {
192
+ success: true,
193
+ message: `File '${filePath}' deleted successfully`,
194
+ filePath
195
+ };
196
+ } catch (error) {
197
+ return {
198
+ success: false,
199
+ error: `Failed to delete file: ${(error as Error).message}`
200
+ };
201
+ }
202
+ }
203
+ });
204
+ }
205
+
206
+ /**
207
+ * Create a tool for renaming files
208
+ */
209
+ export function createRenameFileTool(docManager: IDocumentManager): ITool {
210
+ return tool({
211
+ name: 'rename_file',
212
+ description: 'Rename a file or move it to a different location',
213
+ parameters: z.object({
214
+ oldPath: z.string().describe('Current path of the file'),
215
+ newPath: z.string().describe('New path/name for the file')
216
+ }),
217
+ execute: async (input: { oldPath: string; newPath: string }) => {
218
+ const { oldPath, newPath } = input;
219
+
220
+ try {
221
+ await docManager.services.contents.rename(oldPath, newPath);
222
+
223
+ return {
224
+ success: true,
225
+ message: `File renamed from '${oldPath}' to '${newPath}' successfully`,
226
+ oldPath,
227
+ newPath
228
+ };
229
+ } catch (error) {
230
+ return {
231
+ success: false,
232
+ error: `Failed to rename file: ${(error as Error).message}`
233
+ };
234
+ }
235
+ }
236
+ });
237
+ }
238
+
239
+ /**
240
+ * Create a tool for copying files
241
+ */
242
+ export function createCopyFileTool(docManager: IDocumentManager): ITool {
243
+ return tool({
244
+ name: 'copy_file',
245
+ description: 'Copy a file to a new location',
246
+ parameters: z.object({
247
+ sourcePath: z.string().describe('Path of the file to copy'),
248
+ destinationPath: z
249
+ .string()
250
+ .describe('Destination path for the copied file')
251
+ }),
252
+ execute: async (input: { sourcePath: string; destinationPath: string }) => {
253
+ const { sourcePath, destinationPath } = input;
254
+
255
+ try {
256
+ await docManager.services.contents.copy(sourcePath, destinationPath);
257
+
258
+ return {
259
+ success: true,
260
+ message: `File copied from '${sourcePath}' to '${destinationPath}' successfully`,
261
+ sourcePath,
262
+ destinationPath
263
+ };
264
+ } catch (error) {
265
+ return {
266
+ success: false,
267
+ error: `Failed to copy file: ${(error as Error).message}`
268
+ };
269
+ }
270
+ }
271
+ });
272
+ }
273
+
274
+ /**
275
+ * Create a tool for navigating to directories in the file browser
276
+ */
277
+ export function createNavigateToDirectoryTool(
278
+ commands: CommandRegistry
279
+ ): ITool {
280
+ return tool({
281
+ name: 'navigate_to_directory',
282
+ description: 'Navigate to a specific directory in the file browser',
283
+ parameters: z.object({
284
+ directoryPath: z.string().describe('Path to the directory to navigate to')
285
+ }),
286
+ execute: async (input: { directoryPath: string }) => {
287
+ const { directoryPath } = input;
288
+
289
+ try {
290
+ await commands.execute('filebrowser:go-to-path', {
291
+ path: directoryPath
292
+ });
293
+
294
+ return {
295
+ success: true,
296
+ message: `Navigated to directory '${directoryPath}' successfully`,
297
+ directoryPath
298
+ };
299
+ } catch (error) {
300
+ return {
301
+ success: false,
302
+ error: `Failed to navigate to directory: ${(error as Error).message}`
303
+ };
304
+ }
305
+ }
306
+ });
307
+ }