notebook-intelligence 5.2.1a1__tar.gz → 5.3.0a2__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.
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/PKG-INFO +15 -5
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/PRIVACY.md +2 -2
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/README.md +7 -1
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/docs/admin-guide.md +69 -39
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/api.py +5 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/base_chat_participant.py +77 -4
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/built_in_toolsets.py +218 -22
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/claude.py +339 -16
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/claude_sessions.py +6 -2
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/context_factory.py +9 -2
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/extension.py +42 -3
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2/notebook_intelligence/labextension}/package.json +3 -2
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +3 -2
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/rule_manager.py +8 -3
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/ruleset.py +70 -17
- notebook_intelligence-5.3.0a2/package.json +265 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/pyproject.toml +17 -6
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/conftest.py +7 -3
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/01-test-global.md +3 -1
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_base_chat_participant_integration.py +86 -2
- notebook_intelligence-5.3.0a2/tests/test_builtin_search_files_sandbox.py +275 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_client.py +58 -0
- notebook_intelligence-5.3.0a2/tests/test_claude_models.py +492 -0
- notebook_intelligence-5.3.0a2/tests/test_claude_turn_usage.py +189 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_context_factory.py +8 -4
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_end_to_end_rule_integration.py +17 -8
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_models.py +43 -22
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_rule_auto_reload.py +4 -4
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_websocket_handler_integration.py +142 -0
- notebook_intelligence-5.3.0a2/tests/ts/inline-completer-telemetry.test.ts +119 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/yarn.lock +494 -367
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/package.json +0 -269
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/196.da0c2020639344d5c419.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/327.47473c656f6c27efa1dc.js +0 -2
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/327.47473c656f6c27efa1dc.js.LICENSE.txt +0 -9
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/490.ca1d1006275ec50e58e8.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/537.211b1ccdcc268aa3fd2d.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/631.f00d05d8305a78ec8301.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/671.1b1a53f5f75bff82950b.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/694.2ebfa9714301d9260bf0.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/728.14572b771377e7f3a104.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/745.e077633fb1e31ec9da96.js +0 -2
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/745.e077633fb1e31ec9da96.js.LICENSE.txt +0 -10
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/977.b917f705175326af0e5d.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/be02dcbf2787b0b29ec8.module.wasm +0 -0
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/e589c9ba04e3e5a90081.module.wasm +0 -0
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -60
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/remoteEntry.bafed513881c07b31511.js +0 -1
- notebook_intelligence-5.2.1a1/notebook_intelligence/labextension/static/third-party-licenses.json +0 -1264
- notebook_intelligence-5.2.1a1/tests/test_claude_models.py +0 -177
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.copier-answers.yml +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.editorconfig +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.gitignore +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/h +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/post-commit +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/post-merge +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-push +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.husky/pre-commit +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.prettierignore +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.vscode/extensions.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.vscode/settings.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/.yarnrc.yml +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/CHANGELOG.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/CONTRIBUTING.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/LICENSE +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/RELEASE.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/SECURITY.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/docs/admin-tour-config.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/docs/rulesets.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/docs/skills.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/docs/troubleshooting.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/install.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/jest.config.js +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/ai_service_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/config.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/github_copilot.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/mcp_client.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/mcp_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/util.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/schema/plugin.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/setup.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_ai_service_manager_integration.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_cell_output_features_response.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_feedback.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_image_context.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_lazy_provider_imports.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_mcp_client_shim.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_response_emitter.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/claude-mcp-paste.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/plugins-panel.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/setup.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/terminal-drag.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tour-state.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/utils.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/tsconfig.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/README.md +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/package.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/webpack.config.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.3.0a2
|
|
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
|
|
@@ -694,20 +694,24 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
694
694
|
Classifier: Programming Language :: Python :: 3.11
|
|
695
695
|
Classifier: Programming Language :: Python :: 3.12
|
|
696
696
|
Requires-Python: >=3.10
|
|
697
|
+
Requires-Dist: aiohttp>=3.14.1
|
|
697
698
|
Requires-Dist: anthropic>=0.22.1
|
|
698
699
|
Requires-Dist: claude-agent-sdk
|
|
699
700
|
Requires-Dist: cryptography
|
|
700
701
|
Requires-Dist: fuzy-jon==0.1.0
|
|
701
|
-
Requires-Dist: jupyter-server<3,>=2.
|
|
702
|
+
Requires-Dist: jupyter-server<3,>=2.20.0
|
|
702
703
|
Requires-Dist: litellm>=1.83.7
|
|
703
|
-
Requires-Dist: mcp>=1.
|
|
704
|
-
Requires-Dist: mistune>=3.
|
|
704
|
+
Requires-Dist: mcp>=1.28.1
|
|
705
|
+
Requires-Dist: mistune>=3.3.0
|
|
705
706
|
Requires-Dist: ollama
|
|
706
707
|
Requires-Dist: openai
|
|
707
708
|
Requires-Dist: psutil>=5.7
|
|
709
|
+
Requires-Dist: pydantic-settings>=2.14.2
|
|
708
710
|
Requires-Dist: python-multipart>=0.0.27
|
|
709
711
|
Requires-Dist: sseclient-py
|
|
712
|
+
Requires-Dist: starlette>=1.3.1
|
|
710
713
|
Requires-Dist: tiktoken
|
|
714
|
+
Requires-Dist: tornado>=6.5.7
|
|
711
715
|
Requires-Dist: urllib3>=2.7.0
|
|
712
716
|
Provides-Extra: test
|
|
713
717
|
Requires-Dist: psutil; extra == 'test'
|
|
@@ -835,6 +839,12 @@ Long Claude turns surface an elapsed-time counter and a heartbeat-driven pulse w
|
|
|
835
839
|
|
|
836
840
|
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
841
|
|
|
842
|
+
#### Usage footer
|
|
843
|
+
|
|
844
|
+
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.
|
|
845
|
+
|
|
846
|
+
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.
|
|
847
|
+
|
|
838
848
|
#### Claude Code launcher tile
|
|
839
849
|
|
|
840
850
|
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 +1129,7 @@ c.NotebookIntelligence.enable_chat_feedback = True
|
|
|
1119
1129
|
jupyter lab --NotebookIntelligence.enable_chat_feedback=true
|
|
1120
1130
|
```
|
|
1121
1131
|
|
|
1122
|
-
The feedback fires an in-process `telemetry` event. Nothing leaves the process by default
|
|
1132
|
+
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
1133
|
|
|
1124
1134
|
The thumbs buttons reveal on hover by default. To keep them always visible, enable:
|
|
1125
1135
|
|
|
@@ -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
|
|
65
|
+
NBI has no central server and sends no telemetry, analytics, or usage data to any external service.
|
|
66
66
|
|
|
67
|
-
|
|
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
|
|
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
|
-
- [
|
|
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
|
-
##
|
|
646
|
+
## Telemetry events
|
|
647
647
|
|
|
648
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
|
{notebook_intelligence-5.2.1a1 → notebook_intelligence-5.3.0a2}/notebook_intelligence/api.py
RENAMED
|
@@ -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(
|
|
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
|
-
|
|
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(
|
|
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":
|