notebook-intelligence 5.4.0a3__tar.gz → 6.0.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.0/AGENTS.md +27 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/CHANGELOG.md +47 -5
- notebook_intelligence-6.0.0/CLAUDE.md +1 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/CONTRIBUTING.md +9 -2
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/PKG-INFO +67 -35
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/PRIVACY.md +23 -21
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/README.md +55 -25
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/RELEASE.md +11 -2
- notebook_intelligence-6.0.0/SECURITY.md +53 -0
- notebook_intelligence-6.0.0/docs/acp.md +34 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/admin-guide.md +154 -90
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/admin-tour-config.md +1 -1
- notebook_intelligence-6.0.0/docs/chatbook-extensions.md +80 -0
- notebook_intelligence-6.0.0/docs/chatbook.md +103 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/performance-diagnostics.md +13 -1
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/rulesets.md +7 -3
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/troubleshooting.md +28 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/jest.config.js +1 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/acp_agent.py +564 -52
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/acp_mcp_server.py +4 -2
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/acp_registry.py +53 -13
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/ai_service_manager.py +155 -6
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/api.py +115 -1
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_generate.py +810 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/__init__.py +15 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/__main__.py +8 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/backend.py +346 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/codegen.py +196 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/danger.py +230 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/execution.py +69 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/kernel.py +438 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +15 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +6 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_kernel/nbi_client.py +303 -0
- notebook_intelligence-6.0.0/notebook_intelligence/chatbook_mentions.py +444 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/claude.py +404 -14
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/config.py +19 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/extension.py +419 -19
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/github_copilot.py +33 -3
- notebook_intelligence-6.0.0/notebook_intelligence/inline_completion.py +73 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/package.json +14 -6
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +13 -5
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +11 -1
- notebook_intelligence-6.0.0/notebook_intelligence/labextension/static/701.98cf201a781644814727.js +1 -0
- notebook_intelligence-6.0.0/notebook_intelligence/labextension/static/728.7f069be896fa3f595701.js +1 -0
- notebook_intelligence-6.0.0/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
- notebook_intelligence-6.0.0/notebook_intelligence/labextension/static/remoteEntry.4544afac5440a629c053.js +1 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +43 -17
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/llm_providers/ollama_llm_provider.py +70 -16
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +41 -23
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/mcp_client.py +65 -20
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/mcp_manager.py +493 -85
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/readiness.py +76 -11
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/rule_injector.py +42 -4
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/rule_manager.py +3 -2
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/ruleset.py +1 -1
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/util.py +55 -2
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/package.json +13 -5
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/pyproject.toml +76 -41
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/schema/plugin.json +11 -1
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/conftest.py +1 -1
- notebook_intelligence-6.0.0/tests/test_acp_agent.py +1669 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_ai_service_manager_dispatch.py +132 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_ai_service_manager_integration.py +161 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_api_hygiene.py +17 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_cell_output_features_response.py +13 -0
- notebook_intelligence-6.0.0/tests/test_chatbook.py +1243 -0
- notebook_intelligence-6.0.0/tests/test_chatbook_backend.py +608 -0
- notebook_intelligence-6.0.0/tests/test_chatbook_danger.py +112 -0
- notebook_intelligence-6.0.0/tests/test_chatbook_enable.py +156 -0
- notebook_intelligence-6.0.0/tests/test_chatbook_perf.py +124 -0
- notebook_intelligence-6.0.0/tests/test_claude_bash_approval_rendering.py +307 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_client.py +18 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_models.py +339 -0
- notebook_intelligence-6.0.0/tests/test_claude_sdk_mcp_server.py +55 -0
- notebook_intelligence-6.0.0/tests/test_config_handler_claude_settings.py +358 -0
- notebook_intelligence-6.0.0/tests/test_disabled_provider_models.py +120 -0
- notebook_intelligence-6.0.0/tests/test_enabled_providers_env.py +104 -0
- notebook_intelligence-6.0.0/tests/test_github_copilot_login_gating.py +231 -0
- notebook_intelligence-6.0.0/tests/test_inline_completion_shortcuts.py +115 -0
- notebook_intelligence-6.0.0/tests/test_lazy_provider_imports.py +368 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_mcp_client_shim.py +83 -61
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_mcp_manager.py +403 -9
- notebook_intelligence-6.0.0/tests/test_mcp_null_config.py +107 -0
- notebook_intelligence-6.0.0/tests/test_provider_stream_cancellation.py +252 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_readiness.py +190 -3
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_response_emitter.py +13 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_rule_injector.py +60 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_rule_manager.py +35 -0
- notebook_intelligence-6.0.0/tests/test_run_ui_command_allowlist_parity.py +218 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_websocket_handler_integration.py +48 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/__mocks__/jupyterlab-apputils.ts +9 -1
- notebook_intelligence-6.0.0/tests/ts/__mocks__/strip-ansi.ts +13 -0
- notebook_intelligence-6.0.0/tests/ts/chat-cancel.test.ts +98 -0
- notebook_intelligence-6.0.0/tests/ts/chat-prefix-suggestions.test.ts +55 -0
- notebook_intelligence-6.0.0/tests/ts/chat-stopped-turn.test.ts +103 -0
- notebook_intelligence-6.0.0/tests/ts/chat-transcript.test.ts +191 -0
- notebook_intelligence-6.0.0/tests/ts/chatbook-execute.test.ts +724 -0
- notebook_intelligence-6.0.0/tests/ts/chatbook-mentions-menu.test.ts +163 -0
- notebook_intelligence-6.0.0/tests/ts/chatbook-mentions.test.ts +67 -0
- notebook_intelligence-6.0.0/tests/ts/chatbook.test.ts +578 -0
- notebook_intelligence-6.0.0/tests/ts/confirmation-details.test.tsx +100 -0
- notebook_intelligence-6.0.0/tests/ts/inline-completion-origin.test.ts +80 -0
- notebook_intelligence-6.0.0/tests/ts/inline-completion-request.test.ts +84 -0
- notebook_intelligence-6.0.0/tests/ts/mcp-config-save.test.ts +117 -0
- notebook_intelligence-6.0.0/tests/ts/mcp-config-temp-file.test.ts +66 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/open-file-refresh-watcher.test.ts +229 -0
- notebook_intelligence-6.0.0/tests/ts/response-stream-command-allowlist.test.ts +193 -0
- notebook_intelligence-6.0.0/tests/ts/settings-property-field.test.tsx +114 -0
- notebook_intelligence-6.0.0/tests/ts/settings-required-property.test.ts +25 -0
- notebook_intelligence-6.0.0/tests/ts/settings-tab-name.test.tsx +69 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/setup.ts +7 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/utils.test.ts +0 -55
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/README.md +13 -8
- notebook_intelligence-6.0.0/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +70 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/yarn.lock +51 -96
- notebook_intelligence-5.4.0a3/SECURITY.md +0 -43
- notebook_intelligence-5.4.0a3/notebook_intelligence/labextension/static/728.41375a78203cf41e178f.js +0 -1
- notebook_intelligence-5.4.0a3/notebook_intelligence/labextension/static/803.70ff31c9657a3f3e4af6.js +0 -1
- notebook_intelligence-5.4.0a3/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-5.4.0a3/notebook_intelligence/labextension/static/remoteEntry.4fe54e697f4abbc2fd3c.js +0 -1
- notebook_intelligence-5.4.0a3/tests/test_acp_agent.py +0 -490
- notebook_intelligence-5.4.0a3/tests/test_lazy_provider_imports.py +0 -62
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.copier-answers.yml +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.editorconfig +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.gitignore +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/h +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/post-commit +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/post-merge +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-push +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.husky/pre-commit +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.prettierignore +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.vscode/extensions.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.vscode/settings.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/.yarnrc.yml +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/LICENSE +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/docs/skills.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/install.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/base_chat_participant.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/built_in_toolsets.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/chat_history_budget.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/checks.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/claude_sessions.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/mcp_ui_proxy.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/perf.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/perf_probe.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/setup.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_base_chat_participant_integration.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_builtin_cell_output.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_builtin_search_files_sandbox.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_chat_history_budget.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_tool_results.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_claude_turn_usage.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_feedback.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_image_context.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_models.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_perf.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_perf_instrumentation.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_perf_probe.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/claude-mcp-paste.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/inline-completer-telemetry.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/markdown-code-class.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/perf-panel.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/plugins-panel.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/readiness-card.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/terminal-drag.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tour-state.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/tsconfig.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/package.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-5.4.0a3 → notebook_intelligence-6.0.0}/webpack.config.js +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Agent notes for notebook-intelligence
|
|
2
|
+
|
|
3
|
+
Guidance for coding agents working in this repository. [CONTRIBUTING.md](CONTRIBUTING.md) covers the full development setup.
|
|
4
|
+
|
|
5
|
+
## Before pushing
|
|
6
|
+
|
|
7
|
+
Run all four and make sure they pass:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pytest tests/ -q
|
|
11
|
+
jlpm tsc --noEmit
|
|
12
|
+
jlpm lint:check
|
|
13
|
+
jlpm jest
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
If `jlpm lint:check` reports formatting problems, run `jlpm lint` to auto-fix them with the repo's Prettier (this covers Markdown too).
|
|
17
|
+
|
|
18
|
+
## JavaScript tooling
|
|
19
|
+
|
|
20
|
+
- Use `jlpm` for every frontend command (install, build, lint, test). Do not use a system `yarn` or `npm`. `jlpm` is the Yarn bundled with JupyterLab, and CI installs with it.
|
|
21
|
+
- Do not add a `packageManager` field to `package.json`. `jlpm` ignores it, so it only changes which Yarn a plain `yarn` command runs. A lockfile written by a different Yarn version gets a different TypeScript builtin patch hash, and CI's immutable `jlpm` install then fails with `YN0028`.
|
|
22
|
+
- After changing dependencies or `resolutions`, regenerate the lockfile with `jlpm install`, then confirm `jlpm install --immutable` passes. The `yarn.lock` diff should touch only the packages you meant to change.
|
|
23
|
+
|
|
24
|
+
## Code conventions
|
|
25
|
+
|
|
26
|
+
- Adding an admin policy touches seven places. The comment above `FEATURE_POLICY_SPEC` in `notebook_intelligence/extension.py` lists them all; update every one, or the policy silently stops working in one direction.
|
|
27
|
+
- Import `react-icons` icons from `src/icons.ts`, not directly from `react-icons/vsc` or `react-icons/md`. That module re-types the icons so they compile under `@types/react` 18.
|
|
@@ -8,17 +8,52 @@ 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.
|
|
19
|
+
|
|
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
|
|
28
|
+
|
|
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
|
|
47
|
+
|
|
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.
|
|
14
49
|
|
|
15
50
|
### Added
|
|
16
51
|
|
|
17
52
|
- **Experimental ACP agent mode** (#378). A second agent mode that drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/), with OpenAI Codex (via the `codex-acp` adapter) as the first selectable agent type. Adds an ACP tab in Settings with an agent-type dropdown, chat model, API key, and base URL; session listing and resume through the agent's own `session/list` and `session/load`; and streaming, tool-call, and permission-request handling that reuses NBI's existing confirmation flow. ACP mode and Claude mode are mutually exclusive: enabling one disables the other on save, and a hand-edited config that enables both resolves to Claude. Two new admin policies both default to `force-off` rather than `user-choice`: `acp_mode_policy` (`NBI_ACP_MODE_POLICY`), the off switch for the whole mode, and `acp_full_access_policy` (`NBI_ACP_FULL_ACCESS_POLICY`), which governs whether the agent may run tools without asking. While full access is `force-off`, NBI pins Codex to `approval_policy = untrusted` through the adapter's `-c` command-line override, so it asks before anything beyond trusted read-only commands. Credentials and model follow the same env-override locks as Claude (`OPENAI_API_KEY`, `OPENAI_BASE_URL`, `NBI_ACP_CHAT_MODEL`), and `NBI_ACP_AGENT_COMMAND` overrides the adapter command NBI launches. When an API key is configured, codex runs with an isolated `CODEX_HOME` under the NBI user directory so neither the workspace's nor the user's `~/.codex` config is read. See [Gating the experimental ACP agent](docs/admin-guide.md#gating-the-experimental-acp-agent-378).
|
|
18
53
|
- **Proxied Jupyter UI tools for external agents** (#398). NBI's Jupyter-UI tools (create and edit notebooks, run cells, open files, drive the terminal) were only reachable from the in-process MCP server NBI registers with the Claude SDK. Managed and enterprise Claude Code configurations can forbid dynamically configured MCP servers, which made those tools unavailable in exactly the deployments that most need them. A standalone stdio MCP server, `python -m notebook_intelligence.mcp_ui_proxy`, now serves the same tool manifest and relays each call over HTTP to the running Jupyter Server, so it can be declared in a static `mcp.json` like any other server. Setting `jupyter_ui_tools_external` in the Claude settings switches Claude mode from the in-process tools to the relay. The relay endpoint is `/notebook-intelligence/ui-tools` (GET for the manifest, POST to invoke); it requires Jupyter authentication like every other NBI route, and the proxy additionally sends a per-process bridge secret in an `X-NBI-UI-Tools-Token` header, which the relay uses only to exempt the call from the XSRF check (not as an identity). `NBI_UI_TOOLS_URL`, `NBI_UI_TOOLS_TOKEN`, `NBI_UI_TOOLS_SECRET`, `NBI_UI_TOOLS_HTTP_TIMEOUT`, and `NBI_UI_TOOLS_SERVER_NAME` configure the proxy when discovery cannot find the server on its own. See [Serving the Jupyter UI tools to an external agent](docs/admin-guide.md#serving-the-jupyter-ui-tools-to-an-external-agent-398).
|
|
19
54
|
|
|
20
|
-
- **Configuration readiness preflight** (#410). NBI Settings now opens on a Status card answering whether the deployment is configured to work and, if not, which specific piece is missing. Checks resolve the provider and model, confirm the model list is reachable and that the selected model is one the endpoint actually serves, and for the agent modes
|
|
21
|
-
- **Opt-in performance diagnostics** (#408). A Performance tab that answers "where did this turn's time go," aimed at internal LLM gateways, network home directories, and TLS-intercepting proxies. Each chat turn records a phase timeline (rule and context preparation, agent connect and spawn, time to first token, streaming with stall events, tool calls, time spent waiting on the user)
|
|
55
|
+
- **Configuration readiness preflight** (#410). NBI Settings now opens on a Status card answering whether the deployment is configured to work and, if not, which specific piece is missing. Checks resolve the provider and model, confirm the model list is reachable and that the selected model is one the endpoint actually serves, and for the agent modes check what each needs (in Claude mode, that the CLI answers `--version`; in ACP mode, that the adapter command and `npx` resolve) and whether credentials are present; a missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold subscription logins NBI cannot see. Every warning or blocking row carries a remedy naming the next action. `GET /notebook-intelligence/readiness` runs the checks that bill nothing. An opt-in `POST` with `{"live": true}` sends one short real request, which is the only way to catch a gateway that returns 200s but buffers instead of streaming, or a proxy that strips the `tools` field so agent mode silently never calls a tool. It applies to the model-provider chat path and reports itself as not applicable in Claude and ACP modes, where the agent owns the model call. It is refused when `NBI_READINESS_LIVE_CHECK=off` (traitlet `readiness_live_check_allowed`) and returns 429 if one is already running. No model output is retained. See [Configuration readiness](docs/admin-guide.md#configuration-readiness).
|
|
56
|
+
- **Opt-in performance diagnostics** (#408). A Performance tab that answers "where did this turn's time go," aimed at internal LLM gateways, network home directories, and TLS-intercepting proxies. Each chat turn records a phase timeline (rule and context preparation, agent connect and spawn, time to first token, streaming with stall events, tool calls, time spent waiting on the user) with a verdict naming the dominant phase. In Claude mode, turns also carry token counts and the SDK-reported API duration, and comparing active time against API time separates a slow gateway from a slow machine. An environment probe measures filesystem, subprocess, and optional network latency from the server's own vantage point. Off by default, and when off the cost is a single boolean check per instrumentation site. Attributes are redacted by default (paths hashed to basenames), turns are held in a capped ring buffer, and each turn is also summarized as one `perf turn ...` INFO line so headless installs get the same signal. `NBI_PERF_DIAGNOSTICS` locks the enabled state, `NBI_PERF_DIAGNOSTICS_POLICY` governs it fleet-wide, `NBI_PERF_PROBE_NETWORK=off` disables just the network check, and `NBI_PERF_LOG_DIR` redirects the optional JSONL log. See [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md).
|
|
22
57
|
- **Separate model for inline chat** (#413). New optional `claude_settings.inline_chat_model` picks the model used by the inline chat popover, falling back to `chat_model` when unset so existing configs behave exactly as before. Inline chat calls the Anthropic API directly while the other Claude modes go through the Claude Code CLI, and the two transports do not accept the same model-id grammar: a CLI-only id spelling reaches the raw API verbatim and is rejected. Exposed as a collapsible "Inline chat model" control nested under Claude → Chat model, and pinnable via `NBI_CLAUDE_INLINE_CHAT_MODEL`. `NBI_CLAUDE_CHAT_MODEL` keeps governing both surfaces as it does today (while it is set the inline key is ignored and its control is disabled), so an existing pin loses no coverage on upgrade; pin the inline var as well to give the two transports different models.
|
|
23
58
|
|
|
24
59
|
### Changed
|
|
@@ -36,6 +71,7 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
36
71
|
- **AI-streamed code blocks no longer pick up trailing whitespace** (#384). The chat renderer ran a blanket `\n` to ` \n` string replace before markdown parsing, intended for user input but applied to every message, which injected two trailing spaces into every line of a streamed fenced code block and carried them into anything copy-pasted out. The pre-parse transform is gone; NBI now uses the `remark-breaks` plugin, which converts soft breaks to hard breaks at the AST level and is fence-aware, so prose still breaks on single newlines while code blocks are left alone in both directions.
|
|
37
72
|
- **Inline-code styling no longer leaks into fenced code blocks** (#401). `react-markdown` 9 stopped setting the `inline` prop, so the chat renderer's `inline || !match` branch also caught fenced blocks with an unrecognized or missing language and gave them the inline-code pill background; the visible symptom reported was a first-line indent on highlighted blocks, which is that rule's `padding: 1px 4px` landing on a `<code>` it was never meant to reach. Inline and fenced content are now told apart by content shape (`remark-rehype` appends a trailing newline to fenced code and never to an inline span), and the CSS targets an explicit `.inline-code` class instead of `:not(pre) > code`, which had itself been broken by the `PreTag="div"` wrapper the syntax highlighter inserts.
|
|
38
73
|
- **Korean and other IME composition needs only one Enter to submit** (#400). The chat input listened for `keydown` without checking composition state, so the Enter that commits an IME candidate also submitted the message, and users typing Hangul had to retype the last syllable. The handler now ignores Enter while a composition is in progress.
|
|
74
|
+
- **Claude auto-complete no longer raises on every keystroke when the server has no Anthropic credential** (#425). Claude mode signs in through the Claude CLI, which accepts a subscription login, but inline completions call the Anthropic API directly and need a credential of their own. With none available the Anthropic SDK raised `TypeError: "Could not resolve authentication method"` while building each request, so every pause in typing produced a fresh traceback in the server log. NBI now checks whether the SDK resolved a credential before selecting the Claude auto-complete model, leaves the feature off when it did not, and logs one warning per server run naming the remedy. The check asks the SDK itself rather than inspecting an API key, so every credential that SDK accepts counts, which on current releases includes `ANTHROPIC_AUTH_TOKEN`, a profile, the workload-identity variables, and an `ANTHROPIC_CUSTOM_HEADERS` header; a blank value is treated as no credential, since the SDK would send an empty header and take a 401 per request. A credential-resolution error can no longer fail the whole capabilities response either. The readiness Status card's Anthropic credentials row now recognizes `ANTHROPIC_AUTH_TOKEN` as well, and names auto-complete alongside chat as something to check, without asserting that either is off: that row sees one settings field and two environment variables, while the SDK can authenticate from sources it cannot see.
|
|
39
75
|
|
|
40
76
|
## [5.3.1] - 2026-07-29
|
|
41
77
|
|
|
@@ -460,7 +496,13 @@ A multi-PR accessibility pass landed across most NBI surfaces. Together these ma
|
|
|
460
496
|
- Settings UI restructured around Claude vs default mode.
|
|
461
497
|
- WebSocket connection reliability improvements.
|
|
462
498
|
|
|
463
|
-
[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
|
|
464
506
|
[5.1.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.1...v5.1.0
|
|
465
507
|
[5.0.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.0...v5.0.1
|
|
466
508
|
[5.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v4.8.0...v5.0.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -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
|
|
|
@@ -194,6 +199,8 @@ Both layers only run Prettier, which is safe to apply automatically; ESLint and
|
|
|
194
199
|
|
|
195
200
|
If `jlpm install` produces unexpected lockfile changes, your local Yarn version probably differs from the one bundled with JupyterLab. `jlpm` ships with JupyterLab — use it directly instead of a system-wide `yarn`.
|
|
196
201
|
|
|
202
|
+
If you work with a coding agent, [AGENTS.md](AGENTS.md) holds these `jlpm` and lockfile rules in a form agents pick up automatically.
|
|
203
|
+
|
|
197
204
|
## Packaging
|
|
198
205
|
|
|
199
206
|
See [RELEASE.md](RELEASE.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version:
|
|
3
|
+
Version: 6.0.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
|
|
@@ -695,29 +695,31 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
695
695
|
Classifier: Programming Language :: Python :: 3.12
|
|
696
696
|
Requires-Python: >=3.10
|
|
697
697
|
Requires-Dist: agent-client-protocol==0.10.1
|
|
698
|
-
Requires-Dist: aiohttp>=3.14.
|
|
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
|
-
Requires-Dist:
|
|
704
|
-
Requires-Dist:
|
|
703
|
+
Requires-Dist: ipykernel>=6.0
|
|
704
|
+
Requires-Dist: jupyter-server<3,>=2.21.0
|
|
705
|
+
Requires-Dist: litellm>=1.84.0
|
|
705
706
|
Requires-Dist: mcp<2,>=1.28.1
|
|
706
|
-
Requires-Dist: mistune>=3.3.
|
|
707
|
+
Requires-Dist: mistune>=3.3.3
|
|
707
708
|
Requires-Dist: ollama
|
|
708
709
|
Requires-Dist: openai
|
|
709
710
|
Requires-Dist: psutil>=5.7
|
|
710
711
|
Requires-Dist: pydantic-settings>=2.14.2
|
|
711
|
-
Requires-Dist: python-
|
|
712
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
713
|
+
Requires-Dist: python-multipart>=0.0.31
|
|
712
714
|
Requires-Dist: sseclient-py
|
|
713
715
|
Requires-Dist: starlette>=1.3.1
|
|
714
716
|
Requires-Dist: tiktoken
|
|
715
|
-
Requires-Dist: tornado>=6.5.
|
|
717
|
+
Requires-Dist: tornado>=6.5.10
|
|
716
718
|
Requires-Dist: urllib3>=2.7.0
|
|
717
719
|
Provides-Extra: test
|
|
718
720
|
Requires-Dist: psutil; extra == 'test'
|
|
719
721
|
Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
|
|
720
|
-
Requires-Dist: pytest<9
|
|
722
|
+
Requires-Dist: pytest<10,>=9.0.3; extra == 'test'
|
|
721
723
|
Requires-Dist: pyyaml; extra == 'test'
|
|
722
724
|
Description-Content-Type: text/markdown
|
|
723
725
|
|
|
@@ -735,6 +737,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
735
737
|
- [Feature highlights](#feature-highlights)
|
|
736
738
|
- [Claude mode](#claude-mode)
|
|
737
739
|
- [Agent mode](#agent-mode)
|
|
740
|
+
- [ACP agent mode](#acp-agent-mode)
|
|
741
|
+
- [Chatbook](#chatbook)
|
|
738
742
|
- [Code generation with inline chat](#code-generation-with-inline-chat)
|
|
739
743
|
- [Auto-complete](#auto-complete)
|
|
740
744
|
- [Chat interface](#chat-interface)
|
|
@@ -764,7 +768,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
764
768
|
|
|
765
769
|
- Python 3.10+
|
|
766
770
|
- JupyterLab 4.x
|
|
767
|
-
- 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`.
|
|
768
772
|
- A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
|
|
769
773
|
|
|
770
774
|
## Quick start
|
|
@@ -873,6 +877,20 @@ In Agent mode, the built-in AI agent creates, edits, and executes notebooks for
|
|
|
873
877
|
|
|
874
878
|

|
|
875
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
|
+
|
|
876
894
|
### Code generation with inline chat
|
|
877
895
|
|
|
878
896
|
Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the inline chat popover.
|
|
@@ -883,7 +901,7 @@ Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the in
|
|
|
883
901
|
|
|
884
902
|
### Auto-complete
|
|
885
903
|
|
|
886
|
-
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.
|
|
887
905
|
|
|
888
906
|
<img src="media/inline-completion.gif" alt="Auto-complete" width=700 />
|
|
889
907
|
|
|
@@ -903,6 +921,8 @@ Right-click a cell output (or hover for the toolbar) to send it straight into th
|
|
|
903
921
|
|
|
904
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`.
|
|
905
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
|
+
|
|
906
926
|
### Notebook toolbar generation
|
|
907
927
|
|
|
908
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.
|
|
@@ -937,26 +957,35 @@ Most settings panel toggles can be locked by org administrators. Two shapes:
|
|
|
937
957
|
|
|
938
958
|
**Boolean policies** use the `*_POLICY` suffix and accept three values: `user-choice` (default — user toggles freely), `force-on` (locked enabled), `force-off` (locked disabled). When forced, the panel control is disabled with a "Locked by your administrator" tooltip and any client-side write is ignored.
|
|
939
959
|
|
|
940
|
-
| Env var | Locks the Settings panel control for
|
|
941
|
-
| ---------------------------------------------- |
|
|
942
|
-
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors"
|
|
943
|
-
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs"
|
|
944
|
-
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar"
|
|
945
|
-
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode"
|
|
946
|
-
| `NBI_ACP_MODE_POLICY` | "Enable ACP mode" (experimental agent mode over the Agent Client Protocol, with Codex as the first agent type; defaults to `force-off`, set `user-choice` to allow it)
|
|
947
|
-
| `NBI_ACP_FULL_ACCESS_POLICY` | "Full access" for the ACP agent: run
|
|
948
|
-
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history"
|
|
949
|
-
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools"
|
|
950
|
-
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools"
|
|
951
|
-
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User
|
|
952
|
-
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project
|
|
953
|
-
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token"
|
|
954
|
-
| `NBI_SKILLS_MANAGEMENT_POLICY` | The Skills tab (force-off hides it and 403s the API; also disables the managed-skills reconciler)
|
|
955
|
-
| `NBI_CLAUDE_MCP_MANAGEMENT_POLICY` | The Claude-mode MCP Servers tab (force-off hides it and 403s `/claude-mcp/*`; independent of the non-Claude MCP Servers tab)
|
|
956
|
-
| `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY` | The Claude-mode Plugins tab (force-off hides it and 403s `/plugins/*`)
|
|
957
|
-
| `NBI_CLAUDE_BYPASS_PERMISSIONS_POLICY` | "Bypass Permissions" in the Claude permission-mode selector (defaults to `force-off`, as do `NBI_ACP_MODE_POLICY` and `NBI_ACP_FULL_ACCESS_POLICY`; `user-choice` exposes the option, which the user still arms per session)
|
|
958
|
-
| `NBI_TERMINAL_DRAG_DROP_POLICY` | Terminal drag-drop file attach feature
|
|
959
|
-
| `NBI_REFRESH_OPEN_FILES_ON_DISK_CHANGE_POLICY` | "Refresh open files when changed on disk"
|
|
960
|
+
| Env var | Locks the Settings panel control for |
|
|
961
|
+
| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
962
|
+
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors" |
|
|
963
|
+
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs" |
|
|
964
|
+
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar" |
|
|
965
|
+
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode" |
|
|
966
|
+
| `NBI_ACP_MODE_POLICY` | "Enable ACP mode" (experimental agent mode over the Agent Client Protocol, with Codex as the first agent type; defaults to `force-off`, set `user-choice` to allow it) |
|
|
967
|
+
| `NBI_ACP_FULL_ACCESS_POLICY` | "Full access" for the ACP agent: edit workspace files and run commands without asking, inside Codex's workspace-write sandbox with network access off unless Codex's config enables it (defaults to `force-off`, so the agent asks before anything beyond trusted read-only commands; `user-choice` lets users opt into unattended runs) |
|
|
968
|
+
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history" |
|
|
969
|
+
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools" |
|
|
970
|
+
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools" |
|
|
971
|
+
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User |
|
|
972
|
+
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project |
|
|
973
|
+
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token" |
|
|
974
|
+
| `NBI_SKILLS_MANAGEMENT_POLICY` | The Skills tab (force-off hides it and 403s the API; also disables the managed-skills reconciler) |
|
|
975
|
+
| `NBI_CLAUDE_MCP_MANAGEMENT_POLICY` | The Claude-mode MCP Servers tab (force-off hides it and 403s `/claude-mcp/*`; independent of the non-Claude MCP Servers tab) |
|
|
976
|
+
| `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY` | The Claude-mode Plugins tab (force-off hides it and 403s `/plugins/*`) |
|
|
977
|
+
| `NBI_CLAUDE_BYPASS_PERMISSIONS_POLICY` | "Bypass Permissions" in the Claude permission-mode selector (defaults to `force-off`, as do `NBI_ACP_MODE_POLICY` and `NBI_ACP_FULL_ACCESS_POLICY`; `user-choice` exposes the option, which the user still arms per session) |
|
|
978
|
+
| `NBI_TERMINAL_DRAG_DROP_POLICY` | Terminal drag-drop file attach feature |
|
|
979
|
+
| `NBI_REFRESH_OPEN_FILES_ON_DISK_CHANGE_POLICY` | "Refresh open files when changed on disk" |
|
|
980
|
+
| `NBI_CHATBOOK_POLICY` | Chatbook natural-language notebook cells (force-off hides the kernel, launcher tile, Settings tab, and commands, and 403s the generate and mention APIs) |
|
|
981
|
+
|
|
982
|
+
Chatbook NL execution is capped separately (not a boolean policy):
|
|
983
|
+
|
|
984
|
+
| Env var / traitlet | Effect |
|
|
985
|
+
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
986
|
+
| `NBI_CHATBOOK_MAX_EXECUTION_MODE` | Users cannot choose a more permissive Chatbook mode than this. Values: `always-confirm`, `confirm-if-risky`, `auto-run` (default, no cap). |
|
|
987
|
+
|
|
988
|
+
The matching traitlets are `c.NotebookIntelligence.chatbook_policy` and `c.NotebookIntelligence.chatbook_max_execution_mode`. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
960
989
|
|
|
961
990
|
The first three also have matching traitlets on `NotebookIntelligence` (`explain_error_policy`, `output_followup_policy`, `output_toolbar_policy`); add the others as needed in the same shape:
|
|
962
991
|
|
|
@@ -988,7 +1017,7 @@ Per-user preferences (default on for the cell-output features) live in `config.j
|
|
|
988
1017
|
|
|
989
1018
|
Inline chat calls the Anthropic API directly while the other Claude modes go through the Claude Code CLI, so a deployment can need a different model id for each. It uses `inline_chat_model`, falling back to `chat_model` when that is unset. `NBI_CLAUDE_CHAT_MODEL` therefore governs both surfaces: while it is set, a stored `inline_chat_model` is ignored and its control is disabled. Set `NBI_CLAUDE_INLINE_CHAT_MODEL` as well to pin inline chat to a different model — it takes precedence and re-enables nothing, so both surfaces stay administrator-controlled.
|
|
990
1019
|
|
|
991
|
-
`NBI_ACP_AGENT_COMMAND` (not a settings lock) overrides the adapter command NBI launches for the selected ACP agent type; the value is shell-split. Leave it unset to use the agent's registered default command.
|
|
1020
|
+
`NBI_ACP_AGENT_COMMAND` (not a settings lock) overrides the adapter command NBI launches for the selected ACP agent type; the value is shell-split. For Codex, NBI appends its `-c` approval and sandbox options to that command, so a replacement must pass them through to codex-acp. Leave it unset to use the agent's registered default command.
|
|
992
1021
|
|
|
993
1022
|
Provider IDs: `github-copilot`, `openai-compatible`, `litellm-compatible`, `ollama`, `none`. The `*_MODEL_ID` value is whatever the chosen provider exposes (e.g. `gpt-4o`, `llama3:latest`). Claude model IDs are the literal IDs from the Anthropic API (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`); empty string = "Default (recommended)"; `NBI_CLAUDE_INLINE_COMPLETION_MODEL` also accepts `none` (no inline completion in Claude mode) or `inherit` (use the General-tab Auto-complete model).
|
|
994
1023
|
|
|
@@ -1103,7 +1132,7 @@ To temporarily disable a configured server without removing it, set `"disabled":
|
|
|
1103
1132
|
|
|
1104
1133
|
## Rulesets
|
|
1105
1134
|
|
|
1106
|
-
NBI's ruleset system lets you define guidelines and best practices that get injected into AI prompts automatically — for consistent coding standards, project conventions, or domain knowledge. Rules are markdown files in `~/.jupyter/nbi/rules/` and can scope by file pattern, kernel, directory, or chat
|
|
1135
|
+
NBI's ruleset system lets you define guidelines and best practices that get injected into AI prompts automatically — for consistent coding standards, project conventions, or domain knowledge. Rules are markdown files in `~/.jupyter/nbi/rules/` and can scope by file pattern, kernel, directory, or mode (`ask`, `agent`, `inline-chat`, `chatbook`).
|
|
1107
1136
|
|
|
1108
1137
|
A two-line example:
|
|
1109
1138
|
|
|
@@ -1200,6 +1229,9 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1200
1229
|
- [`docs/admin-guide.md`](docs/admin-guide.md) — deployment, env vars, security model, air-gap, multi-tenancy.
|
|
1201
1230
|
- [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
|
|
1202
1231
|
- [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
|
|
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.
|
|
1234
|
+
- [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
|
|
1203
1235
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
|
|
1204
1236
|
- [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
|
|
1205
1237
|
- [`PRIVACY.md`](PRIVACY.md) — what NBI sends to which provider, and the egress allowlist.
|
|
@@ -1216,7 +1248,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1216
1248
|
|
|
1217
1249
|
## Roadmap
|
|
1218
1250
|
|
|
1219
|
-
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.
|
|
1220
1252
|
|
|
1221
1253
|
## License
|
|
1222
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).
|