jupyterlab_ai_code_assistants_extension 0.6.15 → 0.6.17

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 CHANGED
@@ -8,36 +8,75 @@
8
8
  [![Brought To You By KOLOMOLO](https://img.shields.io/badge/Brought%20To%20You%20By-KOLOMOLO-00ffff?style=flat)](https://kolomolo.com)
9
9
  [![Donate PayPal](https://img.shields.io/badge/Donate-PayPal-blue?style=flat)](https://www.paypal.com/donate/?hosted_button_id=B4KPBJDLLXTSA)
10
10
 
11
- One extension for every AI code assistant in JupyterLab. Replaces the separate `jupyterlab_claude_code_extension`, `jupyterlab_codex_extension` and `jupyterlab_kimi_code_extension` packages with a single install that keeps each assistant's own side panel while sharing one settings page and one session-handling core underneath.
11
+ A full launcher and manager for every AI code assistant in JupyterLab - Claude Code, Codex, Kimi and Gemini. Start, resume, fork, switch, and clean up CLI sessions from a side panel per assistant - one click lands you in the right terminal with the assistant already running, no duplicate tabs, no UUID hunting. One install replaces the separate `jupyterlab_claude_code_extension`, `jupyterlab_codex_extension` and `jupyterlab_kimi_code_extension` packages and migrates their settings and favourites automatically.
12
12
 
13
- > [!NOTE]
14
- > Early development. The scaffolding, build lifecycle and packaging are in place; the assistant panels are being ported from the standalone extensions.
13
+ ![Claude Code Sessions panel](.resources/screenshot.png)
14
+
15
+ ## Why this extension
16
+
17
+ One principle: **the vendors know best how to build the agent harness; we know best how to make it work in JupyterLab.**
18
+
19
+ Chat-panel extensions re-implement the agent loop and trail the real tool. This one runs the genuine, unmodified CLIs in JupyterLab terminals - skills, subagents, MCP, hooks, plan mode, every release the day it lands. The extension owns the JupyterLab side:
20
+
21
+ - **Launching** - new, resumed, or forked sessions, with or without permission prompts, no wrapper shell, correctly sized before the assistant draws its first frame
22
+ - **Finding** - every project in one panel per assistant: favourites, search, live activity
23
+ - **Reusing** - clicking a session focuses its existing terminal, never a duplicate
24
+ - **Managing** - parallel conversations: switch, fork with a name, delete - no `--resume` pickers, no raw UUIDs
15
25
 
16
26
  ## Features
17
27
 
18
- - **One install, every assistant** - Claude Code, Codex, Kimi and Gemini supported from a single package
19
- - **Individual right-panel per assistant** - each assistant keeps its own side panel with Favorites, Recent and All projects
20
- - **Joint settings page** - one settings section covering all assistants, replacing three separate ones
21
- - **Per-assistant toggles** - switch any assistant's support on or off in settings; all are enabled by default
22
- - **Shared session core** - resume, branch, switch and clean up conversations through one common mechanism across assistants
23
- - **Auto-disabled when absent** - an assistant whose CLI is not installed does not show a panel
28
+ - **One install, every assistant** - Claude Code, Codex, Kimi and Gemini from a single package, each with its own right-side panel wearing its official mark
29
+ - **Provider registry** - assistant-specific behaviour lives in one module per assistant behind capability flags; no core file names an assistant, and adding one touches no core file
30
+ - **Joint settings page** - one settings section covering all assistants, with a per-assistant toggle (all on by default); toggling takes effect live, no JupyterLab reload
31
+ - **Three-section side panel** - Favorites, Recent, and All projects, each scrolling independently
32
+ - **One-click resume** - click a row to jump back into that session in a terminal; an open terminal for the project is reused instead of duplicated
33
+ - **Conversation switcher** - a right-click "Switch and Manage Sessions" submenu lists a project's other conversations by name and short id with last-activity time; "Manage Sessions..." opens a searchable popup over the full list with multi-select delete and per-row open and copy-id buttons
34
+ - **Branch session** - fork the current conversation into a new named session via the right-click menu; each assistant forks its own way (Claude's native `--fork-session`, Codex's `codex fork`, server-side copies for Kimi and Gemini) behind the same menu item
35
+ - **Launch modes under each assistant's own name** - Claude's skip-permissions, Codex's approval bypass, Kimi's `--yolo`, Gemini's YOLO and approval modes; unsafe variants carry a warning glyph
36
+ - **Coloured terminal tabs** - each session's colour tints its terminal tab via the companion `jupyterlab_colourful_tab_extension` (installed automatically). Assistants without a colour concept get a stable colour from the extension's own store, and a branched session inherits its parent's colour
37
+ - **Favorites** - star projects you keep coming back to via the right-click menu; favourites from the standalone extensions are migrated on first run
38
+ - **Remove and clean up** - drop a project's history or a project's extra parallel sessions from the right-click menu, confirmation dialog first; removed files honour JupyterLab's "move files to trash" setting
39
+ - **Activity at a glance** - each row shows its last activity in an aligned column; rows active within the last minute light up, rows idle for over a week dim, and rows with parallel conversations show a branch icon with the count
40
+ - **Remote control indicator and background agents** (Claude) - a green dot marks sessions actively under remote control, and a conversation held by a running background agent shows a `bg` chip; clicking attaches to the agent instead of copying it
41
+ - **Search** - fuzzy filter per panel, toggled by the funnel button
42
+ - **Presentation modes** - label rows by session name, folder name, or path relative to the JupyterLab root
43
+ - **Conflict-safe upgrade** - if a retired standalone extension is still installed, its panel wins and this extension stands down for that assistant instead of showing a duplicate
44
+ - **Auto-disabled when absent** - an assistant whose CLI is not on `PATH` does not show a panel
24
45
 
25
46
  ## Requirements
26
47
 
27
48
  - JupyterLab >= 4.0.0
28
49
  - Python >= 3.10
50
+ - At least one assistant CLI on `PATH`: `claude`, `codex`, `kimi`, or `gemini`
29
51
 
30
52
  ## Install
31
53
 
32
- To install the extension, execute:
54
+ Developers must install via the project `Makefile` (which orchestrates clean, build, and pip install of the resulting wheel):
55
+
56
+ ```bash
57
+ make install
58
+ ```
59
+
60
+ End-users can install the published package from PyPI:
33
61
 
34
62
  ```bash
35
63
  pip install jupyterlab_ai_code_assistants_extension
36
64
  ```
37
65
 
38
- ## Uninstall
66
+ > [!WARNING]
67
+ > `package.json` pins `webpack: 5.106.0` and `chalk: 4.1.2` in both `resolutions` and `overrides`. Do not remove these. webpack `>= 5.106.1` changed its module-federation share identifier format and crashes the unmaintained `license-webpack-plugin` (`split('=')[1].trim()`) that `@jupyterlab/builder` injects into every production build; the duplicate `chalk@2.4.2` pulled by `duplicate-package-checker-webpack-plugin` crashes on Node 24+ in the build-isolation install. Without the pins, `make publish` and CI fail on `python -m build`.
68
+
69
+ ## Migrating from the standalone extensions
70
+
71
+ This package supersedes `jupyterlab_claude_code_extension`, `jupyterlab_codex_extension` and `jupyterlab_kimi_code_extension`. On first run it carries their settings and favourites over automatically; uninstall the standalones once you are ready:
72
+
73
+ ```bash
74
+ pip uninstall jupyterlab_claude_code_extension jupyterlab_codex_extension jupyterlab_kimi_code_extension
75
+ ```
39
76
 
40
- To remove the extension, execute:
77
+ While a standalone extension is still installed, its panel is shown and this extension's panel for that assistant stays out of the way.
78
+
79
+ ## Uninstall
41
80
 
42
81
  ```bash
43
82
  pip uninstall jupyterlab_ai_code_assistants_extension
@@ -20,13 +20,13 @@
20
20
  //
21
21
  // No hooks: gemini rows carry no badge, no extra menu item and no derived
22
22
  // colour, so the shared panel renders them unchanged.
23
- // The four-pointed spark of the Gemini mark: four tips on the box edges, each
24
- // pair joined by a quadratic whose control point is the centre, which is what
25
- // pinches the sides inwards. Single path, `jp-icon3` so the theme drives the
26
- // fill in both light and dark; the 16px box matches every other icon in the
27
- // sidebar.
28
- const geminiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
29
- <path class="jp-icon3" fill="#616161" d="M8 0Q8 8 16 8Q8 8 8 16Q8 8 0 8Q8 8 8 0Z"/>
23
+ // The official Gemini spark - the silhouette path of Google's 2025 icon
24
+ // (rounded four-point star; the upstream asset fills it with gradient blobs,
25
+ // dropped here because every sidebar icon is monochrome). Single path,
26
+ // `jp-icon3` so the theme drives the fill in both light and dark; the 16px
27
+ // box matches every other icon in the sidebar.
28
+ const geminiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 65 65" width="16" height="16">
29
+ <path class="jp-icon3" fill="#616161" d="M32.447 0c.68 0 1.273.465 1.439 1.125a38.904 38.904 0 001.999 5.905c2.152 5 5.105 9.376 8.854 13.125 3.751 3.75 8.126 6.703 13.125 8.855a38.98 38.98 0 005.906 1.999c.66.166 1.124.758 1.124 1.438 0 .68-.464 1.273-1.125 1.439a38.902 38.902 0 00-5.905 1.999c-5 2.152-9.375 5.105-13.125 8.854-3.749 3.751-6.702 8.126-8.854 13.125a38.973 38.973 0 00-2 5.906 1.485 1.485 0 01-1.438 1.124c-.68 0-1.272-.464-1.438-1.125a38.913 38.913 0 00-2-5.905c-2.151-5-5.103-9.375-8.854-13.125-3.75-3.749-8.125-6.702-13.125-8.854a38.973 38.973 0 00-5.905-2A1.485 1.485 0 010 32.448c0-.68.465-1.272 1.125-1.438a38.903 38.903 0 005.905-2c5-2.151 9.376-5.104 13.125-8.854 3.75-3.749 6.703-8.125 8.855-13.125a38.972 38.972 0 001.999-5.905A1.485 1.485 0 0132.447 0z"/>
30
30
  </svg>`;
31
31
  // Gemini's own names for its two launch surfaces. Kept in the assistant's
32
32
  // terminology rather than normalised, because each is both the settings key
@@ -16,11 +16,15 @@
16
16
  // The only hook is the branch label: kimi's conversation titles are
17
17
  // auto-generated by a Chinese-first model, and both the session id shape and
18
18
  // the glyph widths of those titles need handling the shared default cannot do.
19
- // Crescent moon (Kimi is Moonshot AI's CLI) - an outer semicircle on the left,
20
- // bitten from the right by a wider inner arc.
21
- const kimiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
19
+ // The official Kimi "K" mark from Moonshot's branding guide (the k-only
20
+ // glyph, the same shape kimi.com uses as its favicon): the angular K with the
21
+ // detached rounded accent square at the top right. Both paths sit in one
22
+ // `jp-icon3` group so the accent renders in the theme foreground rather than
23
+ // Kimi's brand blue - every icon in the sidebar is monochrome.
24
+ const kimiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 25" width="16" height="16">
22
25
  <g class="jp-icon3" fill="#616161">
23
- <path d="M8 1.5A6.5 6.5 0 1 0 8 14.5 8 8 0 0 1 8 1.5Z"/>
26
+ <path d="M21.7202 0.939941C22.9502 0.939941 23.9502 1.93994 23.9502 3.16994C23.9502 4.39994 22.9502 5.39994 21.7202 5.39994H19.7502C19.6002 5.39994 19.4902 5.27994 19.4902 5.13994V3.16994C19.4902 1.93994 20.4902 0.939941 21.7202 0.939941Z"/>
27
+ <path d="M9.39 13.9501L17.82 5.59012C17.98 5.43012 17.89 5.12012 17.68 5.12012H13.14C13.14 5.12012 13.04 5.14012 13 5.18012L3.92 14.1901C3.78 14.3301 3.57 14.2101 3.57 13.9801V5.39012C3.57 5.24012 3.47 5.12012 3.35 5.12012H0.219999C0.0999993 5.12012 0 5.24012 0 5.39012V23.9201C0 24.0701 0.0999993 24.1901 0.219999 24.1901H3.35C3.47 24.1901 3.57 24.0701 3.57 23.9201V20.1401C3.57 20.0601 3.6 19.9801 3.65 19.9301L6.47 17.1401C6.54 17.0701 6.63 17.0601 6.71 17.1101L14.24 22.6501C15.47 23.4801 16.85 23.9901 18.25 24.1401C18.37 24.1501 18.48 24.0301 18.48 23.8701V20.3101C18.48 20.1701 18.4 20.0601 18.29 20.0501C17.47 19.9201 16.66 19.6001 15.94 19.1101L9.42 14.3901C9.28 14.3001 9.27 14.0701 9.39 13.9501Z"/>
24
28
  </g>
25
29
  </svg>`;
26
30
  // ------------------------------------------------------------------- labels
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jupyterlab_ai_code_assistants_extension",
3
- "version": "0.6.15",
3
+ "version": "0.6.17",
4
4
  "description": "Jupyterlab extension to replace individual jupyterlab_*_code_extension and integrate into one, that offers joint capability, joint settings page and individual right toolbar panels per code assistant, with the ability in settings to decide which code assistant support is on (default - all are enabled)",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -23,13 +23,13 @@
23
23
 
24
24
  import { IProviderDescriptor } from '../core/types';
25
25
 
26
- // The four-pointed spark of the Gemini mark: four tips on the box edges, each
27
- // pair joined by a quadratic whose control point is the centre, which is what
28
- // pinches the sides inwards. Single path, `jp-icon3` so the theme drives the
29
- // fill in both light and dark; the 16px box matches every other icon in the
30
- // sidebar.
31
- const geminiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
32
- <path class="jp-icon3" fill="#616161" d="M8 0Q8 8 16 8Q8 8 8 16Q8 8 0 8Q8 8 8 0Z"/>
26
+ // The official Gemini spark - the silhouette path of Google's 2025 icon
27
+ // (rounded four-point star; the upstream asset fills it with gradient blobs,
28
+ // dropped here because every sidebar icon is monochrome). Single path,
29
+ // `jp-icon3` so the theme drives the fill in both light and dark; the 16px
30
+ // box matches every other icon in the sidebar.
31
+ const geminiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 65 65" width="16" height="16">
32
+ <path class="jp-icon3" fill="#616161" d="M32.447 0c.68 0 1.273.465 1.439 1.125a38.904 38.904 0 001.999 5.905c2.152 5 5.105 9.376 8.854 13.125 3.751 3.75 8.126 6.703 13.125 8.855a38.98 38.98 0 005.906 1.999c.66.166 1.124.758 1.124 1.438 0 .68-.464 1.273-1.125 1.439a38.902 38.902 0 00-5.905 1.999c-5 2.152-9.375 5.105-13.125 8.854-3.749 3.751-6.702 8.126-8.854 13.125a38.973 38.973 0 00-2 5.906 1.485 1.485 0 01-1.438 1.124c-.68 0-1.272-.464-1.438-1.125a38.913 38.913 0 00-2-5.905c-2.151-5-5.103-9.375-8.854-13.125-3.75-3.749-8.125-6.702-13.125-8.854a38.973 38.973 0 00-5.905-2A1.485 1.485 0 010 32.448c0-.68.465-1.272 1.125-1.438a38.903 38.903 0 005.905-2c5-2.151 9.376-5.104 13.125-8.854 3.75-3.749 6.703-8.125 8.855-13.125a38.972 38.972 0 001.999-5.905A1.485 1.485 0 0132.447 0z"/>
33
33
  </svg>`;
34
34
 
35
35
  // Gemini's own names for its two launch surfaces. Kept in the assistant's
@@ -19,11 +19,15 @@
19
19
 
20
20
  import { IBranch, IProviderDescriptor, IProviderHooks } from '../core/types';
21
21
 
22
- // Crescent moon (Kimi is Moonshot AI's CLI) - an outer semicircle on the left,
23
- // bitten from the right by a wider inner arc.
24
- const kimiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
22
+ // The official Kimi "K" mark from Moonshot's branding guide (the k-only
23
+ // glyph, the same shape kimi.com uses as its favicon): the angular K with the
24
+ // detached rounded accent square at the top right. Both paths sit in one
25
+ // `jp-icon3` group so the accent renders in the theme foreground rather than
26
+ // Kimi's brand blue - every icon in the sidebar is monochrome.
27
+ const kimiSvgStr = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 25" width="16" height="16">
25
28
  <g class="jp-icon3" fill="#616161">
26
- <path d="M8 1.5A6.5 6.5 0 1 0 8 14.5 8 8 0 0 1 8 1.5Z"/>
29
+ <path d="M21.7202 0.939941C22.9502 0.939941 23.9502 1.93994 23.9502 3.16994C23.9502 4.39994 22.9502 5.39994 21.7202 5.39994H19.7502C19.6002 5.39994 19.4902 5.27994 19.4902 5.13994V3.16994C19.4902 1.93994 20.4902 0.939941 21.7202 0.939941Z"/>
30
+ <path d="M9.39 13.9501L17.82 5.59012C17.98 5.43012 17.89 5.12012 17.68 5.12012H13.14C13.14 5.12012 13.04 5.14012 13 5.18012L3.92 14.1901C3.78 14.3301 3.57 14.2101 3.57 13.9801V5.39012C3.57 5.24012 3.47 5.12012 3.35 5.12012H0.219999C0.0999993 5.12012 0 5.24012 0 5.39012V23.9201C0 24.0701 0.0999993 24.1901 0.219999 24.1901H3.35C3.47 24.1901 3.57 24.0701 3.57 23.9201V20.1401C3.57 20.0601 3.6 19.9801 3.65 19.9301L6.47 17.1401C6.54 17.0701 6.63 17.0601 6.71 17.1101L14.24 22.6501C15.47 23.4801 16.85 23.9901 18.25 24.1401C18.37 24.1501 18.48 24.0301 18.48 23.8701V20.3101C18.48 20.1701 18.4 20.0601 18.29 20.0501C17.47 19.9201 16.66 19.6001 15.94 19.1101L9.42 14.3901C9.28 14.3001 9.27 14.0701 9.39 13.9501Z"/>
27
31
  </g>
28
32
  </svg>`;
29
33