notebook-intelligence 5.2.1__tar.gz → 5.3.0a1__tar.gz

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 (234) hide show
  1. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/PKG-INFO +8 -2
  2. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/PRIVACY.md +2 -2
  3. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/README.md +7 -1
  4. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/docs/admin-guide.md +69 -39
  5. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/_version.py +1 -1
  6. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/api.py +5 -0
  7. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/base_chat_participant.py +77 -4
  8. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/built_in_toolsets.py +218 -22
  9. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/claude.py +339 -16
  10. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/claude_sessions.py +6 -2
  11. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/context_factory.py +9 -2
  12. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/extension.py +42 -3
  13. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/package.json +2 -2
  14. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +1 -1
  15. notebook_intelligence-5.3.0a1/notebook_intelligence/labextension/static/319.88239ad1994b8fcc4c8a.js +1 -0
  16. notebook_intelligence-5.3.0a1/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
  17. notebook_intelligence-5.3.0a1/notebook_intelligence/labextension/static/remoteEntry.cbbb5b7a3e8979c2c8ee.js +1 -0
  18. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/rule_manager.py +8 -3
  19. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/ruleset.py +70 -17
  20. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/package.json +1 -1
  21. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/conftest.py +7 -3
  22. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/01-test-global.md +3 -1
  23. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_base_chat_participant_integration.py +86 -2
  24. notebook_intelligence-5.3.0a1/tests/test_builtin_search_files_sandbox.py +275 -0
  25. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_client.py +58 -0
  26. notebook_intelligence-5.3.0a1/tests/test_claude_models.py +492 -0
  27. notebook_intelligence-5.3.0a1/tests/test_claude_turn_usage.py +189 -0
  28. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_context_factory.py +8 -4
  29. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_end_to_end_rule_integration.py +17 -8
  30. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_models.py +43 -22
  31. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_rule_auto_reload.py +4 -4
  32. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_websocket_handler_integration.py +142 -0
  33. notebook_intelligence-5.3.0a1/tests/ts/inline-completer-telemetry.test.ts +119 -0
  34. notebook_intelligence-5.2.1/notebook_intelligence/labextension/static/490.ca1d1006275ec50e58e8.js +0 -1
  35. notebook_intelligence-5.2.1/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
  36. notebook_intelligence-5.2.1/notebook_intelligence/labextension/static/remoteEntry.66f4a7743a2091e5cae6.js +0 -1
  37. notebook_intelligence-5.2.1/tests/test_claude_models.py +0 -177
  38. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.copier-answers.yml +0 -0
  39. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.editorconfig +0 -0
  40. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.gitignore +0 -0
  41. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/.gitignore +0 -0
  42. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/applypatch-msg +0 -0
  43. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/commit-msg +0 -0
  44. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/h +0 -0
  45. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/husky.sh +0 -0
  46. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/post-applypatch +0 -0
  47. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/post-checkout +0 -0
  48. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/post-commit +0 -0
  49. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/post-merge +0 -0
  50. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/post-rewrite +0 -0
  51. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-applypatch +0 -0
  52. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-auto-gc +0 -0
  53. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-commit +0 -0
  54. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-merge-commit +0 -0
  55. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-push +0 -0
  56. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/pre-rebase +0 -0
  57. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/_/prepare-commit-msg +0 -0
  58. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.husky/pre-commit +0 -0
  59. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.prettierignore +0 -0
  60. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.vscode/extensions.json +0 -0
  61. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.vscode/settings.json +0 -0
  62. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/.yarnrc.yml +0 -0
  63. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/CHANGELOG.md +0 -0
  64. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/CONTRIBUTING.md +0 -0
  65. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/LICENSE +0 -0
  66. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/RELEASE.md +0 -0
  67. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/SECURITY.md +0 -0
  68. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/README.md +0 -0
  69. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
  70. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/bench_runner.py +0 -0
  71. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/bench_terminal.py +0 -0
  72. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/prompts.py +0 -0
  73. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/report.py +0 -0
  74. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/benchmarks/claude_perf/stats.py +0 -0
  75. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/docs/admin-tour-config.md +0 -0
  76. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/docs/rulesets.md +0 -0
  77. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/docs/skills.md +0 -0
  78. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/docs/troubleshooting.md +0 -0
  79. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/install.json +0 -0
  80. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/jest.config.js +0 -0
  81. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/jupyter-config/server-config/notebook_intelligence.json +0 -0
  82. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/__init__.py +0 -0
  83. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/_claude_cli.py +0 -0
  84. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/ai_service_manager.py +0 -0
  85. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/cell_output.py +0 -0
  86. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/claude_mcp_manager.py +0 -0
  87. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/config.py +0 -0
  88. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/feature_flags.py +0 -0
  89. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/github_copilot.py +0 -0
  90. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
  91. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
  92. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/196.da0c2020639344d5c419.js +0 -0
  93. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
  94. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/327.47473c656f6c27efa1dc.js +0 -0
  95. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/327.47473c656f6c27efa1dc.js.LICENSE.txt +0 -0
  96. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/537.211b1ccdcc268aa3fd2d.js +0 -0
  97. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/631.f00d05d8305a78ec8301.js +0 -0
  98. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/671.1b1a53f5f75bff82950b.js +0 -0
  99. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/694.2ebfa9714301d9260bf0.js +0 -0
  100. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/728.14572b771377e7f3a104.js +0 -0
  101. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/745.e077633fb1e31ec9da96.js +0 -0
  102. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/745.e077633fb1e31ec9da96.js.LICENSE.txt +0 -0
  103. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/977.b917f705175326af0e5d.js +0 -0
  104. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/be02dcbf2787b0b29ec8.module.wasm +0 -0
  105. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/e589c9ba04e3e5a90081.module.wasm +0 -0
  106. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
  107. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/style.js +0 -0
  108. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
  109. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
  110. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
  111. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
  112. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
  113. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/mcp_client.py +0 -0
  114. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/mcp_config_validation.py +0 -0
  115. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/mcp_manager.py +0 -0
  116. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/mcp_policy.py +0 -0
  117. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/plugin_manager.py +0 -0
  118. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/prompts.py +0 -0
  119. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/rule_injector.py +0 -0
  120. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/skill_github_import.py +0 -0
  121. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/skill_manager.py +0 -0
  122. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/skill_manifest.py +0 -0
  123. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/skill_reconciler.py +0 -0
  124. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/skillset.py +0 -0
  125. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/tour_config.py +0 -0
  126. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/notebook_intelligence/util.py +0 -0
  127. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/pyproject.toml +0 -0
  128. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/schema/plugin.json +0 -0
  129. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/setup.py +0 -0
  130. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/02-test-security.md +0 -0
  131. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/03-invalid-rule.md +0 -0
  132. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
  133. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
  134. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
  135. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_ai_service_manager_integration.py +0 -0
  136. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_api_hygiene.py +0 -0
  137. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_builtin_file_read.py +0 -0
  138. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
  139. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_cell_output.py +0 -0
  140. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_cell_output_features_response.py +0 -0
  141. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_mcp_manager.py +0 -0
  142. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_sessions.py +0 -0
  143. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_sessions_handler.py +0 -0
  144. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_system_prompt.py +0 -0
  145. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_tool_humanizer.py +0 -0
  146. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_claude_tool_path_sandbox.py +0 -0
  147. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_coding_agent_launchers.py +0 -0
  148. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_config_atomic_save.py +0 -0
  149. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_config_integration.py +0 -0
  150. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_default_password_refusal.py +0 -0
  151. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_feature_flags.py +0 -0
  152. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_feedback.py +0 -0
  153. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_file_upload.py +0 -0
  154. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_github_copilot_llm_provider.py +0 -0
  155. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_github_copilot_user_data_mode.py +0 -0
  156. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_image_context.py +0 -0
  157. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_lazy_provider_imports.py +0 -0
  158. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_mcp_client_shim.py +0 -0
  159. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_mcp_config_validation.py +0 -0
  160. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_mcp_manager.py +0 -0
  161. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_mcp_manager_command_allowlist.py +0 -0
  162. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_mcp_policy.py +0 -0
  163. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_openai_compatible_llm_provider.py +0 -0
  164. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_permission_modes.py +0 -0
  165. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_plugin_manager.py +0 -0
  166. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_policy_gate.py +0 -0
  167. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_process_tree_teardown.py +0 -0
  168. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_redact_process_secrets.py +0 -0
  169. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_response_emitter.py +0 -0
  170. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_rule_injector.py +0 -0
  171. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_rule_manager.py +0 -0
  172. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_safe_anchor_uri.py +0 -0
  173. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skill_fetch_redirects.py +0 -0
  174. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skill_github_import.py +0 -0
  175. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skill_manager.py +0 -0
  176. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skill_manifest.py +0 -0
  177. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skill_reconciler.py +0 -0
  178. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_skills_handlers.py +0 -0
  179. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_tour_config.py +0 -0
  180. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_user_input_wait.py +0 -0
  181. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_ws_callback_handler_leak.py +0 -0
  182. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/test_ws_handler_auth.py +0 -0
  183. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
  184. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
  185. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/__mocks__/svg.ts +0 -0
  186. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/__mocks__/tiktoken.ts +0 -0
  187. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/ask-user-question.test.tsx +0 -0
  188. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/cell-output-bundle.test.ts +0 -0
  189. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/cell-output-features.test.ts +0 -0
  190. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/cell-output-toolbar.test.ts +0 -0
  191. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/chat-progress-feedback.test.ts +0 -0
  192. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/checkbox.test.tsx +0 -0
  193. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/choose-workspace-directory.test.ts +0 -0
  194. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/claude-mcp-paste.test.ts +0 -0
  195. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/coding-agent-launchers.test.ts +0 -0
  196. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/launcher-picker.test.tsx +0 -0
  197. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/markdown-renderer.test.tsx +0 -0
  198. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/mcp-util.test.ts +0 -0
  199. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/notebook-generation.test.ts +0 -0
  200. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
  201. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/permission-mode-select.test.tsx +0 -0
  202. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/plugins-panel.test.tsx +0 -0
  203. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/safe-anchor.test.tsx +0 -0
  204. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/setup.ts +0 -0
  205. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/skill-wire-format.test.ts +0 -0
  206. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/task-target-notebook.test.ts +0 -0
  207. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/terminal-drag.test.ts +0 -0
  208. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tool-call-card.test.tsx +0 -0
  209. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tool-call-group.test.tsx +0 -0
  210. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tool-call-stream.test.ts +0 -0
  211. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tour-config.test.ts +0 -0
  212. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tour-events.test.ts +0 -0
  213. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tour-overlay.test.tsx +0 -0
  214. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tour-state.test.ts +0 -0
  215. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/tsconfig.json +0 -0
  216. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/utils.test.ts +0 -0
  217. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tests/ts/workspace-skips.test.ts +0 -0
  218. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/tsconfig.json +0 -0
  219. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/.eslintrc.js +0 -0
  220. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/README.md +0 -0
  221. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/jupyter_server_test_config.py +0 -0
  222. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/package.json +0 -0
  223. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/playwright.config.ts +0 -0
  224. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/cell-output.spec.ts +0 -0
  225. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
  226. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
  227. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/extension.spec.ts +0 -0
  228. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/helpers.ts +0 -0
  229. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/launcher.spec.ts +0 -0
  230. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
  231. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/tsconfig.json +0 -0
  232. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/ui-tests/yarn.lock +0 -0
  233. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/webpack.config.js +0 -0
  234. {notebook_intelligence-5.2.1 → notebook_intelligence-5.3.0a1}/yarn.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: notebook_intelligence
3
- Version: 5.2.1
3
+ Version: 5.3.0a1
4
4
  Summary: AI coding assistant for JupyterLab
5
5
  Project-URL: Homepage, https://github.com/plmbr/notebook-intelligence
6
6
  Project-URL: Bug Tracker, https://github.com/plmbr/notebook-intelligence/issues
@@ -835,6 +835,12 @@ Long Claude turns surface an elapsed-time counter and a heartbeat-driven pulse w
835
835
 
836
836
  In Claude mode, workspace files attached as chat context arrive as `@`-mention pointers rather than inlined file contents. Claude's Read tool fetches them on demand, which means images, large files, and notebooks (cell-aware) now work where the older content-injection path silently truncated or skipped them.
837
837
 
838
+ #### Usage footer
839
+
840
+ Enable **Show usage after each turn** in the Settings dialog to append a small footer under each Claude-mode reply with the turn's duration, token counts (with a cached-input breakdown), and cost — for example `12.3s · 45.2K in (38.1K cached) / 1.2K out · $0.0842`. It is off by default.
841
+
842
+ The cost figure comes from the Claude Code CLI, priced from Anthropic's public list rates. It is shown only when NBI is configured with a direct Anthropic API key on the default endpoint, and is omitted otherwise — on a subscription login (where the marginal cost is effectively $0), an enterprise-negotiated contract, or a custom **Base URL** (proxy, gateway, or non-Anthropic endpoint) — since the list-price figure would not match your actual billing. Duration and token counts are always shown.
843
+
838
844
  #### Claude Code launcher tile
839
845
 
840
846
  When the Claude CLI is on `PATH`, the JupyterLab launcher (the panel that opens with new tabs) shows a **Claude Code** tile alongside the standard kernel launchers. Clicking it opens a session picker; search across past transcripts and resume one in a fresh terminal, or start a new session in the file browser's active subdirectory. Session IDs are copyable from the picker for paste into a `claude --resume <id>` command.
@@ -1119,7 +1125,7 @@ c.NotebookIntelligence.enable_chat_feedback = True
1119
1125
  jupyter lab --NotebookIntelligence.enable_chat_feedback=true
1120
1126
  ```
1121
1127
 
1122
- The feedback fires an in-process `telemetry` event. Nothing leaves the process by default see the [admin guide](docs/admin-guide.md#chat-feedback-event-hook) for how to wire it into your observability stack.
1128
+ The feedback fires an in-process `telemetry` event. Nothing leaves the process by default. See the [admin guide](docs/admin-guide.md#telemetry-events) for the full set of telemetry events and how to wire them into your observability stack.
1123
1129
 
1124
1130
  The thumbs buttons reveal on hover by default. To keep them always visible, enable:
1125
1131
 
@@ -62,9 +62,9 @@ The encrypted GitHub token uses a default password (`nbi-access-token-password`)
62
62
 
63
63
  ## Telemetry
64
64
 
65
- NBI does not collect telemetry, send analytics, or report usage.
65
+ NBI has no central server and sends no telemetry, analytics, or usage data to any external service.
66
66
 
67
- The `enable_chat_feedback` traitlet (off by default) emits an internal `telemetry` event when a user gives thumbs-up/down feedback in chat. The event is **emitted in-process only** nothing leaves the process unless you write a custom handler that listens for it. See [`docs/admin-guide.md`](docs/admin-guide.md#chat-feedback-event-hook).
67
+ Internally, NBI emits `telemetry` events that signal feature usage: chat, inline completion, and cell inline chat lifecycle events (including when a suggestion is accepted or dismissed), plus thumbs-up/down chat feedback when `enable_chat_feedback` is on. These events are **emitted in-process only**. By default nothing listens for them, so they go nowhere and never leave the process; an administrator can register a listener to collect them. See [`docs/admin-guide.md`](docs/admin-guide.md#telemetry-events).
68
68
 
69
69
  ## Reproducibility caveat
70
70
 
@@ -117,6 +117,12 @@ Long Claude turns surface an elapsed-time counter and a heartbeat-driven pulse w
117
117
 
118
118
  In Claude mode, workspace files attached as chat context arrive as `@`-mention pointers rather than inlined file contents. Claude's Read tool fetches them on demand, which means images, large files, and notebooks (cell-aware) now work where the older content-injection path silently truncated or skipped them.
119
119
 
120
+ #### Usage footer
121
+
122
+ Enable **Show usage after each turn** in the Settings dialog to append a small footer under each Claude-mode reply with the turn's duration, token counts (with a cached-input breakdown), and cost — for example `12.3s · 45.2K in (38.1K cached) / 1.2K out · $0.0842`. It is off by default.
123
+
124
+ The cost figure comes from the Claude Code CLI, priced from Anthropic's public list rates. It is shown only when NBI is configured with a direct Anthropic API key on the default endpoint, and is omitted otherwise — on a subscription login (where the marginal cost is effectively $0), an enterprise-negotiated contract, or a custom **Base URL** (proxy, gateway, or non-Anthropic endpoint) — since the list-price figure would not match your actual billing. Duration and token counts are always shown.
125
+
120
126
  #### Claude Code launcher tile
121
127
 
122
128
  When the Claude CLI is on `PATH`, the JupyterLab launcher (the panel that opens with new tabs) shows a **Claude Code** tile alongside the standard kernel launchers. Clicking it opens a session picker; search across past transcripts and resume one in a fresh terminal, or start a new session in the file browser's active subdirectory. Session IDs are copyable from the picker for paste into a `claude --resume <id>` command.
@@ -401,7 +407,7 @@ c.NotebookIntelligence.enable_chat_feedback = True
401
407
  jupyter lab --NotebookIntelligence.enable_chat_feedback=true
402
408
  ```
403
409
 
404
- The feedback fires an in-process `telemetry` event. Nothing leaves the process by default see the [admin guide](docs/admin-guide.md#chat-feedback-event-hook) for how to wire it into your observability stack.
410
+ The feedback fires an in-process `telemetry` event. Nothing leaves the process by default. See the [admin guide](docs/admin-guide.md#telemetry-events) for the full set of telemetry events and how to wire them into your observability stack.
405
411
 
406
412
  The thumbs buttons reveal on hover by default. To keep them always visible, enable:
407
413
 
@@ -21,7 +21,7 @@ This guide covers deploying Notebook Intelligence at scale — JupyterHub, KubeS
21
21
  - [Restricting features for managed deployments](#restricting-features-for-managed-deployments)
22
22
  - [Multi-tenancy and per-team scoping](#multi-tenancy-and-per-team-scoping)
23
23
  - [Managed Claude Skills token](#managed-claude-skills-token)
24
- - [Chat feedback event hook](#chat-feedback-event-hook)
24
+ - [Telemetry events](#telemetry-events)
25
25
  - [HTTP API surface](#http-api-surface)
26
26
  - [Failure modes](#failure-modes)
27
27
  - [Version matrix](#version-matrix)
@@ -643,13 +643,43 @@ The reconciler handles skill name collisions between manifests and user-authored
643
643
 
644
644
  ---
645
645
 
646
- ## Chat feedback event hook
646
+ ## Telemetry events
647
647
 
648
- When `enable_chat_feedback = True`, NBI emits a `telemetry` event in-process whenever a user gives thumbs-up/down feedback in chat. The event payload includes the rating, the prompt, the response, and the model.
648
+ NBI emits `telemetry` events in-process to signal feature usage. The events are **emitted in-process only**: by default nothing listens for them, so they go nowhere and never leave the process. To collect them (for example, to forward usage into an internal observability stack such as Kafka or an OTel collector), write a JupyterLab extension that registers a listener through NBI's `INotebookIntelligence` token and forwards what it receives. Payload shapes are not currently considered stable API; if you build on them, pin to a specific NBI version.
649
649
 
650
- The event is **emitted in-process only**. Nothing leaves the process unless you write a custom handler that listens for it. The payload shape is not currently considered stable API; if you build on it, pin to a specific NBI version.
650
+ Each event has a `type` (the identifier below) and a `data` payload carrying the relevant model and context. Auto-complete (inline completion) and cell inline chat are reported as separate event families, so a listener can tell the two features apart by `type` alone.
651
651
 
652
- To pipe feedback into your internal observability stack (Kafka, OTel collector), write an extension that registers a listener for the `telemetry` event and forwards it.
652
+ Auto-complete:
653
+
654
+ | Event `type` | Fires when |
655
+ | ---------------------------- | ------------------------------------------------------------- |
656
+ | `inline-completion-request` | A ghost-text completion is requested as the user types. |
657
+ | `inline-completion-response` | A suggestion is returned (carries `timeElapsed`). |
658
+ | `inline-completion-accepted` | The user accepts a suggestion (Tab or the completer toolbar). |
659
+
660
+ Cell inline chat:
661
+
662
+ | Event `type` | Fires when |
663
+ | ----------------------- | ------------------------------------------------------------------- |
664
+ | `inline-chat-request` | The user submits an inline-chat prompt (carries the `prompt`). |
665
+ | `inline-chat-response` | A generation completes (carries `timeElapsed`). |
666
+ | `inline-chat-accepted` | Generated code is applied, with `mode` = `review` or `auto-insert`. |
667
+ | `inline-chat-dismissed` | The popover is closed after code was shown but never applied. |
668
+
669
+ Chat and feedback:
670
+
671
+ | Event `type` | Fires when |
672
+ | -------------------------------- | ------------------------------------------------------------------------------------------ |
673
+ | `chat-request` / `chat-response` | A message is sent to / answered by the chat sidebar. |
674
+ | `feedback` | The user gives thumbs-up/down on a chat response (`sentiment` = `positive` or `negative`). |
675
+
676
+ NBI also emits request events for the chat sidebar's code and output actions (`generate-code-request`, `explain-this-request`, `fix-this-code-request`, `explain-this-output-request`, `troubleshoot-this-output-request`, `output-follow-up-request`).
677
+
678
+ The `inline-completion-*`, `inline-chat-*`, and chat/action events fire whenever those features are used; they are not gated by any setting. To measure how often auto-complete suggestions are taken, compare `inline-completion-accepted` against `inline-completion-response`; the gap is the ignore rate. Only the `feedback` event is gated, by `enable_chat_feedback` (off by default), which also controls the thumbs-up/down UI:
679
+
680
+ ```python
681
+ c.NotebookIntelligence.enable_chat_feedback = True
682
+ ```
653
683
 
654
684
  The thumbs buttons reveal on hover by default. To keep them always visible, enable:
655
685
 
@@ -663,40 +693,40 @@ c.NotebookIntelligence.enable_chat_feedback_always_visible = True
663
693
 
664
694
  All routes live under `/notebook-intelligence/`. All require Jupyter authentication (XSRF token plus Jupyter login token) including the `/copilot` WebSocket upgrade, which now inherits Jupyter's `WebSocketMixin` + `JupyterHandler` so the same `allow_origin` and identity-provider checks that apply to REST handlers also apply to the chat WS endpoint. The labextension obtains these automatically. There is no admin-only route; access control runs through Jupyter Server itself.
665
695
 
666
- | Route | Method | Purpose |
667
- | ----------------------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------- |
668
- | `/notebook-intelligence/capabilities` | GET | Capabilities + tool/provider gate state. |
669
- | `/notebook-intelligence/config` | GET/POST | Read or update user-scope config. |
670
- | `/notebook-intelligence/update-provider-models` | POST | Refresh model list for a provider (e.g., Anthropic SDK refresh). |
671
- | `/notebook-intelligence/mcp-config-file` | GET/POST | Read or write `~/.jupyter/nbi/mcp.json`. |
672
- | `/notebook-intelligence/reload-mcp-servers` | POST | Re-discover MCP servers without restarting JupyterLab. |
673
- | `/notebook-intelligence/emit-telemetry-event` | POST | Used by the frontend to emit `telemetry` events (e.g., chat feedback). |
674
- | `/notebook-intelligence/gh-login-status` | GET | GitHub Copilot login state. |
675
- | `/notebook-intelligence/gh-login` | POST | Begin GitHub Copilot device-flow login. |
676
- | `/notebook-intelligence/gh-logout` | GET | Sign out of GitHub Copilot. |
677
- | `/notebook-intelligence/copilot` | WS | Streaming chat / inline-completion WebSocket. |
678
- | `/notebook-intelligence/rules` | GET | List discovered rules. |
679
- | `/notebook-intelligence/rules/<id>/toggle` | PUT | Toggle a rule's `active` field. |
680
- | `/notebook-intelligence/rules/reload` | POST | Manually reload all rules. |
681
- | `/notebook-intelligence/skills` | GET/POST | List or create skills. |
682
- | `/notebook-intelligence/skills/context` | GET | Skill context info for the active workspace. |
683
- | `/notebook-intelligence/skills/import/preview` | POST | Preview a GitHub-hosted skill before installing. |
684
- | `/notebook-intelligence/skills/import` | POST | Install a GitHub-hosted skill (user-initiated). |
685
- | `/notebook-intelligence/skills/reconcile` | POST | Run the managed-skills reconciler. Returns 409 if `NBI_SKILLS_MANIFEST` is unset. |
686
- | `/notebook-intelligence/skills/reconciler/stop` | POST | Incident-response kill switch. Stops the background reconciler without a server restart. Idempotent. |
687
- | `/notebook-intelligence/skills/<scope>/<name>` | GET/PUT/DELETE | Skill detail; managed skills are read-only. |
688
- | `/notebook-intelligence/skills/<scope>/<name>/rename` | POST | Rename a skill (denied for managed skills). |
689
- | `/notebook-intelligence/skills/<scope>/<name>/files` | GET/POST/DELETE | Skill bundle file ops. |
690
- | `/notebook-intelligence/skills/<scope>/<name>/files/rename` | POST | Rename a file inside a skill bundle. |
691
- | `/notebook-intelligence/upload-file` | POST | Upload a file to attach as chat context (size and retention governed by `upload_max_mb` / `upload_retention_hours`). |
692
- | `/notebook-intelligence/claude-sessions` | GET | List Claude Code sessions for the working directory. |
693
- | `/notebook-intelligence/claude-sessions/resume` | POST | Resume a Claude session. |
694
- | `/notebook-intelligence/claude-mcp` | GET/POST | List or add Claude-mode MCP servers. Gated by `claude_mcp_management_policy`. |
695
- | `/notebook-intelligence/claude-mcp/<scope>/<name>` | GET/DELETE | Get or remove a Claude-mode MCP server by scope (user/project/local) and name. |
696
- | `/notebook-intelligence/plugins` | GET/POST | List or install Claude plugins. Gated by `claude_plugins_management_policy`. |
697
- | `/notebook-intelligence/plugins/<scope>/<name>` | POST/DELETE | Enable or disable (POST with `{"action": "enable"\|"disable"}`) or uninstall (DELETE) a plugin. |
698
- | `/notebook-intelligence/plugins/marketplace` | GET/POST | List or add plugin marketplaces. GitHub-sourced adds are gated by `allow_github_plugin_import`. |
699
- | `/notebook-intelligence/plugins/marketplace/<name>` | DELETE | Remove a plugin marketplace. |
696
+ | Route | Method | Purpose |
697
+ | ----------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
698
+ | `/notebook-intelligence/capabilities` | GET | Capabilities + tool/provider gate state. |
699
+ | `/notebook-intelligence/config` | GET/POST | Read or update user-scope config. |
700
+ | `/notebook-intelligence/update-provider-models` | POST | Refresh model list for a provider (e.g., Anthropic SDK refresh). |
701
+ | `/notebook-intelligence/mcp-config-file` | GET/POST | Read or write `~/.jupyter/nbi/mcp.json`. |
702
+ | `/notebook-intelligence/reload-mcp-servers` | POST | Re-discover MCP servers without restarting JupyterLab. |
703
+ | `/notebook-intelligence/emit-telemetry-event` | POST | Used by the frontend to emit `telemetry` events (chat feedback, inline completion and inline chat usage). See [Telemetry events](#telemetry-events). |
704
+ | `/notebook-intelligence/gh-login-status` | GET | GitHub Copilot login state. |
705
+ | `/notebook-intelligence/gh-login` | POST | Begin GitHub Copilot device-flow login. |
706
+ | `/notebook-intelligence/gh-logout` | GET | Sign out of GitHub Copilot. |
707
+ | `/notebook-intelligence/copilot` | WS | Streaming chat / inline-completion WebSocket. |
708
+ | `/notebook-intelligence/rules` | GET | List discovered rules. |
709
+ | `/notebook-intelligence/rules/<id>/toggle` | PUT | Toggle a rule's `active` field. |
710
+ | `/notebook-intelligence/rules/reload` | POST | Manually reload all rules. |
711
+ | `/notebook-intelligence/skills` | GET/POST | List or create skills. |
712
+ | `/notebook-intelligence/skills/context` | GET | Skill context info for the active workspace. |
713
+ | `/notebook-intelligence/skills/import/preview` | POST | Preview a GitHub-hosted skill before installing. |
714
+ | `/notebook-intelligence/skills/import` | POST | Install a GitHub-hosted skill (user-initiated). |
715
+ | `/notebook-intelligence/skills/reconcile` | POST | Run the managed-skills reconciler. Returns 409 if `NBI_SKILLS_MANIFEST` is unset. |
716
+ | `/notebook-intelligence/skills/reconciler/stop` | POST | Incident-response kill switch. Stops the background reconciler without a server restart. Idempotent. |
717
+ | `/notebook-intelligence/skills/<scope>/<name>` | GET/PUT/DELETE | Skill detail; managed skills are read-only. |
718
+ | `/notebook-intelligence/skills/<scope>/<name>/rename` | POST | Rename a skill (denied for managed skills). |
719
+ | `/notebook-intelligence/skills/<scope>/<name>/files` | GET/POST/DELETE | Skill bundle file ops. |
720
+ | `/notebook-intelligence/skills/<scope>/<name>/files/rename` | POST | Rename a file inside a skill bundle. |
721
+ | `/notebook-intelligence/upload-file` | POST | Upload a file to attach as chat context (size and retention governed by `upload_max_mb` / `upload_retention_hours`). |
722
+ | `/notebook-intelligence/claude-sessions` | GET | List Claude Code sessions for the working directory. |
723
+ | `/notebook-intelligence/claude-sessions/resume` | POST | Resume a Claude session. |
724
+ | `/notebook-intelligence/claude-mcp` | GET/POST | List or add Claude-mode MCP servers. Gated by `claude_mcp_management_policy`. |
725
+ | `/notebook-intelligence/claude-mcp/<scope>/<name>` | GET/DELETE | Get or remove a Claude-mode MCP server by scope (user/project/local) and name. |
726
+ | `/notebook-intelligence/plugins` | GET/POST | List or install Claude plugins. Gated by `claude_plugins_management_policy`. |
727
+ | `/notebook-intelligence/plugins/<scope>/<name>` | POST/DELETE | Enable or disable (POST with `{"action": "enable"\|"disable"}`) or uninstall (DELETE) a plugin. |
728
+ | `/notebook-intelligence/plugins/marketplace` | GET/POST | List or add plugin marketplaces. GitHub-sourced adds are gated by `allow_github_plugin_import`. |
729
+ | `/notebook-intelligence/plugins/marketplace/<name>` | DELETE | Remove a plugin marketplace. |
700
730
 
701
731
  The extension respects `c.ServerApp.base_url`. Behind JupyterHub at `/user/<name>/` everything still works because JupyterLab proxies routes through the per-user base URL automatically.
702
732
 
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '5.2.1'
4
+ __version__ = VERSION = '5.3.0a1'
@@ -141,6 +141,8 @@ class ChatRequest:
141
141
  tool_selection: RequestToolSelection = None
142
142
  command: str = ''
143
143
  prompt: str = ''
144
+ language: str = ''
145
+ kernel_name: str = ''
144
146
  chat_history: list[dict] = None
145
147
  cancel_token: CancelToken = None
146
148
  # NEW: Add context for rule evaluation
@@ -909,7 +911,10 @@ class TelemetryEventType(str, Enum):
909
911
  InlineChatRequest = 'inline-chat-request'
910
912
  ChatResponse = 'chat-response'
911
913
  InlineChatResponse = 'inline-chat-response'
914
+ InlineChatAccepted = 'inline-chat-accepted'
915
+ InlineChatDismissed = 'inline-chat-dismissed'
912
916
  InlineCompletionResponse = 'inline-completion-response'
917
+ InlineCompletionAccepted = 'inline-completion-accepted'
913
918
  Feedback = 'feedback'
914
919
 
915
920
  class TelemetryEvent:
@@ -102,6 +102,14 @@ class CreateNewNotebookTool(Tool):
102
102
  }
103
103
  }
104
104
  }
105
+ },
106
+ "language": {
107
+ "type": "string",
108
+ "description": "Programming language for the notebook kernel, e.g. python or r"
109
+ },
110
+ "kernel_name": {
111
+ "type": "string",
112
+ "description": "Jupyter kernel name to use when creating the notebook"
105
113
  }
106
114
  },
107
115
  "required": [],
@@ -120,8 +128,13 @@ class CreateNewNotebookTool(Tool):
120
128
 
121
129
  async def handle_tool_call(self, request: ChatRequest, response: ChatResponse, tool_context: dict, tool_args: dict) -> str:
122
130
  cell_sources = tool_args.get('cell_sources', [])
131
+ language = tool_args.get('language') or request.language or 'python'
132
+ kernel_name = tool_args.get('kernel_name') or request.kernel_name or ''
123
133
 
124
- ui_cmd_response = await response.run_ui_command('notebook-intelligence:create-new-notebook-from-py', {'code': ''})
134
+ ui_cmd_response = await response.run_ui_command(
135
+ 'notebook-intelligence:create-new-notebook',
136
+ {'code': '', 'language': language, 'kernelName': kernel_name}
137
+ )
125
138
  file_path = ui_cmd_response['path']
126
139
 
127
140
  for cell_source in cell_sources:
@@ -133,7 +146,55 @@ class CreateNewNotebookTool(Tool):
133
146
  source = cell_source.get('source', '')
134
147
  ui_cmd_response = await response.run_ui_command('notebook-intelligence:add-code-cell-to-notebook', {'code': source, 'path': file_path})
135
148
 
136
- return "Notebook created successfully at {file_path}"
149
+ return f"Notebook created successfully at {file_path}"
150
+
151
+
152
+ class ListAvailableNotebookKernelsTool(Tool):
153
+ @property
154
+ def name(self) -> str:
155
+ return "list_available_notebook_kernels"
156
+
157
+ @property
158
+ def title(self) -> str:
159
+ return "List available notebook kernels"
160
+
161
+ @property
162
+ def tags(self) -> list[str]:
163
+ return ["default-participant-tool"]
164
+
165
+ @property
166
+ def description(self) -> str:
167
+ return "Lists Jupyter kernels available in the current frontend environment"
168
+
169
+ @property
170
+ def schema(self) -> dict:
171
+ return {
172
+ "type": "function",
173
+ "function": {
174
+ "name": self.name,
175
+ "description": self.description,
176
+ "strict": True,
177
+ "parameters": {
178
+ "type": "object",
179
+ "properties": {},
180
+ "required": [],
181
+ "additionalProperties": False,
182
+ },
183
+ },
184
+ }
185
+
186
+ def pre_invoke(self, request: ChatRequest, tool_args: dict) -> Union[ToolPreInvokeResponse, None]:
187
+ return ToolPreInvokeResponse(
188
+ f"Calling tool '{self.name}'",
189
+ detail={"title": "Parameters", "content": json.dumps(tool_args)},
190
+ )
191
+
192
+ async def handle_tool_call(self, request: ChatRequest, response: ChatResponse, tool_context: dict, tool_args: dict) -> str:
193
+ ui_cmd_response = await response.run_ui_command(
194
+ 'notebook-intelligence:list-available-notebook-kernels',
195
+ {}
196
+ )
197
+ return json.dumps(ui_cmd_response)
137
198
 
138
199
  class AddMarkdownCellToNotebookTool(Tool):
139
200
  def __init__(self, auto_approve: bool = False):
@@ -379,7 +440,8 @@ class BaseChatParticipant(ChatParticipant):
379
440
  chat_model = request.host.chat_model
380
441
  messages = request.chat_history.copy()
381
442
  messages.pop()
382
- messages.insert(0, {"role": "system", "content": f"You are an assistant that creates Python code which will be used in a Jupyter notebook. Generate only Python code and some comments for the code. You should return the code directly, without wrapping it inside ```."})
443
+ language = request.language or 'python'
444
+ messages.insert(0, {"role": "system", "content": f"You are an assistant that creates {language} code which will be used in a Jupyter notebook. Generate only {language} code and some comments for the code. You should return the code directly, without wrapping it inside ```."})
383
445
  messages.append({"role": "user", "content": f"Generate code for: {request.prompt}"})
384
446
  generated = chat_model.completions(messages)
385
447
  code = generated['choices'][0]['message']['content']
@@ -440,8 +502,17 @@ class BaseChatParticipant(ChatParticipant):
440
502
  async def handle_ask_mode_chat_request(self, request: ChatRequest, response: ChatResponse, options: dict = {}) -> None:
441
503
  chat_model = request.host.chat_model
442
504
  if request.command == 'newNotebook':
505
+ language = request.language or 'python'
506
+ kernel_name = request.kernel_name or ''
443
507
  # create a new notebook
444
- ui_cmd_response = await response.run_ui_command('notebook-intelligence:create-new-notebook-from-py', {'code': ''})
508
+ ui_cmd_response = await response.run_ui_command(
509
+ 'notebook-intelligence:create-new-notebook',
510
+ {
511
+ 'code': '',
512
+ 'language': language,
513
+ 'kernelName': kernel_name,
514
+ }
515
+ )
445
516
  file_path = ui_cmd_response['path']
446
517
 
447
518
  code = await self.generate_code_cell(request)
@@ -494,6 +565,8 @@ class BaseChatParticipant(ChatParticipant):
494
565
  def get_tool_by_name(name: str) -> Tool:
495
566
  if name == "create_new_notebook":
496
567
  return CreateNewNotebookTool()
568
+ elif name == "list_available_notebook_kernels":
569
+ return ListAvailableNotebookKernelsTool()
497
570
  elif name == "add_markdown_cell_to_notebook":
498
571
  return AddMarkdownCellToNotebookTool()
499
572
  elif name == "add_code_cell_to_notebook":