notebook-intelligence 6.0.0a2__tar.gz → 6.1.0__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-6.0.0a2 → notebook_intelligence-6.1.0}/CHANGELOG.md +40 -5
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/CONTRIBUTING.md +7 -2
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/PKG-INFO +33 -13
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/PRIVACY.md +23 -21
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/README.md +23 -4
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/RELEASE.md +11 -2
- notebook_intelligence-6.1.0/SECURITY.md +53 -0
- notebook_intelligence-6.1.0/docs/acp.md +34 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/admin-guide.md +15 -2
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/admin-tour-config.md +15 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/chatbook-extensions.md +1 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/chatbook.md +40 -4
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/performance-diagnostics.md +5 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/rulesets.md +2 -2
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/troubleshooting.md +12 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/ai_service_manager.py +41 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_generate.py +147 -7
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/codegen.py +34 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/extension.py +32 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/github_copilot.py +24 -2
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/package.json +10 -2
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +9 -1
- notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/326.73035788381458a47018.js → notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +2 -2
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/701.fba10740dad4e976203f.js +1 -0
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +1 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/editor.worker.js +2 -2
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/remoteEntry.e5f6a45f75a47d403e5b.js +1 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/mcp_client.py +13 -12
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/package.json +9 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/pyproject.toml +77 -43
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_chatbook.py +154 -0
- notebook_intelligence-6.1.0/tests/test_chatbook_perf.py +124 -0
- notebook_intelligence-6.1.0/tests/test_github_copilot_login_gating.py +231 -0
- notebook_intelligence-6.1.0/tests/test_tour_disabled.py +119 -0
- notebook_intelligence-6.1.0/tests/ts/chat-prefix-suggestions.test.ts +140 -0
- notebook_intelligence-6.1.0/tests/ts/select-theme-css.test.ts +66 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tour-state.test.ts +23 -1
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/README.md +13 -8
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/yarn.lock +37 -82
- notebook_intelligence-6.0.0a2/SECURITY.md +0 -43
- notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/701.3d1d9c73116dbb5face8.js +0 -1
- notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/728.7f069be896fa3f595701.js +0 -1
- notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/remoteEntry.e915e95430f82b5f99f1.js +0 -1
- notebook_intelligence-6.0.0a2/tests/ts/chat-prefix-suggestions.test.ts +0 -55
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.copier-answers.yml +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.editorconfig +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.gitignore +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/h +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/post-commit +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/post-merge +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-push +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.husky/pre-commit +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.prettierignore +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.vscode/extensions.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.vscode/settings.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/.yarnrc.yml +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/AGENTS.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/CLAUDE.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/LICENSE +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/docs/skills.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/install.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/jest.config.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/acp_agent.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/acp_mcp_server.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/acp_registry.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/api.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/base_chat_participant.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/built_in_toolsets.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chat_history_budget.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/chatbook_mentions.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/checks.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/claude.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/claude_sessions.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/config.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/inline_completion.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
- /notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/326.73035788381458a47018.js.LICENSE.txt → /notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/mcp_ui_proxy.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/perf.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/perf_probe.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/readiness.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/rule_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/ruleset.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/notebook_intelligence/util.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/schema/plugin.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/setup.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/conftest.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_acp_agent.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_ai_service_manager_dispatch.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_ai_service_manager_integration.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_base_chat_participant_integration.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_builtin_cell_output.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_builtin_search_files_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_cell_output_features_response.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_chat_history_budget.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_chatbook_backend.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_chatbook_danger.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_chatbook_enable.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_bash_approval_rendering.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_client.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_models.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_sdk_mcp_server.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_tool_results.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_claude_turn_usage.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_config_handler_claude_settings.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_disabled_provider_models.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_enabled_providers_env.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_feedback.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_image_context.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_inline_completion_shortcuts.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_lazy_provider_imports.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_client_shim.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_null_config.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_models.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_perf.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_perf_instrumentation.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_perf_probe.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_provider_stream_cancellation.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_readiness.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_response_emitter.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_run_ui_command_allowlist_parity.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_websocket_handler_integration.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/__mocks__/strip-ansi.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chat-cancel.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chat-stopped-turn.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chat-transcript.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chatbook-execute.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chatbook-mentions-menu.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chatbook-mentions.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/chatbook.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/claude-mcp-paste.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/confirmation-details.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/inline-completer-telemetry.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/inline-completion-origin.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/inline-completion-request.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/markdown-code-class.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/mcp-config-save.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/mcp-config-temp-file.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/perf-panel.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/plugins-panel.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/readiness-card.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/settings-property-field.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/settings-required-property.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/settings-tab-name.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/setup.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/terminal-drag.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/utils.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/package.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.1.0}/webpack.config.js +0 -0
|
@@ -8,13 +8,42 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
8
8
|
|
|
9
9
|
<!-- <START NEW CHANGELOG ENTRY> -->
|
|
10
10
|
|
|
11
|
-
## [
|
|
11
|
+
## [6.0.0] - unreleased
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
6.0.0 adds Chatbook, a notebook whose cells can be written in English and executed as generated code, together with its admin policy, its own kernel, and the context, mention, and ruleset plumbing around it. The rest of the release is hardening: the experimental ACP agent mode gets a tighter sandbox and better approval cards, and a long tail of chat, settings, MCP, and readiness fixes. The major version marks Chatbook's arrival rather than a compatibility break: no traitlet, env var, REST route, command id, or on-disk format was renamed or removed, `requires-python` is unchanged at `>=3.10`, and the supported JupyterLab range widened rather than narrowed. Upgrading needs no migration.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Chatbook: notebooks whose cells are written in English** (#406, #448, #480). A Chatbook is an ordinary `.ipynb` opened against a new `chatbook` kernel, in which each cell is either a natural-language prompt (**NL**) or ordinary code (**Cd**). Running an NL cell generates code for the notebook's backend kernel and runs it; the cell badge is a button and `Ctrl J` / `Ctrl Shift J` switch the active cell or every cell between the two modes. Generated code is governed by an execution mode: `always-confirm` (the default) shows the code and waits, `confirm-if-risky` waits only when a scan finds destructive filesystem, shell, or process calls, and `auto-run` executes without asking. `NBI_CHATBOOK_POLICY` gates the whole feature the way every other admin policy does, and `NBI_CHATBOOK_MAX_EXECUTION_MODE` caps how permissive a user may be, so a tenant can pin `always-confirm` and remove the rest from the dropdown. The backend kernel is resolved from the notebook rather than assumed, so Chatbook is not Python-only, and rules under `modes/chatbook/` apply to generation. Cells can pull context with `@` mentions, served by built-in providers and by any that an extension registers (see [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md)); a Chatbook can be exported to a plain code notebook for the backend language. Running a **Cd** cell also asks the model for an English description of that code, stored in cell metadata, so a hand-written cell can be read as prose later. Chatbook ships a kernelspec and one new route, `POST /notebook-intelligence/chatbook/generate`; `ipykernel` is now a runtime dependency. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
18
|
+
- **The MCP handshake is bounded** (#456). A `mcp.json` entry pointing at a command that is not an MCP server never answered the protocol handshake, and the connect attempt could occupy the backend indefinitely. Connect and disconnect now run under deadlines, `NBI_MCP_CONNECT_TIMEOUT` (60 seconds by default) and `NBI_MCP_DISCONNECT_TIMEOUT`, after which the server is marked failed and the log says the command may not be an MCP server. A command that writes non-JSON output in a loop would otherwise fill the log with one parse error per line, so those records are capped and the number withheld is reported with the failure.
|
|
14
19
|
|
|
15
|
-
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **Tab accepts an inline suggestion only when one is on screen** (#444). The accept binding was scoped to `.jp-mod-completer-enabled`, which is set whenever the completer is active, so Tab could be swallowed in an edit-mode cell with nothing to accept instead of indenting. It is now scoped to `.jp-mod-inline-completer-active`. Inline completion responses are also identified per request, so a reply that arrives after its request was superseded is discarded rather than accepted.
|
|
23
|
+
- **Ollama's chat-model list is fetched lazily and bounded** (#427). Enumerating models ran at startup and waited on the Ollama host, so a configured but unreachable host delayed the extension. The enumeration is deferred and time-bounded, and a failure logs a warning instead of holding up load.
|
|
24
|
+
- **A disabled provider no longer advertises its models** (#431). `disabled_providers` removed a provider from the picker but the capabilities response still carried its model list, so a disabled provider's models remained selectable through a stale or hand-edited config.
|
|
25
|
+
- **Dependency floors and build pins** (#422, #445). `@jupyterlab/launcher` widened from `~4.2.0` to `^4.0.0`, which stops JupyterLab 4.6 flagging the dependency. `fast-uri` and `js-yaml` resolutions were raised past HIGH-severity advisories. The build pins `hatchling<1.32`: 1.32 made `BuildHookInterface` generic over two type parameters, and `hatch-jupyter-builder` subclasses it with one, so sdist and wheel builds failed with `TypeError: Too few arguments`. A later audit (#492) raised six Python floors that still named a release carrying a published advisory (`jupyter_server` to 2.21.0, `cryptography` to 50.0.0, `litellm` to 1.84.0, `mistune` to 3.3.3, `python-multipart` to 0.0.31, `aiohttp` to 3.14.3), added the `python-dotenv>=1.2.2` floor that litellm's old `==1.0.1` hard pin had blocked, moved the `pytest` test extra to `>=9.0.3`, and added npm resolutions for `browserslist`, `baseline-browser-mapping`, `colord`, and `postcss-selector-parser`. Those four are build and lint tooling and do not reach the shipped bundle.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
16
28
|
|
|
17
|
-
|
|
29
|
+
- **A forged approval prompt can no longer impersonate the real one** (#415). Command text rendered into a Claude Bash approval card could close the displayed block and add its own trailing content, so what the card showed and what would run could differ. Command text is now fenced with a collision-resistant delimiter and bidirectional control characters are rejected. ACP approval cards apply the same policy.
|
|
30
|
+
- **Backend-requested UI commands are gated behind an allowlist** (#443). The response stream could ask the frontend to execute a JupyterLab command by id, with no restriction on which. Requests are now checked against an allowlist at a single chokepoint. `run-command-in-terminal` remains allowlisted, so shell reachability is unchanged; the change removes the ability to reach arbitrary commands.
|
|
31
|
+
- **ACP agents are no longer served the client's filesystem or terminal** (#418, #419, #423, #424). NBI refused some agent requests and honored others, which let an agent borrow the Jupyter server process's reach. Filesystem reads and writes, terminal methods, and agent extension requests are now refused at the router, so the agent does its own I/O under its own sandbox. Full access, when an admin allows it, grants workspace writes rather than unrestricted access. Approval cards show the command and the reason the agent gave, rendered as separate labeled blocks so a long detail cannot hide the command. An NBI-supplied API key no longer spreads through Codex's own configuration, and the cleanup of previously written credentials states its limits rather than implying it is complete.
|
|
32
|
+
- **The ACP session picker shows something useful** (#421). Session titles were cut inside a context pointer, and previews carried pointer segments that meant nothing to a reader; titles are now cut on a boundary and pointer segments are stripped. Session files are named relative to the open directory.
|
|
33
|
+
- **Saving Claude settings keeps keys the tab does not show** (#420). The Claude settings tab saves the keys it renders when it opens, and the server stored that object in place of the old one. Any other `claude_settings` key was erased, including `jupyter_ui_tools_external` (#398), which is set by hand in `config.json`. `POST /notebook-intelligence/config` now merges a posted `claude_settings` onto the stored value. Settings saves also re-read `config.json` first, so a hand edit made while JupyterLab runs is no longer overwritten when a settings tab next saves. Settings changes are judged against the running state rather than the state the tab opened with.
|
|
34
|
+
- **Readiness reports a blank required model instead of answering Ready** (#459). An OpenAI-compatible or LiteLLM-compatible provider with the **Model** field left empty persisted as an empty string. Readiness answered "Ready. Nothing needs configuring" while every chat turn went out with no model name and failed. A blank required property is now a blocking row naming the field, and the settings form marks it once touched.
|
|
35
|
+
- **The performance report names the provider that served a turn** (#461). Turns were labeled from the resolved model, which reported `copilot` for every Claude-mode turn and mislabeled a Copilot user pinned outside the fallback list. The label now comes from the configured provider, and a malformed config no longer raises on the chat path.
|
|
36
|
+
- **A stopped response says so in the transcript** (#474, #477, #478, #479). Stopping a response left the bubble exactly as it was, indistinguishable from a model that returned nothing. The turn is now marked, and the marker survives both later deltas and a second turn streaming alongside it. Stop also reaches every turn that is running, not only the one the sidebar input started, so a response begun from an editor command can be stopped; and the openai-compatible, LiteLLM-compatible, and Ollama chat models now read the cancel token and close the stream, so a stopped turn stops generating at the provider instead of running to completion.
|
|
37
|
+
- **Concurrent turns no longer erase each other from the transcript** (#478). A streaming turn rewrote the whole transcript from a snapshot taken when it started, so a turn begun from an editor command while a sidebar response streamed removed that response and its prompt. Each turn now updates only its own message, and a response is placed next to the prompt it answers.
|
|
38
|
+
- **Enter sends a message that starts with an unmatched `@` or `/`** (#464). Typing a prefix that matched no completion left the suggestion popover open with nothing selected, and Enter raised rather than sending; the message could not be sent at all without editing it.
|
|
39
|
+
- **The MCP config editor reports a JSON syntax error** (#470) and **no longer deletes a temp file it has not created** (#460). Saving malformed JSON parsed the document outside the error handling, so the edit was dropped with no message anywhere but the devtools console while the tab looked saved. Opening the editor also deleted its temp file first, which answered 404 on every open because the file is normally absent.
|
|
40
|
+
- **A malformed `mcp.json` no longer takes down MCP support** (#433). A bad `mcpServers` or `participants` section raised during parsing; the malformed section is now skipped with a log line and the rest of the file is honored.
|
|
41
|
+
- **`NBI_ENABLED_PROVIDERS` is parsed as a CSV list** (#435). It was read as a single value, so an admin re-enabling more than one provider re-enabled none of them.
|
|
42
|
+
- **Open files are reverted more carefully** (#429). A file changed on disk was reverted even while its kernel was running, which could swap the source out from under an executing cell; the revert is now skipped while the kernel is busy and announced when it happens. The reload notice is scoped to the visible document instead of firing for background files.
|
|
43
|
+
- **Chatbook fixes** (#457, #458). The mention menu could outlive the cell that opened it and reappear over an unrelated cell. Cells whose generated code never ran no longer take an execution number, so a cell waiting on the confirm bar does not look like it executed.
|
|
44
|
+
- **Settings panel layout and labels** (#462, #471, #472). The content pane collapsed to nothing in a narrow window while the tab column kept its full width. Buttons pairing an icon with a label rendered the label outside the button, where it painted over the panel background and became invisible. Decorative tab icons are hidden from the accessibility tree.
|
|
45
|
+
|
|
46
|
+
## [5.4.0] - 2026-09-01
|
|
18
47
|
|
|
19
48
|
5.4.0 adds a second agent mode (ACP, with Codex as the first agent type) alongside Claude mode, a way to serve NBI's Jupyter-UI tools to an agent running outside the Lab page, and two diagnostic surfaces for deployments where something is misconfigured or slow: a configuration readiness preflight that names the missing piece, and opt-in performance diagnostics with per-turn timelines. ACP mode, performance diagnostics, and the tool proxy are opt-in and default to off; the readiness preflight's non-billing checks run when Settings opens, and its live endpoint test is opt-in. No traitlet, env-var, REST route, or on-disk-format renames or removals.
|
|
20
49
|
|
|
@@ -467,7 +496,13 @@ A multi-PR accessibility pass landed across most NBI surfaces. Together these ma
|
|
|
467
496
|
- Settings UI restructured around Claude vs default mode.
|
|
468
497
|
- WebSocket connection reliability improvements.
|
|
469
498
|
|
|
470
|
-
[unreleased]: https://github.com/plmbr/notebook-intelligence/compare/
|
|
499
|
+
[unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.0.0...HEAD
|
|
500
|
+
[6.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.4.0...v6.0.0
|
|
501
|
+
[5.4.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.1...v5.4.0
|
|
502
|
+
[5.3.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.0...v5.3.1
|
|
503
|
+
[5.3.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.2.1...v5.3.0
|
|
504
|
+
[5.2.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.2.0...v5.2.1
|
|
505
|
+
[5.2.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.1.0...v5.2.0
|
|
471
506
|
[5.1.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.1...v5.1.0
|
|
472
507
|
[5.0.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.0...v5.0.1
|
|
473
508
|
[5.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v4.8.0...v5.0.0
|
|
@@ -37,6 +37,9 @@ NBI has two halves:
|
|
|
37
37
|
- `notebook_intelligence/rule_manager.py`, `rule_injector.py`, `ruleset.py` — ruleset discovery and prompt injection.
|
|
38
38
|
- `notebook_intelligence/built_in_toolsets.py` — built-in tool implementations (`nbi-notebook-edit`, `nbi-command-execute`, etc.).
|
|
39
39
|
- `notebook_intelligence/github_copilot.py` — GitHub Copilot device-flow auth and token storage.
|
|
40
|
+
- `notebook_intelligence/chatbook_kernel/` — the Chatbook kernel: `kernel.py` (the wrapper that proxies to a backend kernelspec), `codegen.py`, `execution.py` (execution modes), `danger.py` (the risk scan), and the shipped kernelspec.
|
|
41
|
+
- `notebook_intelligence/chatbook_generate.py` — the generate, summarize, and danger-scan endpoint behind Chatbook cells.
|
|
42
|
+
- `notebook_intelligence/acp_agent.py`, `acp_registry.py` — ACP agent mode: the protocol client, what NBI serves or refuses an agent, and adapter launch.
|
|
40
43
|
- **Frontend extension** — TypeScript package `src/`. Compiled to a JupyterLab labextension. Key entry points:
|
|
41
44
|
- `src/index.ts` — JupyterLab plugin registration.
|
|
42
45
|
- `src/chat-sidebar.tsx` — chat sidebar React tree.
|
|
@@ -44,6 +47,7 @@ NBI has two halves:
|
|
|
44
47
|
- `src/components/skills-panel.tsx` — Claude Skills management UI.
|
|
45
48
|
- `src/api.ts` — high-level client for the server extension (chat WebSocket, capabilities, config).
|
|
46
49
|
- `src/handler.ts` — thin wrapper over Jupyter's `ServerConnection.makeRequest`.
|
|
50
|
+
- `src/chatbook.ts`, `src/chatbook-core.ts` — Chatbook cell behavior: mode switching, the confirm bar, export, and the cell metadata format.
|
|
47
51
|
|
|
48
52
|
The two halves communicate over the routes registered in `extension.py` (REST and WebSocket). All routes live under `/notebook-intelligence/`. See [`docs/admin-guide.md`](docs/admin-guide.md#http-api-surface) for the full list.
|
|
49
53
|
|
|
@@ -159,9 +163,10 @@ The `jupyter labextension develop` command leaves a symlink behind. Run `jupyter
|
|
|
159
163
|
|
|
160
164
|
## Running tests
|
|
161
165
|
|
|
162
|
-
TypeScript unit tests:
|
|
166
|
+
TypeScript type check and unit tests:
|
|
163
167
|
|
|
164
168
|
```bash
|
|
169
|
+
jlpm tsc --noEmit
|
|
165
170
|
jlpm test
|
|
166
171
|
```
|
|
167
172
|
|
|
@@ -172,7 +177,7 @@ pip install -e ".[test]"
|
|
|
172
177
|
pytest tests/ -q
|
|
173
178
|
```
|
|
174
179
|
|
|
175
|
-
CI runs both suites on every push,
|
|
180
|
+
CI runs both suites on every push, Python first, then TypeScript. Every test is capped at 30 seconds by `pytest-timeout`, so a hung subprocess or pipe fails the run instead of stalling the job.
|
|
176
181
|
|
|
177
182
|
## Linting
|
|
178
183
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version: 6.0
|
|
3
|
+
Version: 6.1.0
|
|
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,22 +694,23 @@ 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: agent-client-protocol
|
|
698
|
-
Requires-Dist: aiohttp>=3.14.
|
|
697
|
+
Requires-Dist: agent-client-protocol<1,>=0.11.0
|
|
698
|
+
Requires-Dist: aiohttp>=3.14.3
|
|
699
699
|
Requires-Dist: anthropic>=0.22.1
|
|
700
700
|
Requires-Dist: claude-agent-sdk
|
|
701
|
-
Requires-Dist: cryptography>=
|
|
701
|
+
Requires-Dist: cryptography>=50.0.0
|
|
702
702
|
Requires-Dist: fuzy-jon==0.1.0
|
|
703
703
|
Requires-Dist: ipykernel>=6.0
|
|
704
|
-
Requires-Dist: jupyter-server<3,>=2.
|
|
705
|
-
Requires-Dist: litellm>=1.
|
|
704
|
+
Requires-Dist: jupyter-server<3,>=2.21.0
|
|
705
|
+
Requires-Dist: litellm>=1.84.0
|
|
706
706
|
Requires-Dist: mcp<2,>=1.28.1
|
|
707
|
-
Requires-Dist: mistune>=3.3.
|
|
707
|
+
Requires-Dist: mistune>=3.3.3
|
|
708
708
|
Requires-Dist: ollama
|
|
709
709
|
Requires-Dist: openai
|
|
710
710
|
Requires-Dist: psutil>=5.7
|
|
711
711
|
Requires-Dist: pydantic-settings>=2.14.2
|
|
712
|
-
Requires-Dist: python-
|
|
712
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
713
|
+
Requires-Dist: python-multipart>=0.0.31
|
|
713
714
|
Requires-Dist: sseclient-py
|
|
714
715
|
Requires-Dist: starlette>=1.3.1
|
|
715
716
|
Requires-Dist: tiktoken
|
|
@@ -718,7 +719,7 @@ Requires-Dist: urllib3>=2.7.0
|
|
|
718
719
|
Provides-Extra: test
|
|
719
720
|
Requires-Dist: psutil; extra == 'test'
|
|
720
721
|
Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
|
|
721
|
-
Requires-Dist: pytest<9
|
|
722
|
+
Requires-Dist: pytest<10,>=9.0.3; extra == 'test'
|
|
722
723
|
Requires-Dist: pyyaml; extra == 'test'
|
|
723
724
|
Description-Content-Type: text/markdown
|
|
724
725
|
|
|
@@ -736,6 +737,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
736
737
|
- [Feature highlights](#feature-highlights)
|
|
737
738
|
- [Claude mode](#claude-mode)
|
|
738
739
|
- [Agent mode](#agent-mode)
|
|
740
|
+
- [ACP agent mode](#acp-agent-mode)
|
|
741
|
+
- [Chatbook](#chatbook)
|
|
739
742
|
- [Code generation with inline chat](#code-generation-with-inline-chat)
|
|
740
743
|
- [Auto-complete](#auto-complete)
|
|
741
744
|
- [Chat interface](#chat-interface)
|
|
@@ -765,7 +768,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
765
768
|
|
|
766
769
|
- Python 3.10+
|
|
767
770
|
- JupyterLab 4.x
|
|
768
|
-
- Node.js —
|
|
771
|
+
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode), which launches its adapter with `npx` on every start, and for MCP servers that launch via `npx`.
|
|
769
772
|
- A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
|
|
770
773
|
|
|
771
774
|
## Quick start
|
|
@@ -874,6 +877,20 @@ In Agent mode, the built-in AI agent creates, edits, and executes notebooks for
|
|
|
874
877
|
|
|
875
878
|

|
|
876
879
|
|
|
880
|
+
### ACP agent mode
|
|
881
|
+
|
|
882
|
+
An experimental second agent mode that drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/), with OpenAI Codex as the only agent type today. The agent runs as a subprocess and does its own file and command work, asking for approval through NBI's confirmation cards; NBI deliberately does not lend it the Jupyter server's filesystem or terminal.
|
|
883
|
+
|
|
884
|
+
It is off by default and the Settings tab stays hidden until an admin allows the mode, and it cannot be used at the same time as Claude mode. See [`docs/acp.md`](docs/acp.md).
|
|
885
|
+
|
|
886
|
+
### Chatbook
|
|
887
|
+
|
|
888
|
+
A Chatbook is a notebook whose cells can be written in English. Running a prompt cell generates code for the notebook's backend kernel and runs it; each cell carries a badge showing whether it is a prompt (**NL**) or ordinary code (**Cd**), and `Ctrl J` switches between them.
|
|
889
|
+
|
|
890
|
+
What happens to generated code before it runs is yours to choose: **Always confirm** (the default) shows the code and waits, **Confirm if risky** waits only when a scan finds destructive calls, and **Auto-run** executes straight away. Admins can cap that choice fleet-wide, or turn Chatbook off entirely.
|
|
891
|
+
|
|
892
|
+
Prompts can pull in context with `@` mentions, rules apply to generation the same way they apply to chat, the backend kernel need not be Python, and a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
893
|
+
|
|
877
894
|
### Code generation with inline chat
|
|
878
895
|
|
|
879
896
|
Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the inline chat popover.
|
|
@@ -884,7 +901,7 @@ Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the in
|
|
|
884
901
|
|
|
885
902
|
### Auto-complete
|
|
886
903
|
|
|
887
|
-
Auto-complete suggestions are shown as you type. `Tab` accepts. NBI provides auto-complete in code cells and Python file editors.
|
|
904
|
+
Auto-complete suggestions are shown as you type. `Tab` accepts one while it is on screen, and indents otherwise. NBI provides auto-complete in code cells and Python file editors.
|
|
888
905
|
|
|
889
906
|
<img src="media/inline-completion.gif" alt="Auto-complete" width=700 />
|
|
890
907
|
|
|
@@ -904,6 +921,8 @@ Right-click a cell output (or hover for the toolbar) to send it straight into th
|
|
|
904
921
|
|
|
905
922
|
Each is per-user toggleable from Settings (saved as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar` in `config.json`, default on) and admin-lockable via `NBI_EXPLAIN_ERROR_POLICY` / `NBI_OUTPUT_FOLLOWUP_POLICY` / `NBI_OUTPUT_TOOLBAR_POLICY`.
|
|
906
923
|
|
|
924
|
+
A revert is skipped while that document's kernel is busy, so a change landing mid-execution is applied when the cell finishes rather than swapped in under it, and the notice naming the reloaded file is shown only for the document you are looking at.
|
|
925
|
+
|
|
907
926
|
### Notebook toolbar generation
|
|
908
927
|
|
|
909
928
|
Active notebooks show a sparkle icon on the toolbar. Click it to open a popover that scopes the generation request to that specific notebook — handy for multi-notebook sessions where you don't want the chat sidebar to compete for context.
|
|
@@ -1210,7 +1229,8 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1210
1229
|
- [`docs/admin-guide.md`](docs/admin-guide.md) — deployment, env vars, security model, air-gap, multi-tenancy.
|
|
1211
1230
|
- [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
|
|
1212
1231
|
- [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
|
|
1213
|
-
- [`docs/
|
|
1232
|
+
- [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
|
|
1233
|
+
- [`docs/chatbook.md`](docs/chatbook.md) — writing Chatbook cells, execution modes, export, and why there is no per-cell sandbox.
|
|
1214
1234
|
- [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
|
|
1215
1235
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
|
|
1216
1236
|
- [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
|
|
@@ -1228,7 +1248,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1228
1248
|
|
|
1229
1249
|
## Roadmap
|
|
1230
1250
|
|
|
1231
|
-
NBI
|
|
1251
|
+
NBI 6.x is the current line. New features land in minor releases (6.1, 6.2, …); breaking changes are reserved for a major release and announced in the [changelog](CHANGELOG.md). 6.0 itself is not a breaking release: it marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed, so upgrading from 5.x needs no migration. Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
|
|
1232
1252
|
|
|
1233
1253
|
## License
|
|
1234
1254
|
|
|
@@ -6,14 +6,15 @@ This page documents what NBI sends to external services, when, and how administr
|
|
|
6
6
|
|
|
7
7
|
The table below describes what each LLM provider receives **when you actively use a feature** (chat message, inline completion, agent action). An idle JupyterLab does not contact the provider.
|
|
8
8
|
|
|
9
|
-
| Provider | What is sent
|
|
10
|
-
| --------------------------------- |
|
|
11
|
-
| **GitHub Copilot** | Prompt, surrounding cell source, attached files (when you click _attach_)
|
|
12
|
-
| **OpenAI-compatible** | Prompt, surrounding cell source, attached files
|
|
13
|
-
| **LiteLLM-compatible** | Same as OpenAI-compatible; the LiteLLM proxy forwards to the upstream model you configured
|
|
14
|
-
| **Ollama (local)** | Prompt, surrounding cell source, attached files
|
|
15
|
-
| **Anthropic API** (Claude mode) | Prompt, surrounding cell source, attached files
|
|
16
|
-
| **Claude Code CLI** (Claude mode) | Prompt, working-directory file reads requested by Claude, shell-command output for tools Claude invokes
|
|
9
|
+
| Provider | What is sent | When | Destination |
|
|
10
|
+
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| **GitHub Copilot** | Prompt, surrounding cell source, attached files (when you click _attach_) | Per request (chat) and as you type (inline complete) | `api.githubcopilot.com`, `api.github.com` (auth) |
|
|
12
|
+
| **OpenAI-compatible** | Prompt, surrounding cell source, attached files | Per request and per inline-completion request | The Base URL you configured (`api.openai.com` by default) |
|
|
13
|
+
| **LiteLLM-compatible** | Same as OpenAI-compatible; the LiteLLM proxy forwards to the upstream model you configured | Per request | The Base URL of your LiteLLM proxy |
|
|
14
|
+
| **Ollama (local)** | Prompt, surrounding cell source, attached files | Per request | Localhost (or the host you configured); **no external network** |
|
|
15
|
+
| **Anthropic API** (Claude mode) | Prompt, surrounding cell source, attached files | Per inline-chat or auto-complete request | `api.anthropic.com` (or your configured Base URL) |
|
|
16
|
+
| **Claude Code CLI** (Claude mode) | Prompt, working-directory file reads requested by Claude, shell-command output for tools Claude invokes | Per agent turn in the chat panel | Whatever the Claude Code CLI is configured to talk to (typically `api.anthropic.com`) |
|
|
17
|
+
| **ACP agent** (ACP mode) | Prompt and NBI's notebook context, plus whatever files the agent reads and command output it collects on its own | Per agent turn in the chat panel, and per Chatbook generation | Whatever the agent is configured to talk to (`api.openai.com` or your Base URL on the API-key path, or the agent's own signed-in backend) |
|
|
17
18
|
|
|
18
19
|
### Cell outputs are included when the cell is attached
|
|
19
20
|
|
|
@@ -28,19 +29,19 @@ If your cells contain sensitive outputs (PHI, PII, secrets), clear them before i
|
|
|
28
29
|
|
|
29
30
|
Hosts NBI may contact, depending on which features are enabled:
|
|
30
31
|
|
|
31
|
-
| Host | Purpose
|
|
32
|
-
| ----------------------------------------------- |
|
|
33
|
-
| `api.githubcopilot.com` | GitHub Copilot chat and inline completion
|
|
34
|
-
| `api.github.com` | GitHub Copilot device-flow login; managed-skills manifest fetches when hosted on github.com; skill imports
|
|
35
|
-
| `github.com`, `codeload.github.com` | Skill tarball downloads (Import from GitHub and the managed-skills reconciler)
|
|
36
|
-
| `raw.githubusercontent.com` | Manifest fetches when `NBI_SKILLS_MANIFEST` points at a `raw.githubusercontent.com` URL
|
|
37
|
-
| `api.anthropic.com` | Anthropic API for Claude-mode inline chat and auto-complete; also the default destination of the Claude Code CLI
|
|
38
|
-
| `api.openai.com` | OpenAI-compatible provider (default Base URL)
|
|
39
|
-
| Your configured Base URL | OpenAI-compatible, LiteLLM-compatible, or Claude when pointed at a self-hosted endpoint
|
|
40
|
-
| `localhost:11434` (or your Ollama host) | Ollama local model serving
|
|
41
|
-
| `registry.npmjs.org` and configured npm mirrors |
|
|
32
|
+
| Host | Purpose |
|
|
33
|
+
| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
34
|
+
| `api.githubcopilot.com` | GitHub Copilot chat and inline completion |
|
|
35
|
+
| `api.github.com` | GitHub Copilot device-flow login; managed-skills manifest fetches when hosted on github.com; skill imports |
|
|
36
|
+
| `github.com`, `codeload.github.com` | Skill tarball downloads (Import from GitHub and the managed-skills reconciler) |
|
|
37
|
+
| `raw.githubusercontent.com` | Manifest fetches when `NBI_SKILLS_MANIFEST` points at a `raw.githubusercontent.com` URL |
|
|
38
|
+
| `api.anthropic.com` | Anthropic API for Claude-mode inline chat and auto-complete; also the default destination of the Claude Code CLI |
|
|
39
|
+
| `api.openai.com` | OpenAI-compatible provider (default Base URL) |
|
|
40
|
+
| Your configured Base URL | OpenAI-compatible, LiteLLM-compatible, or Claude when pointed at a self-hosted endpoint |
|
|
41
|
+
| `localhost:11434` (or your Ollama host) | Ollama local model serving |
|
|
42
|
+
| `registry.npmjs.org` and configured npm mirrors | MCP servers configured to launch via `npx -y`, and ACP mode, which launches its adapter with `npx` on every agent start unless `NBI_ACP_AGENT_COMMAND` points elsewhere |
|
|
42
43
|
|
|
43
|
-
For the configurable destinations above (Base URLs, Ollama host, MCP `npx` packages), the destination is whatever you or your admin set.
|
|
44
|
+
For the configurable destinations above (Base URLs, Ollama host, MCP `npx` packages), the destination is whatever you or your admin set. NBI itself starts no other network activity. In ACP mode the agent subprocess makes its own calls, which NBI neither proxies nor enumerates: the destinations there are the agent's to document, and blocking egress at the network layer is the only way to bound them from outside.
|
|
44
45
|
|
|
45
46
|
For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](docs/admin-guide.md#air-gap-deployment).
|
|
46
47
|
|
|
@@ -55,6 +56,7 @@ For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](do
|
|
|
55
56
|
| `~/.claude/skills/` | User-scope Claude skills |
|
|
56
57
|
| `<project>/.claude/skills/` | Project-scope Claude skills |
|
|
57
58
|
| `~/.claude/projects/` | Claude Code session transcripts (managed by Claude CLI, not NBI) |
|
|
59
|
+
| `~/.jupyter/nbi/codex-home/` | ACP agent configuration and session files, when an API key is configured |
|
|
58
60
|
|
|
59
61
|
> Treat `~/.jupyter/nbi/config.json` and `~/.jupyter/nbi/user-data.json` as secrets. They contain your API keys and (encrypted) GitHub token. Do not commit them to git, share them, or sync them across users. If a key leaks, rotate it at the provider immediately.
|
|
60
62
|
|
|
@@ -74,7 +76,7 @@ LLM outputs are non-deterministic. Pinning the model name, temperature, and seed
|
|
|
74
76
|
|
|
75
77
|
For HIPAA, FedRAMP, classroom, or otherwise restricted environments:
|
|
76
78
|
|
|
77
|
-
- **Force local-only models.** Disable every cloud provider via `disabled_providers` and use Ollama. See the [HIPAA / sensitive-data preset](docs/admin-guide.md#hipaa--sensitive-data-preset) in the admin guide.
|
|
79
|
+
- **Force local-only models.** Disable every cloud provider via `disabled_providers`, force both agent modes off with `claude_mode_policy` and `acp_mode_policy`, and use Ollama. Disabling providers is not sufficient on its own: neither agent mode is a provider, and Claude mode is available to users unless an admin turns it off. See the [HIPAA / sensitive-data preset](docs/admin-guide.md#hipaa--sensitive-data-preset) in the admin guide.
|
|
78
80
|
- **Restrict skill imports.** Block egress to `github.com` and serve managed skills from an internal manifest URL.
|
|
79
81
|
- **Disable "remember GitHub Copilot login"** for shared systems where users share home directories.
|
|
80
82
|
- **Pre-pull MCP servers** rather than allowing `npx -y` (which downloads from npmjs).
|
|
@@ -12,6 +12,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
12
12
|
- [Feature highlights](#feature-highlights)
|
|
13
13
|
- [Claude mode](#claude-mode)
|
|
14
14
|
- [Agent mode](#agent-mode)
|
|
15
|
+
- [ACP agent mode](#acp-agent-mode)
|
|
16
|
+
- [Chatbook](#chatbook)
|
|
15
17
|
- [Code generation with inline chat](#code-generation-with-inline-chat)
|
|
16
18
|
- [Auto-complete](#auto-complete)
|
|
17
19
|
- [Chat interface](#chat-interface)
|
|
@@ -41,7 +43,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
41
43
|
|
|
42
44
|
- Python 3.10+
|
|
43
45
|
- JupyterLab 4.x
|
|
44
|
-
- Node.js —
|
|
46
|
+
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode), which launches its adapter with `npx` on every start, and for MCP servers that launch via `npx`.
|
|
45
47
|
- A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
|
|
46
48
|
|
|
47
49
|
## Quick start
|
|
@@ -150,6 +152,20 @@ In Agent mode, the built-in AI agent creates, edits, and executes notebooks for
|
|
|
150
152
|
|
|
151
153
|

|
|
152
154
|
|
|
155
|
+
### ACP agent mode
|
|
156
|
+
|
|
157
|
+
An experimental second agent mode that drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/), with OpenAI Codex as the only agent type today. The agent runs as a subprocess and does its own file and command work, asking for approval through NBI's confirmation cards; NBI deliberately does not lend it the Jupyter server's filesystem or terminal.
|
|
158
|
+
|
|
159
|
+
It is off by default and the Settings tab stays hidden until an admin allows the mode, and it cannot be used at the same time as Claude mode. See [`docs/acp.md`](docs/acp.md).
|
|
160
|
+
|
|
161
|
+
### Chatbook
|
|
162
|
+
|
|
163
|
+
A Chatbook is a notebook whose cells can be written in English. Running a prompt cell generates code for the notebook's backend kernel and runs it; each cell carries a badge showing whether it is a prompt (**NL**) or ordinary code (**Cd**), and `Ctrl J` switches between them.
|
|
164
|
+
|
|
165
|
+
What happens to generated code before it runs is yours to choose: **Always confirm** (the default) shows the code and waits, **Confirm if risky** waits only when a scan finds destructive calls, and **Auto-run** executes straight away. Admins can cap that choice fleet-wide, or turn Chatbook off entirely.
|
|
166
|
+
|
|
167
|
+
Prompts can pull in context with `@` mentions, rules apply to generation the same way they apply to chat, the backend kernel need not be Python, and a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
168
|
+
|
|
153
169
|
### Code generation with inline chat
|
|
154
170
|
|
|
155
171
|
Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the inline chat popover.
|
|
@@ -160,7 +176,7 @@ Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the in
|
|
|
160
176
|
|
|
161
177
|
### Auto-complete
|
|
162
178
|
|
|
163
|
-
Auto-complete suggestions are shown as you type. `Tab` accepts. NBI provides auto-complete in code cells and Python file editors.
|
|
179
|
+
Auto-complete suggestions are shown as you type. `Tab` accepts one while it is on screen, and indents otherwise. NBI provides auto-complete in code cells and Python file editors.
|
|
164
180
|
|
|
165
181
|
<img src="media/inline-completion.gif" alt="Auto-complete" width=700 />
|
|
166
182
|
|
|
@@ -180,6 +196,8 @@ Right-click a cell output (or hover for the toolbar) to send it straight into th
|
|
|
180
196
|
|
|
181
197
|
Each is per-user toggleable from Settings (saved as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar` in `config.json`, default on) and admin-lockable via `NBI_EXPLAIN_ERROR_POLICY` / `NBI_OUTPUT_FOLLOWUP_POLICY` / `NBI_OUTPUT_TOOLBAR_POLICY`.
|
|
182
198
|
|
|
199
|
+
A revert is skipped while that document's kernel is busy, so a change landing mid-execution is applied when the cell finishes rather than swapped in under it, and the notice naming the reloaded file is shown only for the document you are looking at.
|
|
200
|
+
|
|
183
201
|
### Notebook toolbar generation
|
|
184
202
|
|
|
185
203
|
Active notebooks show a sparkle icon on the toolbar. Click it to open a popover that scopes the generation request to that specific notebook — handy for multi-notebook sessions where you don't want the chat sidebar to compete for context.
|
|
@@ -486,7 +504,8 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
486
504
|
- [`docs/admin-guide.md`](docs/admin-guide.md) — deployment, env vars, security model, air-gap, multi-tenancy.
|
|
487
505
|
- [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
|
|
488
506
|
- [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
|
|
489
|
-
- [`docs/
|
|
507
|
+
- [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
|
|
508
|
+
- [`docs/chatbook.md`](docs/chatbook.md) — writing Chatbook cells, execution modes, export, and why there is no per-cell sandbox.
|
|
490
509
|
- [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
|
|
491
510
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
|
|
492
511
|
- [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
|
|
@@ -504,7 +523,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
504
523
|
|
|
505
524
|
## Roadmap
|
|
506
525
|
|
|
507
|
-
NBI
|
|
526
|
+
NBI 6.x is the current line. New features land in minor releases (6.1, 6.2, …); breaking changes are reserved for a major release and announced in the [changelog](CHANGELOG.md). 6.0 itself is not a breaking release: it marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed, so upgrading from 5.x needs no migration. Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
|
|
508
527
|
|
|
509
528
|
## License
|
|
510
529
|
|
|
@@ -14,13 +14,22 @@ Python package. Before generating a package, you first need to install some tool
|
|
|
14
14
|
pip install build twine hatch
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Bump the version using `hatch`.
|
|
18
|
-
|
|
17
|
+
Bump the version using `hatch`. See the docs on
|
|
18
|
+
[hatch-nodejs-version](https://github.com/agoose77/hatch-nodejs-version#semver) for details.
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
hatch version <new-version>
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
`hatch version` writes the version; it does not tag. Tag the release yourself
|
|
25
|
+
afterwards, and spell the tag the way the existing history does
|
|
26
|
+
(`v5.4.0`, `v5.4.0a1`) rather than with a hyphen before the prerelease segment.
|
|
27
|
+
|
|
28
|
+
Before tagging, add the release's entry to [`CHANGELOG.md`](CHANGELOG.md) above
|
|
29
|
+
the `<!-- <START NEW CHANGELOG ENTRY> -->` marker, date the heading, and add its
|
|
30
|
+
compare link at the foot of the file. The Jupyter Releaser workflows below read
|
|
31
|
+
that marker, so an entry added after the fact is not picked up.
|
|
32
|
+
|
|
24
33
|
Make sure to clean up all the development files before building the package:
|
|
25
34
|
|
|
26
35
|
```bash
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
**Do not** open a public GitHub issue for security vulnerabilities.
|
|
6
|
+
|
|
7
|
+
Email the maintainer directly at **mbektasgh@outlook.com** with:
|
|
8
|
+
|
|
9
|
+
- A description of the vulnerability and the impact you observed.
|
|
10
|
+
- Steps to reproduce, including affected versions of NBI, JupyterLab, and Python.
|
|
11
|
+
- Any proof-of-concept code or logs (redact secrets).
|
|
12
|
+
|
|
13
|
+
Expect an acknowledgement within five business days. Once we confirm the issue, we'll work with you on a coordinated disclosure timeline.
|
|
14
|
+
|
|
15
|
+
## Supported versions
|
|
16
|
+
|
|
17
|
+
NBI follows semantic versioning starting with 4.0.0. Security fixes land on the latest minor release of the current major line. Earlier major lines are not actively maintained.
|
|
18
|
+
|
|
19
|
+
| Version | Supported |
|
|
20
|
+
| ------- | ------------------ |
|
|
21
|
+
| 6.x | Yes (latest minor) |
|
|
22
|
+
| < 6.0 | No |
|
|
23
|
+
|
|
24
|
+
## Scope
|
|
25
|
+
|
|
26
|
+
In-scope:
|
|
27
|
+
|
|
28
|
+
- The `notebook_intelligence` server extension and its HTTP handlers.
|
|
29
|
+
- The `@plmbr/notebook-intelligence` JupyterLab frontend.
|
|
30
|
+
- Built-in tools (`nbi-notebook-edit`, `nbi-notebook-execute`, `nbi-python-file-edit`, `nbi-file-edit`, `nbi-file-read`, `nbi-command-execute`).
|
|
31
|
+
- The Claude Skills import and managed-manifest reconciler.
|
|
32
|
+
- ACP agent mode: the protocol router, what NBI serves or refuses an agent, and the credential handling around the adapter subprocess.
|
|
33
|
+
- The Chatbook kernel and its generate API, which execute model-written code as the user.
|
|
34
|
+
- The UI-tools relay (`/notebook-intelligence/ui-tools`) and the `notebook_intelligence.mcp_ui_proxy` standalone server.
|
|
35
|
+
|
|
36
|
+
Out of scope:
|
|
37
|
+
|
|
38
|
+
- Vulnerabilities in upstream dependencies (`litellm`, `anthropic`, `openai`, `ollama`, `claude-agent-sdk`, `mcp`, `agent-client-protocol`) — please report those upstream. We will pick up patched releases when they ship.
|
|
39
|
+
- Vulnerabilities in MCP servers users install from third-party sources.
|
|
40
|
+
- Vulnerabilities in LLM providers themselves (data handling at OpenAI, Anthropic, GitHub Copilot, etc.).
|
|
41
|
+
|
|
42
|
+
## Security model
|
|
43
|
+
|
|
44
|
+
NBI is a **per-user** tool. The server extension runs inside the user's Jupyter Server process and inherits that user's permissions. Built-in tools shell out as the user, MCP stdio servers run as the user, the Chatbook kernel executes generated code as the user, and the Claude Code CLI inherits the user's environment. There is no privilege boundary between the extension and the user's account.
|
|
45
|
+
|
|
46
|
+
Within that, a few boundaries are deliberate and worth stating, because they are what a report should be measured against:
|
|
47
|
+
|
|
48
|
+
- **An ACP agent is not lent the client's reach.** NBI refuses filesystem reads and writes, terminal methods, and agent extension requests at the protocol router, so the agent does its own I/O under its own sandbox rather than through the Jupyter server process. The approval cards are the mediation point, with the honest limit that the agent chooses what to ask about.
|
|
49
|
+
- **Approval prompts are rendered so they cannot be forged.** Command text is fenced with a collision-resistant delimiter and bidirectional control characters are rejected, so what an approval card shows is what would run.
|
|
50
|
+
- **Commands the backend can ask the frontend to run are allowlisted** at a single chokepoint, rather than being any JupyterLab command id. `run-command-in-terminal` stays on that list, so shell reachability is unchanged by it.
|
|
51
|
+
- **`mcp_stdio_command_allowlist`** is the mitigation admins have for stdio MCP servers, which otherwise run any command an `mcp.json` names. See [Restricting MCP stdio commands](docs/admin-guide.md#restricting-mcp-stdio-commands).
|
|
52
|
+
|
|
53
|
+
For multi-tenant deployments, see [`docs/admin-guide.md`](docs/admin-guide.md) for guidance on disabling features that are unsafe to expose without additional sandboxing (notably `nbi-command-execute` and `nbi-file-edit`).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ACP agent mode
|
|
2
|
+
|
|
3
|
+
ACP mode drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/) instead of using NBI's own chat path. It is experimental, off by default, and mutually exclusive with Claude mode: enabling one disables the other.
|
|
4
|
+
|
|
5
|
+
OpenAI Codex, through the `codex-acp` adapter, is the only agent type available today.
|
|
6
|
+
|
|
7
|
+
For the admin side of this feature (the two policies, the approval posture NBI pins, credential containment, and the known limitations) see [Gating the experimental ACP agent](admin-guide.md#gating-the-experimental-acp-agent-378). This page is about using it.
|
|
8
|
+
|
|
9
|
+
## Turning it on
|
|
10
|
+
|
|
11
|
+
The **ACP** tab in Settings is hidden until an admin allows the mode, because `acp_mode_policy` defaults to `force-off`. If you do not see the tab, that is why; ask for `NBI_ACP_MODE_POLICY=user-choice`.
|
|
12
|
+
|
|
13
|
+
With the tab visible, pick the agent type, then set the chat model, API key, and base URL. The adapter is launched with `npx` on every agent start, so the server needs Node.js on its `PATH` even though nothing is installed permanently.
|
|
14
|
+
|
|
15
|
+
## What a turn looks like
|
|
16
|
+
|
|
17
|
+
The agent runs as a subprocess and does its own work: it reads and writes files itself, and runs its own commands. NBI deliberately does not serve it the client filesystem or terminal methods, so the agent cannot borrow the Jupyter server process's reach; it is confined to whatever sandbox the agent applies to itself, which is what the admin policies pin.
|
|
18
|
+
|
|
19
|
+
When the agent wants to do something it considers worth asking about, NBI shows an approval card naming the command and the reason the agent gave. Approving grants a lasting permission for that kind of action in the session, not a one-off, so a later action of the same kind may not ask again. The agent decides what to ask about; NBI shows what it is asked, and cannot promise that everything the agent does passes through a card.
|
|
20
|
+
|
|
21
|
+
Previous sessions are listed by the history control, and picking one resumes it through the agent's own session storage rather than NBI's.
|
|
22
|
+
|
|
23
|
+
## Limits worth knowing
|
|
24
|
+
|
|
25
|
+
- **The first start is slow, and it is bounded.** An agent has 60 seconds to spawn, download the adapter through `npx`, initialize, authenticate, and create a session. On a cold cache over a slow link the download alone can exceed that, and the failure reads `ACP agent did not start in time`. Run the adapter command once by hand to warm the cache, or point `NBI_ACP_AGENT_COMMAND` at a pre-installed copy.
|
|
26
|
+
- **A turn is capped at 30 minutes**, after which it fails with an agent response timeout.
|
|
27
|
+
- **Session listing is optional.** Resuming depends on the agent advertising the capability, and listing is an optional protocol extension. An agent that implements neither reports that it does not support listing sessions; this is the agent's limitation, not a misconfiguration.
|
|
28
|
+
- **Chatbook uses ACP differently.** When ACP mode is active, Chatbook generation runs in a separate session with full access forced off, no MCP servers, and permission requests denied, so a Chatbook cell cannot approve its way into running commands.
|
|
29
|
+
|
|
30
|
+
## Where its state lives
|
|
31
|
+
|
|
32
|
+
When you configure an API key, NBI points the agent at an isolated `CODEX_HOME` under `~/.jupyter/nbi/codex-home/` so it reads neither the workspace's nor your personal `~/.codex` configuration. Its session files live there. Signing in through the agent's own ChatGPT flow instead uses your `~/.codex` as usual.
|
|
33
|
+
|
|
34
|
+
See [`PRIVACY.md`](../PRIVACY.md) for what leaves the machine in this mode.
|
|
@@ -113,6 +113,8 @@ The full surface, in one table.
|
|
|
113
113
|
| `NBI_MCP_STDIO_COMMAND_ALLOWLIST` | csv | unset | env (appends to traitlet) | Comma-separated regex patterns added to the traitlet at startup. Per-pod additions on an org baseline. |
|
|
114
114
|
| `tour_config_path` | str | `""` | traitlet | Filesystem path to a YAML/JSON file with admin overrides for the first-run sidebar tour copy. See [`docs/admin-tour-config.md`](admin-tour-config.md). |
|
|
115
115
|
| `NBI_TOUR_CONFIG_PATH` | str | unset | env (overrides traitlet) | Same as above; env takes precedence. |
|
|
116
|
+
| `tour_disabled` | bool | `False` | traitlet | Suppress the first-run tour. The "Show NBI tour" command still replays it. See [`docs/admin-tour-config.md`](admin-tour-config.md). |
|
|
117
|
+
| `NBI_TOUR_DISABLED` | bool | unset | env (overrides traitlet) | Same as above; env takes precedence. |
|
|
116
118
|
| `NBI_GH_ACCESS_TOKEN_PASSWORD` | str | `nbi-access-token-password` | env | Password used to encrypt the stored Copilot token in `user-data.json`. **Change in multi-tenant deployments.** |
|
|
117
119
|
| `NBI_REFUSE_DEFAULT_TOKEN_PASSWORD_ON_SHARED_FS` | bool | unset | env | When set, refuse to write `user-data.json` if the default `NBI_GH_ACCESS_TOKEN_PASSWORD` is still in use AND `~/.jupyter/nbi/` is readable by group or other. Opt-in to preserve backwards compatibility on single-user deployments where the directory mode is incidental. |
|
|
118
120
|
| `NBI_ALLOW_DEFAULT_TOKEN_PASSWORD` | bool | unset | env | Per-pod opt-out that disengages the refuse-on-shared-fs guard above. Admins who knowingly accept the risk (e.g., during a transition before rolling out a per-user password) set this so writes continue. |
|
|
@@ -278,7 +280,8 @@ Steps for deploying to a network with no general internet egress:
|
|
|
278
280
|
2. **Manifest hosting.** Set `NBI_SKILLS_MANIFEST` to either a `file://` path (a manifest baked into the image) or an internal `https://` URL on a network the pod can reach.
|
|
279
281
|
3. **Skill bundles.** Either bake the skills into the image under `~/.claude/skills/` (managed status will reset since they aren't from the manifest), or host the GitHub-style tarballs at an internal mirror and write the manifest URLs to point at it.
|
|
280
282
|
4. **Disable user-initiated GitHub imports** at the network layer — block `github.com`, `codeload.github.com`, and `raw.githubusercontent.com`. Users can still install skills from the local filesystem by dropping bundles into `~/.claude/skills/`.
|
|
281
|
-
5. **
|
|
283
|
+
5. **ACP mode is `npx`-only by default.** The adapter is fetched with `npx` on every agent start, so an air-gapped deployment must either leave ACP off (it is `force-off` by default) or pre-install the adapter and point `NBI_ACP_AGENT_COMMAND` at it. A replacement command must still accept the `-c` overrides NBI passes, or the approval posture those pin is lost.
|
|
284
|
+
6. **MCP `npx -y` is incompatible with air-gap.** Pre-install the server binary and reference it directly:
|
|
282
285
|
|
|
283
286
|
```json
|
|
284
287
|
{
|
|
@@ -291,7 +294,7 @@ Steps for deploying to a network with no general internet egress:
|
|
|
291
294
|
}
|
|
292
295
|
```
|
|
293
296
|
|
|
294
|
-
|
|
297
|
+
7. **LLM endpoint.** Air-gap requires a self-hosted endpoint (vLLM, TGI, or a LiteLLM proxy in front of a VPC-endpoint Bedrock, etc.). See [Self-hosted LLM endpoints](#self-hosted-llm-endpoints).
|
|
295
298
|
|
|
296
299
|
---
|
|
297
300
|
|
|
@@ -309,8 +312,17 @@ c.NotebookIntelligence.disabled_providers = [
|
|
|
309
312
|
c.NotebookIntelligence.allow_enabling_providers_with_env = False # users cannot override
|
|
310
313
|
c.NotebookIntelligence.disabled_tools = ["nbi-command-execute", "nbi-file-edit"]
|
|
311
314
|
c.NotebookIntelligence.allow_enabling_tools_with_env = False
|
|
315
|
+
|
|
316
|
+
# Both agent modes reach a cloud provider without going through the provider
|
|
317
|
+
# list above, so disabling providers alone does not make a deployment
|
|
318
|
+
# local-only. acp_mode is already force-off by default; it is pinned here so
|
|
319
|
+
# the preset keeps working if that default is ever relaxed.
|
|
320
|
+
c.NotebookIntelligence.claude_mode_policy = "force-off"
|
|
321
|
+
c.NotebookIntelligence.acp_mode_policy = "force-off"
|
|
312
322
|
```
|
|
313
323
|
|
|
324
|
+
> **`disabled_providers` does not gate Claude mode or ACP mode.** Whether an agent mode handles a turn is read from its own settings (`claude_settings.enabled` / `acp_settings.enabled`), not from the provider list, and `claude_mode_policy` otherwise defaults to `user-choice`. Without the two policy lines above, a user can enable Claude mode and send data to Anthropic through the Claude Code CLI, which can hold a subscription login the deployment never issued a key for.
|
|
325
|
+
|
|
314
326
|
Pair with `<env-prefix>/share/jupyter/nbi/config.json` selecting the Ollama provider and your local models:
|
|
315
327
|
|
|
316
328
|
```json
|
|
@@ -912,6 +924,7 @@ NBI is tested against the JupyterLab and `jupyter_server` versions declared in [
|
|
|
912
924
|
|
|
913
925
|
| NBI version | JupyterLab | jupyter_server | Python |
|
|
914
926
|
| ----------- | ---------- | -------------- | --------- |
|
|
927
|
+
| 6.0.x | 4.x | 2.x | 3.10+ |
|
|
915
928
|
| 5.4.x | 4.x | 2.x | 3.10+ |
|
|
916
929
|
| 5.3.x | 4.x | 2.x | 3.10+ |
|
|
917
930
|
| 5.2.x | 4.x | 2.x | 3.10+ |
|