notebook-intelligence 6.2.0__tar.gz → 6.3.0a1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.gitignore +3 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/AGENTS.md +3 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CHANGELOG.md +49 -3
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CONTRIBUTING.md +57 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/PKG-INFO +22 -11
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/PRIVACY.md +13 -13
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/README.md +14 -6
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/acp.md +3 -2
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/admin-guide.md +46 -7
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/admin-tour-config.md +7 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/chatbook.md +5 -3
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/performance-diagnostics.md +0 -2
- notebook_intelligence-6.3.0a1/docs/translating.md +69 -0
- notebook_intelligence-6.3.0a1/hatch_build.py +140 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/jest.config.js +3 -1
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_agent.py +124 -67
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_mcp_server.py +16 -4
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_registry.py +169 -12
- notebook_intelligence-6.3.0a1/notebook_intelligence/acp_runtime.py +112 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/ai_service_manager.py +6 -4
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/api.py +25 -6
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/base_chat_participant.py +15 -10
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/built_in_toolsets.py +23 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_generate.py +23 -8
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude.py +33 -20
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude_sessions.py +2 -1
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/config.py +6 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/extension.py +163 -42
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/github_copilot.py +13 -2
- notebook_intelligence-6.3.0a1/notebook_intelligence/i18n.py +275 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/package.json +60 -8
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +59 -7
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -1
- notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/128.0480c0673df28c8cb3b0.js +1 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/728.4dd1e71dd776376d226a.js +1 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/remoteEntry.6e66faf51ed6fc837255.js +1 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/third-party-licenses.json +8 -14
- notebook_intelligence-6.3.0a1/notebook_intelligence/llm_providers/property_labels.py +67 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ar_SA/LC_MESSAGES/notebook_intelligence.po +4375 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ca_ES/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/cs_CZ/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/da_DK/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/de_DE/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/el_GR/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/es_ES/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/et_EE/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/fi_FI/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/fr_FR/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/he_IL/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/hu_HU/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/hy_AM/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/id_ID/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/it_IT/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ja_JP/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ko_KR/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/lt_LT/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/nl_NL/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/no_NO/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/notebook_intelligence.pot +4234 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/pl_PL/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/pt_BR/LC_MESSAGES/notebook_intelligence.po +4247 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ro_RO/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ru_RU/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/tr_TR/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/uk_UA/LC_MESSAGES/notebook_intelligence.po +4279 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/vi_VN/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/zh_CN/LC_MESSAGES/notebook_intelligence.po +4215 -0
- notebook_intelligence-6.3.0a1/notebook_intelligence/locale/zh_TW/LC_MESSAGES/notebook_intelligence.po +4215 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_manager.py +4 -2
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/readiness.py +299 -202
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/package.json +59 -7
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/pyproject.toml +50 -11
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/schema/plugin.json +0 -1
- notebook_intelligence-6.3.0a1/scripts/i18n.py +381 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_acp_agent.py +427 -12
- notebook_intelligence-6.3.0a1/tests/test_acp_registry.py +609 -0
- notebook_intelligence-6.3.0a1/tests/test_acp_runtime.py +203 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ai_service_manager_dispatch.py +3 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_base_chat_participant_integration.py +33 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_bash_approval_rendering.py +3 -1
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_client.py +3 -2
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_llm_provider.py +3 -0
- notebook_intelligence-6.3.0a1/tests/test_i18n_catalogs.py +338 -0
- notebook_intelligence-6.3.0a1/tests/test_i18n_server.py +425 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_readiness.py +312 -13
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_websocket_handler_integration.py +98 -0
- notebook_intelligence-6.3.0a1/tests/ts/__mocks__/jupyterlab-translation.ts +61 -0
- notebook_intelligence-6.3.0a1/tests/ts/api-websocket-queue.test.ts +141 -0
- notebook_intelligence-6.3.0a1/tests/ts/builtin-toolset-labels.test.ts +25 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-toolbar-convert.test.ts +35 -1
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook.test.ts +7 -2
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/claude-mcp-paste.test.ts +43 -17
- notebook_intelligence-6.3.0a1/tests/ts/i18n-chat.test.tsx +79 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-chatbook.test.ts +72 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-panels.test.ts +47 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-perf.test.ts +21 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-server-locale.test.ts +60 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-settings.test.tsx +122 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-skills.test.tsx +67 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n-tour.test.ts +136 -0
- notebook_intelligence-6.3.0a1/tests/ts/i18n.test.tsx +125 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-util.test.ts +20 -3
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/perf-panel.test.tsx +3 -2
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/plugins-panel.test.tsx +8 -5
- notebook_intelligence-6.3.0a1/tests/ts/pseudo-translator.ts +42 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-tab-name.test.tsx +2 -2
- notebook_intelligence-6.3.0a1/tests/ts/terminal-drag.test.ts +561 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/README.md +10 -9
- notebook_intelligence-6.3.0a1/ui-tests/tests/i18n.spec.ts +140 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/yarn.lock +68 -41
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/7.b660d984046388f395e5.js +0 -1
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +0 -1
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/remoteEntry.10c9ca7e4b3cffb98413.js +0 -1
- notebook_intelligence-6.2.0/tests/ts/terminal-drag.test.ts +0 -183
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.copier-answers.yml +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.editorconfig +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/h +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-commit +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-merge +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-push +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/pre-commit +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.prettierignore +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.vscode/extensions.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.vscode/settings.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.yarnrc.yml +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CLAUDE.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/LICENSE +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/RELEASE.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/SECURITY.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/chatbook-extensions.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/rulesets.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/skills.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/troubleshooting.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/install.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chat_history_budget.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/codegen.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_mentions.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/checks.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/inline_completion.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_client.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_ui_proxy.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/perf.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/perf_probe.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/rule_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/ruleset.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/util.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/setup.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/conftest.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ai_service_manager_integration.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_cell_output.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_search_files_sandbox.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_cell_output_features_response.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chat_history_budget.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_backend.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_danger.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_enable.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_perf.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_models.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sdk_mcp_server.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_results.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_turn_usage.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_handler_claude_settings.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_disabled_provider_models.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_enabled_providers_env.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_feedback.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_login_gating.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_image_context.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_inline_completion_shortcuts.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_lazy_provider_imports.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_client_shim.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_null_config.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_models.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf_instrumentation.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf_probe.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_provider_stream_cancellation.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_response_emitter.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_run_ui_command_allowlist_parity.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_tour_disabled.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/strip-ansi.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-cancel.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-prefix-suggestions.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-stopped-turn.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-transcript.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-convert.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-execute.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-mentions-menu.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-mentions.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-summarize.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/confirmation-details.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completer-telemetry.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completion-origin.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completion-request.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/markdown-code-class.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-config-save.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-config-temp-file.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/readiness-card.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/select-theme-css.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-property-field.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-required-property.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/setup.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-state.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/utils.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tsconfig.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/package.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/webpack.config.js +0 -0
|
@@ -8,6 +8,8 @@ node_modules/
|
|
|
8
8
|
.ipynb_checkpoints
|
|
9
9
|
*.tsbuildinfo
|
|
10
10
|
notebook_intelligence/labextension
|
|
11
|
+
# Compiled translation bundles; only the .po sources are committed
|
|
12
|
+
notebook_intelligence/locale/*/LC_MESSAGES/*.json
|
|
11
13
|
# Version file is handled by hatchling
|
|
12
14
|
notebook_intelligence/_version.py
|
|
13
15
|
|
|
@@ -70,6 +72,7 @@ coverage.xml
|
|
|
70
72
|
# Translations
|
|
71
73
|
*.mo
|
|
72
74
|
*.pot
|
|
75
|
+
!notebook_intelligence/locale/notebook_intelligence.pot
|
|
73
76
|
|
|
74
77
|
# Scrapy stuff:
|
|
75
78
|
.scrapy
|
|
@@ -13,6 +13,8 @@ jlpm lint:check
|
|
|
13
13
|
jlpm jest
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
If you added or changed a user-visible string, also run `jlpm i18n:extract` (CI's `jlpm i18n:check` fails on a stale translation template). It needs `pip install -e ".[i18n]"`.
|
|
17
|
+
|
|
16
18
|
If `jlpm lint:check` reports formatting problems, run `jlpm lint` to auto-fix them with the repo's Prettier (this covers Markdown too).
|
|
17
19
|
|
|
18
20
|
## JavaScript tooling
|
|
@@ -24,4 +26,5 @@ If `jlpm lint:check` reports formatting problems, run `jlpm lint` to auto-fix th
|
|
|
24
26
|
## Code conventions
|
|
25
27
|
|
|
26
28
|
- 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.
|
|
29
|
+
- Every user-visible string goes through JupyterLab's translator: `const trans = getTrans();` (or `useTrans()` in a component) from `src/i18n.ts`, then `trans.__('Saved %1', name)`. The local must be named `trans` or the extractor misses it. Use placeholders instead of concatenation, and do not translate at module load. Prompts sent to a model, tool results returned to it, logs and product names stay English, and so do strings in `schema/plugin.json`. Python text shown to the user uses a bundle from `notebook_intelligence/i18n.py` the same way (`trans = i18n.request_bundle(self)` in a handler, `trans = i18n.response_bundle(response)` in chat code). [CONTRIBUTING.md](CONTRIBUTING.md#translations) has the details.
|
|
27
30
|
- 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,60 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
8
8
|
|
|
9
9
|
<!-- <START NEW CHANGELOG ENTRY> -->
|
|
10
10
|
|
|
11
|
-
## [
|
|
11
|
+
## [Unreleased]
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Dependency floors raised past newly published advisories** (#518). The Python floors move to `litellm>=1.96.2`, `mcp>=1.30.0`, `urllib3>=2.8.0`, and `aiohttp>=3.14.4`, and the build requires `jupyterlab>=4.6.4`. litellm backported its fix to each minor line from 1.88 to 1.96, so 1.96.2 is the lowest floor that excludes every unpatched release. The `mcp` advisory affects only the StreamableHTTP server, which NBI does not use. npm resolutions were raised or added for `brace-expansion`, `sanitize-html`, `serialize-javascript`, `undici`, `handlebars`, `shell-quote`, and `source-map-js`; of those, only `sanitize-html` reaches the shipped bundle.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **Terminal drops reject filenames with control or misleading formatting characters.** File-browser drops and uploaded paths containing line breaks, terminal control characters, Unicode line/paragraph separators, or bidirectional formatting controls are skipped with a warning in both @-mention and raw modes. Other paths in the same drop still paste normally.
|
|
20
|
+
- **ACP startup no longer lets npm projects choose the adapter.** Starting an adapter through `npx` could execute a package planted in the workspace or a shared ancestor of the user's home before any approval prompt. ACP now launches a preinstalled `codex-acp` executable directly from an absolute server `PATH` directory, excluding workspace paths, aliases, and intermediate symlink hops from adapter discovery, interpreter checks, and the `PATH` inherited by agent commands. **Migration:** install the tested `@zed-industries/codex-acp@0.16.0` in a trusted location and maintain its version there; NBI does not verify versions found on `PATH` or through an override. `NBI_ACP_AGENT_COMMAND` must point to the installed adapter itself by absolute path, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper. An override preserves the executable's name for trusted shims and retains the full server `PATH`; it is an administrator trust decision covering the executable, its runtime and packages, and their parent directories. Readiness and startup use the same resolver, so relative, missing, malformed, and set-but-empty or whitespace-only commands are consistently blocked. Unset `NBI_ACP_AGENT_COMMAND` to restore default discovery; assigning an empty value does not reset it. The adapter starts in NBI's user directory, workspace sessions retain their explicit root, and the `nbi_workspace_root` MCP tool requires an explicit absolute root through an environment variable instead of falling back to the launch directory. See the [admin guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378).
|
|
21
|
+
|
|
22
|
+
## [6.2.0] - 2026-10-05
|
|
23
|
+
|
|
24
|
+
6.2.0 adds a way to turn an existing notebook into a Chatbook and fixes two Chatbook problems that silently dropped content: `@` mentions that lost their file, and exported code cells that lost their code. No traitlet, env var, REST route, or on-disk format was renamed or removed; upgrading needs no migration.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **Convert to Chatbook** (#508). Ordinary notebooks get a **Convert to Chatbook** toolbar button and a **Convert notebook to Chatbook** palette command, the reverse of **Export as code notebook**. Both write a Chatbook copy beside the original (`analysis.ipynb` becomes `analysis-chatbook.ipynb`) and open it, with every code cell arriving as a **Cd** cell that runs exactly as written. The exception is a Chatbook whose kernel was switched to another one: its natural-language cells that have run and not been edited since stay natural language. Outputs, attachments, markdown and raw cells, and other metadata are kept. Conversion sends nothing to the model. A notebook in a different language from the configured backend kernel is not converted, and the dialog explains why. See [`docs/chatbook.md`](docs/chatbook.md#convert-a-notebook-to-a-chatbook).
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **`@` mentions followed by punctuation or naming paths with spaces resolve** (#505). Punctuation typed right after a mention (`@file:data/README.md, then chart it`) became part of the path, and a path containing a space could not be written at all, so the model received the mention as unavailable and generated code anyway. Sentence punctuation after an unquoted file or folder mention is now trimmed, stopping at the first name that exists, and a quoted form (`@file:"data/my notes.md"`) names a path containing whitespace or `@`. The mention menu inserts the quoted form when it is needed.
|
|
33
|
+
- **Exporting keeps the code of a code cell switched to natural language** (#510). A **Cd** cell switched to **NL** and not run again was exported as a comment of its English description instead of its code. Export now writes the code when the cell's English is still the description of that exact code, or is empty on a cell that has only ever been code. English edited after the switch still exports as comments. A description written before 6.2.0 does not record which code it describes, so such a cell still exports as comments until **Refresh English representation** is run on it.
|
|
34
|
+
|
|
35
|
+
## [6.1.0] - 2026-09-26
|
|
36
|
+
|
|
37
|
+
6.1.0 adds a switch that turns off the first-run tour, lets NBI share an environment with `jupyter-ai`, and fixes two chat sidebar controls. No traitlet, env var, REST route, or on-disk format was renamed or removed. The `agent-client-protocol` floor moves from 0.10.1 to 0.11.0, so an environment that pins 0.10.x must lift that pin to upgrade.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **`NBI_TOUR_DISABLED` turns off the first-run tour** (#495). A deployment can stop the tour from opening on first run without maintaining an override file that disables every step, which broke silently whenever a release added a step. The traitlet is `NotebookIntelligence.tour_disabled`, and the environment variable takes precedence. Users can still replay the tour with **Show NBI tour**. See [`docs/admin-tour-config.md`](docs/admin-tour-config.md#turning-the-tour-off).
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- **`agent-client-protocol` is a range instead of an exact pin** (#501). The dependency moves from `==0.10.1` to `>=0.11.0,<1`, so NBI can be installed in the same environment as `jupyter-ai`, whose ACP client requires `>=0.11.0,<0.12.0`.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- **Dropdown choices are readable in dark JupyterLab themes** (#497). The chat mode select and NBI's other dropdowns showed light text on the browser's default light option list, so the choices were nearly invisible.
|
|
50
|
+
- **The chat sidebar's `/` and `@` popover keeps its selection visible and valid** (#499). Arrow keys moved the selection out of view on a list longer than the popover, and filtering the list could leave the selection pointing past its end, so Enter raised and the keypress was lost.
|
|
51
|
+
|
|
52
|
+
## [6.0.0] - 2026-09-22
|
|
12
53
|
|
|
13
54
|
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
55
|
|
|
15
56
|
### Added
|
|
16
57
|
|
|
17
58
|
- **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).
|
|
59
|
+
- **Chatbook generation appears in performance diagnostics** (#488). Generation records the same `context_prep` and `dispatch` phases as a chat turn, and its `mode` is `chatbook:<provider>`, so it can be told apart from chat on the same provider.
|
|
18
60
|
- **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
61
|
|
|
20
62
|
### Changed
|
|
21
63
|
|
|
64
|
+
- **Chatbook generation asks for results that later cells can name** (#493). The generation instructions now ask the model to bind a cell's meaningful result to a descriptive variable, to avoid the kernel's implicit input and output history (`_`, `Out[n]`, `In[n]`), and, when a cell is regenerated, not to count on names defined only by the code being replaced. These are instructions to the model, not checks on the code it returns.
|
|
22
65
|
- **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
66
|
- **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
67
|
- **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.
|
|
@@ -32,6 +75,7 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
32
75
|
- **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
76
|
- **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
77
|
- **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.
|
|
78
|
+
- **Copilot is no longer signed in when nothing will use it** (#490). A Claude-only deployment logged into GitHub Copilot at startup, refreshed its token, and polled `api.github.com` for the life of the server, because both model fields default to Copilot. NBI now signs in only when Copilot will serve chat or autocomplete, so Claude chat with Copilot autocomplete still works. Turning "remember login" off still deletes a stored token.
|
|
35
79
|
- **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
80
|
- **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
81
|
- **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.
|
|
@@ -40,7 +84,7 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
40
84
|
- **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
85
|
- **`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
86
|
- **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.
|
|
87
|
+
- **Chatbook fixes** (#457, #458, #487). 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. Rules scoped with `kernel_names` are matched against the backend kernel the generated code runs in rather than the `chatbook` wrapper, so a rule naming `python3` now applies to a Python Chatbook. A rule naming `kernel_names: ['chatbook']`, written during the 6.0.0 prereleases, no longer matches; put Chatbook-only rules under `modes/chatbook/` instead (see [`docs/rulesets.md`](docs/rulesets.md)).
|
|
44
88
|
- **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
89
|
|
|
46
90
|
## [5.4.0] - 2026-09-01
|
|
@@ -496,7 +540,9 @@ A multi-PR accessibility pass landed across most NBI surfaces. Together these ma
|
|
|
496
540
|
- Settings UI restructured around Claude vs default mode.
|
|
497
541
|
- WebSocket connection reliability improvements.
|
|
498
542
|
|
|
499
|
-
[unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.
|
|
543
|
+
[unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.2.0...HEAD
|
|
544
|
+
[6.2.0]: https://github.com/plmbr/notebook-intelligence/compare/v6.1.0...v6.2.0
|
|
545
|
+
[6.1.0]: https://github.com/plmbr/notebook-intelligence/compare/v6.0.0...v6.1.0
|
|
500
546
|
[6.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.4.0...v6.0.0
|
|
501
547
|
[5.4.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.1...v5.4.0
|
|
502
548
|
[5.3.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.0...v5.3.1
|
|
@@ -201,6 +201,63 @@ If `jlpm install` produces unexpected lockfile changes, your local Yarn version
|
|
|
201
201
|
|
|
202
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
203
|
|
|
204
|
+
## Translations
|
|
205
|
+
|
|
206
|
+
Translators: see [docs/translating.md](docs/translating.md). NBI's user interface is translated through JupyterLab's own translation system, so it follows the language a user picks under **Settings → Language** (which lists the JupyterLab language packs installed on the server). The gettext domain is `notebook_intelligence`. Catalogs live in the package:
|
|
207
|
+
|
|
208
|
+
- `notebook_intelligence/locale/notebook_intelligence.pot` is the template of every translatable string. It is generated; do not edit it by hand.
|
|
209
|
+
- `notebook_intelligence/locale/<locale>/LC_MESSAGES/notebook_intelligence.po` is one language, for example `de_DE`. These are the only catalog files translators edit.
|
|
210
|
+
- The `.json` bundle the frontend loads and the `.mo` file the server reads are compiled from each `.po` when a wheel is built (`hatch_build.py`) and are not committed. The `jupyterlab.locale` entry point in `pyproject.toml` is how `jupyterlab_server` finds it.
|
|
211
|
+
- Strings in `schema/plugin.json` stay English: `jupyterlab_server` translates settings schemas only from JupyterLab language packs, never from an extension's own catalog. Put user-visible text on the command instead (a toolbar button's tooltip falls back to its command's label and caption).
|
|
212
|
+
|
|
213
|
+
### Writing translatable strings
|
|
214
|
+
|
|
215
|
+
In TypeScript, take the bundle where the string is used and name the local `trans`, because the extractor only recognizes calls on a variable with that name:
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
import { getTrans, useTrans } from './i18n';
|
|
219
|
+
|
|
220
|
+
const trans = getTrans(); // in a React component: const trans = useTrans();
|
|
221
|
+
Notification.error(trans.__('Failed to save %1', path));
|
|
222
|
+
trans._n('%1 file', '%1 files', count); // plurals; %1 is the count
|
|
223
|
+
trans._p('toolbar', 'Run'); // a short label whose meaning depends on context
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
- Never build a sentence from pieces (`'Failed to ' + verb`) or with a template literal. Write the whole sentence with `%1`, `%2` placeholders so a translator can reorder it.
|
|
227
|
+
- Never translate at module load (a top-level `const LABEL = trans.__(...)`): the bundle is bound when the plugin activates, so such a string stays English.
|
|
228
|
+
- Keep markup out of translated strings. For a sentence with a link or other element inside it, use `interpolate` from `src/i18n.ts`, which translates the whole sentence and places the elements at its `%1`, `%2` placeholders, so a translator can reorder them.
|
|
229
|
+
- Give short labels whose meaning depends on where they appear a context with `trans._p` (`trans._p('permission mode', 'Plan')`), so a translator can choose a different word for each use.
|
|
230
|
+
- Pass string literals only. The extractor skips any other argument (a variable, a template literal), so the string would never be translated; a lint rule enforces this.
|
|
231
|
+
- Leave in English anything that is not shown to the user as prose: prompts and instructions sent to a model, results that UI tools return to the model, log and console messages, telemetry, command ids, and configuration values. Product names (Notebook Intelligence, Claude Code, Codex) are not translated. Neither is text that styling or code matches on, such as the launcher category `Coding Agent`, which `style/base.css` pins to the top of the launcher.
|
|
232
|
+
|
|
233
|
+
The server translates text it writes for the user (the readiness report, approval cards, chat status lines, built-in toolset descriptions, user-facing REST errors) from the same catalogs, in the language each request names: `src/handler.ts` adds an `nbi_locale` query parameter to REST calls and the chat WebSocket (`withLocale`). Not a header, which would need a CORS preflight that jupyter_server refuses. As in the frontend, a locale is translated only when a JupyterLab language pack for it is installed. The same rules apply, with a bundle from `notebook_intelligence/i18n.py`, again in a local named `trans`:
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from notebook_intelligence import i18n
|
|
237
|
+
|
|
238
|
+
trans = i18n.request_bundle(self) # in a REST handler
|
|
239
|
+
trans = i18n.response_bundle(response) # in chat code
|
|
240
|
+
trans.__("Skill '%1' not found in %2 scope", name, scope)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`scripts/i18n.py` refuses a `trans` call whose msgid is not a string literal (an f-string, a variable), or one made through an attribute (`self.trans.__`). Text returned to the model or an agent CLI, log messages and exception text stay English.
|
|
244
|
+
|
|
245
|
+
In Jest, `tests/ts/pseudo-translator.ts` provides a bundle that wraps every string in `[!! … !!]`. Bind it with `initTranslations(pseudoTranslator)`, or provide it to components through `TranslationContext`, to check that a string goes through `trans`.
|
|
246
|
+
|
|
247
|
+
### Updating catalogs
|
|
248
|
+
|
|
249
|
+
The tooling needs the `i18n` extra (`pip install -e ".[i18n]"`) and Node.js:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
jlpm i18n:extract # regenerate the .pot after changing strings
|
|
253
|
+
jlpm i18n:update # merge it into every .po
|
|
254
|
+
jlpm i18n:update -l ca_ES # start a new language
|
|
255
|
+
jlpm i18n:compile # build the .json bundles locally to try a catalog
|
|
256
|
+
jlpm i18n:check # what CI runs: fails when the .pot is out of date
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
To try a catalog, compile it, reinstall the package (`pip install -e .`) so the entry point is registered, install the matching JupyterLab language pack (for example `pip install jupyterlab-language-pack-de-DE`), and choose the language under **Settings → Language**. A string missing from a catalog falls back to English.
|
|
260
|
+
|
|
204
261
|
## Packaging
|
|
205
262
|
|
|
206
263
|
See [RELEASE.md](RELEASE.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.3.0a1
|
|
4
4
|
Summary: AI coding assistant for JupyterLab
|
|
5
5
|
Project-URL: Homepage, https://github.com/plmbr/notebook-intelligence
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/plmbr/notebook-intelligence/issues
|
|
@@ -695,15 +695,15 @@ 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<1,>=0.11.0
|
|
698
|
-
Requires-Dist: aiohttp>=3.14.
|
|
698
|
+
Requires-Dist: aiohttp>=3.14.4
|
|
699
699
|
Requires-Dist: anthropic>=0.22.1
|
|
700
700
|
Requires-Dist: claude-agent-sdk
|
|
701
701
|
Requires-Dist: cryptography>=50.0.0
|
|
702
702
|
Requires-Dist: fuzy-jon==0.1.0
|
|
703
703
|
Requires-Dist: ipykernel>=6.0
|
|
704
704
|
Requires-Dist: jupyter-server<3,>=2.21.0
|
|
705
|
-
Requires-Dist: litellm>=1.
|
|
706
|
-
Requires-Dist: mcp<2,>=1.
|
|
705
|
+
Requires-Dist: litellm>=1.96.2
|
|
706
|
+
Requires-Dist: mcp<2,>=1.30.0
|
|
707
707
|
Requires-Dist: mistune>=3.3.3
|
|
708
708
|
Requires-Dist: ollama
|
|
709
709
|
Requires-Dist: openai
|
|
@@ -715,8 +715,11 @@ Requires-Dist: sseclient-py
|
|
|
715
715
|
Requires-Dist: starlette>=1.3.1
|
|
716
716
|
Requires-Dist: tiktoken
|
|
717
717
|
Requires-Dist: tornado>=6.5.10
|
|
718
|
-
Requires-Dist: urllib3>=2.
|
|
718
|
+
Requires-Dist: urllib3>=2.8.0
|
|
719
|
+
Provides-Extra: i18n
|
|
720
|
+
Requires-Dist: jupyterlab-translate<2,>=1.3.7; extra == 'i18n'
|
|
719
721
|
Provides-Extra: test
|
|
722
|
+
Requires-Dist: polib>=1.2; extra == 'test'
|
|
720
723
|
Requires-Dist: psutil; extra == 'test'
|
|
721
724
|
Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
|
|
722
725
|
Requires-Dist: pytest<10,>=9.0.3; extra == 'test'
|
|
@@ -746,6 +749,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
746
749
|
- [Notebook toolbar generation](#notebook-toolbar-generation)
|
|
747
750
|
- [Multi-language and kernel-aware notebooks](#multi-language-and-kernel-aware-notebooks)
|
|
748
751
|
- [Reload open files when changed on disk](#reload-open-files-when-changed-on-disk)
|
|
752
|
+
- [Replies in your language](#replies-in-your-language)
|
|
749
753
|
- [Configuration](#configuration)
|
|
750
754
|
- [Configuration files](#configuration-files)
|
|
751
755
|
- [Remembering GitHub Copilot login](#remembering-github-copilot-login)
|
|
@@ -768,7 +772,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
768
772
|
|
|
769
773
|
- Python 3.10+
|
|
770
774
|
- JupyterLab 4.x
|
|
771
|
-
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode),
|
|
775
|
+
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for the preinstalled `codex-acp` adapter used by [ACP agent mode](#acp-agent-mode), and for MCP servers that launch via `npx`. ACP mode requires a preinstalled adapter in a trusted location; NBI does not download it at startup.
|
|
772
776
|
- A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
|
|
773
777
|
|
|
774
778
|
## Quick start
|
|
@@ -889,7 +893,7 @@ A Chatbook is a notebook whose cells can be written in English. Running a prompt
|
|
|
889
893
|
|
|
890
894
|
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
895
|
|
|
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,
|
|
896
|
+
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, a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts, and an existing notebook converts to a Chatbook. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
893
897
|
|
|
894
898
|
### Code generation with inline chat
|
|
895
899
|
|
|
@@ -937,6 +941,10 @@ When the agent needs a notebook in a language the current context has not establ
|
|
|
937
941
|
|
|
938
942
|
NBI reloads open document tabs when their files change on disk, so edits an AI agent makes via its Read/Write tools appear in the editor without a manual refresh. Tabs with unsaved local edits are skipped so user work is never clobbered. Toggle via the **NBI Settings dialog → External changes → "Refresh open files when changed on disk"** (default on).
|
|
939
943
|
|
|
944
|
+
### Replies in your language
|
|
945
|
+
|
|
946
|
+
When JupyterLab is set to another language through a language pack, turn on **NBI Settings dialog → Language → "Reply in my JupyterLab language"** (default off) to have the AI write its chat replies and Chatbook cell descriptions in that language, in every chat mode (the configured provider, Claude, and ACP agents). Code, identifiers, file names and file contents are left as they are. The language is sent to the model by the English name of its JupyterLab language pack ("German (Germany)"), and while JupyterLab is in English, or the setting is off, prompts are unchanged. In Claude and ACP mode the instruction goes with each message rather than a slash command, and a conversation keeps following it after the setting is turned off until you start a new chat.
|
|
947
|
+
|
|
940
948
|
## Configuration
|
|
941
949
|
|
|
942
950
|
Configure your provider, model, and API key from NBI Settings — the gear icon in the chat panel, the `/settings` chat command, or the JupyterLab command palette. For background, see the [provider blog post](https://nbi.plmbr.dev/blog/archive/support-for-any-llm-provider/).
|
|
@@ -1017,7 +1025,9 @@ Per-user preferences (default on for the cell-output features) live in `config.j
|
|
|
1017
1025
|
|
|
1018
1026
|
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.
|
|
1019
1027
|
|
|
1020
|
-
`NBI_ACP_AGENT_COMMAND` (not a settings lock)
|
|
1028
|
+
`NBI_ACP_AGENT_COMMAND` (not a settings lock) selects an installed adapter by absolute executable path, for example `/opt/nbi/acp/bin/codex-acp`; the value is shell-split, so quote paths containing spaces. Point it at the installed adapter itself, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper: making a package runner's path absolute does not prevent it from selecting code from a project. For Codex, the adapter must honor the `-c` approval and sandbox options NBI appends. An override is an administrator trust decision covering the command, its runtime and packages, inherited `PATH`, and their parent directories.
|
|
1029
|
+
|
|
1030
|
+
Leave the override unset to discover a preinstalled `codex-acp` in an absolute server `PATH` directory outside the Jupyter workspace. Empty or whitespace-only values are errors; use `unset NBI_ACP_AGENT_COMMAND` in a POSIX shell to restore default discovery. NBI follows symlinks before launching it; installations using a shim that depends on the name `codex-acp` need an explicit absolute path to that trusted shim. Default startup removes workspace directories from the `PATH` inherited by the agent and its commands, which can exclude a project's `.venv/bin`; an explicit override retains the full server `PATH`. Install the tested `@zed-industries/codex-acp@0.16.0` and maintain that version yourself: NBI does not verify or update versions for either discovery method. See the [adapter installation and migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378) for a concrete install command, home-directory workspace layouts, and the explicit adapter-path requirement for Windows with Python 3.10 or 3.11.
|
|
1021
1031
|
|
|
1022
1032
|
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).
|
|
1023
1033
|
|
|
@@ -1195,7 +1205,7 @@ c.NotebookIntelligence.enable_chat_feedback_always_visible = True
|
|
|
1195
1205
|
|
|
1196
1206
|
NBI Settings opens on a **Status** card that answers one question: is this deployment configured to work, and if not, which specific piece is missing? Each check reports `ok`, `warn`, or `blocked`, and anything that is not `ok` carries the next action rather than just the failure ("the claude CLI was not found" plus "install it, or set `NBI_CLAUDE_CLI_PATH` and restart").
|
|
1197
1207
|
|
|
1198
|
-
It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves,
|
|
1208
|
+
It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, checks the Claude CLI with `--version`, and checks ACP's adapter executable without running it. Both agent modes also check whether credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
|
|
1199
1209
|
|
|
1200
1210
|
**Test the endpoint** sends one short request to your configured model, after asking first. It is the only way to catch two failures nothing cheaper can see: a gateway that returns 200s but buffers instead of streaming, and a proxy that strips the `tools` field so agent mode silently never calls a tool. No model output is kept, so the result is safe to paste into a support ticket.
|
|
1201
1211
|
|
|
@@ -1230,10 +1240,11 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1230
1240
|
- [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
|
|
1231
1241
|
- [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
|
|
1232
1242
|
- [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
|
|
1233
|
-
- [`docs/chatbook.md`](docs/chatbook.md)
|
|
1243
|
+
- [`docs/chatbook.md`](docs/chatbook.md): writing Chatbook cells, execution modes, conversion and export, and why there is no per-cell sandbox.
|
|
1234
1244
|
- [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
|
|
1235
1245
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
|
|
1236
1246
|
- [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
|
|
1247
|
+
- [`docs/translating.md`](docs/translating.md): using NBI in your language, and fixing or adding a translation.
|
|
1237
1248
|
- [`PRIVACY.md`](PRIVACY.md) — what NBI sends to which provider, and the egress allowlist.
|
|
1238
1249
|
- [`SECURITY.md`](SECURITY.md) — how to report a vulnerability.
|
|
1239
1250
|
- [`CHANGELOG.md`](CHANGELOG.md) — release history.
|
|
@@ -1248,7 +1259,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
1248
1259
|
|
|
1249
1260
|
## Roadmap
|
|
1250
1261
|
|
|
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
|
|
1262
|
+
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 marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed. Deployments using the experimental ACP mode must now preinstall its adapter; see the [migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note-1) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
|
|
1252
1263
|
|
|
1253
1264
|
## License
|
|
1254
1265
|
|
|
@@ -29,19 +29,19 @@ If your cells contain sensitive outputs (PHI, PII, secrets), clear them before i
|
|
|
29
29
|
|
|
30
30
|
Hosts NBI may contact, depending on which features are enabled:
|
|
31
31
|
|
|
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
|
|
43
|
-
|
|
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.
|
|
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` |
|
|
43
|
+
|
|
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. ACP uses a preinstalled adapter; NBI does not fetch it from npm at startup. 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.
|
|
45
45
|
|
|
46
46
|
For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](docs/admin-guide.md#air-gap-deployment).
|
|
47
47
|
|
|
@@ -21,6 +21,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
21
21
|
- [Notebook toolbar generation](#notebook-toolbar-generation)
|
|
22
22
|
- [Multi-language and kernel-aware notebooks](#multi-language-and-kernel-aware-notebooks)
|
|
23
23
|
- [Reload open files when changed on disk](#reload-open-files-when-changed-on-disk)
|
|
24
|
+
- [Replies in your language](#replies-in-your-language)
|
|
24
25
|
- [Configuration](#configuration)
|
|
25
26
|
- [Configuration files](#configuration-files)
|
|
26
27
|
- [Remembering GitHub Copilot login](#remembering-github-copilot-login)
|
|
@@ -43,7 +44,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
43
44
|
|
|
44
45
|
- Python 3.10+
|
|
45
46
|
- JupyterLab 4.x
|
|
46
|
-
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode),
|
|
47
|
+
- Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for the preinstalled `codex-acp` adapter used by [ACP agent mode](#acp-agent-mode), and for MCP servers that launch via `npx`. ACP mode requires a preinstalled adapter in a trusted location; NBI does not download it at startup.
|
|
47
48
|
- A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
|
|
48
49
|
|
|
49
50
|
## Quick start
|
|
@@ -164,7 +165,7 @@ A Chatbook is a notebook whose cells can be written in English. Running a prompt
|
|
|
164
165
|
|
|
165
166
|
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
|
|
|
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,
|
|
168
|
+
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, a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts, and an existing notebook converts to a Chatbook. See [`docs/chatbook.md`](docs/chatbook.md).
|
|
168
169
|
|
|
169
170
|
### Code generation with inline chat
|
|
170
171
|
|
|
@@ -212,6 +213,10 @@ When the agent needs a notebook in a language the current context has not establ
|
|
|
212
213
|
|
|
213
214
|
NBI reloads open document tabs when their files change on disk, so edits an AI agent makes via its Read/Write tools appear in the editor without a manual refresh. Tabs with unsaved local edits are skipped so user work is never clobbered. Toggle via the **NBI Settings dialog → External changes → "Refresh open files when changed on disk"** (default on).
|
|
214
215
|
|
|
216
|
+
### Replies in your language
|
|
217
|
+
|
|
218
|
+
When JupyterLab is set to another language through a language pack, turn on **NBI Settings dialog → Language → "Reply in my JupyterLab language"** (default off) to have the AI write its chat replies and Chatbook cell descriptions in that language, in every chat mode (the configured provider, Claude, and ACP agents). Code, identifiers, file names and file contents are left as they are. The language is sent to the model by the English name of its JupyterLab language pack ("German (Germany)"), and while JupyterLab is in English, or the setting is off, prompts are unchanged. In Claude and ACP mode the instruction goes with each message rather than a slash command, and a conversation keeps following it after the setting is turned off until you start a new chat.
|
|
219
|
+
|
|
215
220
|
## Configuration
|
|
216
221
|
|
|
217
222
|
Configure your provider, model, and API key from NBI Settings — the gear icon in the chat panel, the `/settings` chat command, or the JupyterLab command palette. For background, see the [provider blog post](https://nbi.plmbr.dev/blog/archive/support-for-any-llm-provider/).
|
|
@@ -292,7 +297,9 @@ Per-user preferences (default on for the cell-output features) live in `config.j
|
|
|
292
297
|
|
|
293
298
|
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.
|
|
294
299
|
|
|
295
|
-
`NBI_ACP_AGENT_COMMAND` (not a settings lock)
|
|
300
|
+
`NBI_ACP_AGENT_COMMAND` (not a settings lock) selects an installed adapter by absolute executable path, for example `/opt/nbi/acp/bin/codex-acp`; the value is shell-split, so quote paths containing spaces. Point it at the installed adapter itself, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper: making a package runner's path absolute does not prevent it from selecting code from a project. For Codex, the adapter must honor the `-c` approval and sandbox options NBI appends. An override is an administrator trust decision covering the command, its runtime and packages, inherited `PATH`, and their parent directories.
|
|
301
|
+
|
|
302
|
+
Leave the override unset to discover a preinstalled `codex-acp` in an absolute server `PATH` directory outside the Jupyter workspace. Empty or whitespace-only values are errors; use `unset NBI_ACP_AGENT_COMMAND` in a POSIX shell to restore default discovery. NBI follows symlinks before launching it; installations using a shim that depends on the name `codex-acp` need an explicit absolute path to that trusted shim. Default startup removes workspace directories from the `PATH` inherited by the agent and its commands, which can exclude a project's `.venv/bin`; an explicit override retains the full server `PATH`. Install the tested `@zed-industries/codex-acp@0.16.0` and maintain that version yourself: NBI does not verify or update versions for either discovery method. See the [adapter installation and migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378) for a concrete install command, home-directory workspace layouts, and the explicit adapter-path requirement for Windows with Python 3.10 or 3.11.
|
|
296
303
|
|
|
297
304
|
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).
|
|
298
305
|
|
|
@@ -470,7 +477,7 @@ c.NotebookIntelligence.enable_chat_feedback_always_visible = True
|
|
|
470
477
|
|
|
471
478
|
NBI Settings opens on a **Status** card that answers one question: is this deployment configured to work, and if not, which specific piece is missing? Each check reports `ok`, `warn`, or `blocked`, and anything that is not `ok` carries the next action rather than just the failure ("the claude CLI was not found" plus "install it, or set `NBI_CLAUDE_CLI_PATH` and restart").
|
|
472
479
|
|
|
473
|
-
It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves,
|
|
480
|
+
It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, checks the Claude CLI with `--version`, and checks ACP's adapter executable without running it. Both agent modes also check whether credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
|
|
474
481
|
|
|
475
482
|
**Test the endpoint** sends one short request to your configured model, after asking first. It is the only way to catch two failures nothing cheaper can see: a gateway that returns 200s but buffers instead of streaming, and a proxy that strips the `tools` field so agent mode silently never calls a tool. No model output is kept, so the result is safe to paste into a support ticket.
|
|
476
483
|
|
|
@@ -505,10 +512,11 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
505
512
|
- [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
|
|
506
513
|
- [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
|
|
507
514
|
- [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
|
|
508
|
-
- [`docs/chatbook.md`](docs/chatbook.md)
|
|
515
|
+
- [`docs/chatbook.md`](docs/chatbook.md): writing Chatbook cells, execution modes, conversion and export, and why there is no per-cell sandbox.
|
|
509
516
|
- [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
|
|
510
517
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
|
|
511
518
|
- [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
|
|
519
|
+
- [`docs/translating.md`](docs/translating.md): using NBI in your language, and fixing or adding a translation.
|
|
512
520
|
- [`PRIVACY.md`](PRIVACY.md) — what NBI sends to which provider, and the egress allowlist.
|
|
513
521
|
- [`SECURITY.md`](SECURITY.md) — how to report a vulnerability.
|
|
514
522
|
- [`CHANGELOG.md`](CHANGELOG.md) — release history.
|
|
@@ -523,7 +531,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
|
|
|
523
531
|
|
|
524
532
|
## Roadmap
|
|
525
533
|
|
|
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
|
|
534
|
+
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 marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed. Deployments using the experimental ACP mode must now preinstall its adapter; see the [migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note-1) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
|
|
527
535
|
|
|
528
536
|
## License
|
|
529
537
|
|
|
@@ -10,7 +10,7 @@ For the admin side of this feature (the two policies, the approval posture NBI p
|
|
|
10
10
|
|
|
11
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
12
|
|
|
13
|
-
With the tab visible, pick the agent type, then set the chat model, API key, and base URL.
|
|
13
|
+
With the tab visible, pick the agent type, then set the chat model, API key, and base URL. An administrator must first install the tested `@zed-industries/codex-acp@0.16.0` in a trusted location outside the Jupyter workspace. NBI finds its `codex-acp` executable through absolute directories on the server's `PATH`, or uses an absolute path to the installed adapter configured through `NBI_ACP_AGENT_COMMAND`. Do not use package runners such as `npx`, `npm exec`, `pnpm dlx`, or `bunx`, or an `env` wrapper, for that override. NBI does not download an adapter at startup or verify its version; the administrator maintains the installation. Settings → Status reports a missing or invalid adapter command or declared script interpreter. See the [installation and migration guidance](admin-guide.md#gating-the-experimental-acp-agent-378), including a concrete install command, home-directory workspace layouts, and the requirements for shims and Windows with Python 3.10 or 3.11. Empty or whitespace-only `NBI_ACP_AGENT_COMMAND` values are invalid; unset the variable to restore default discovery.
|
|
14
14
|
|
|
15
15
|
## What a turn looks like
|
|
16
16
|
|
|
@@ -22,7 +22,8 @@ Previous sessions are listed by the history control, and picking one resumes it
|
|
|
22
22
|
|
|
23
23
|
## Limits worth knowing
|
|
24
24
|
|
|
25
|
-
- **
|
|
25
|
+
- **Agent commands use a filtered `PATH` by default.** Workspace directories, including a project's `.venv/bin`, are removed. Commands such as `python` or `pytest` may therefore select another installation or be unavailable. An administrator's explicit adapter override retains the full server `PATH` and requires trusting its contents.
|
|
26
|
+
- **Startup is bounded.** An agent has 60 seconds to spawn, initialize, authenticate, and create a session. If this takes too long, the failure reads `ACP agent did not start in time`. Check the adapter installation and authentication before retrying.
|
|
26
27
|
- **A turn is capped at 30 minutes**, after which it fails with an agent response timeout.
|
|
27
28
|
- **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
29
|
- **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.
|